2009-02-03 8 views
5

Jak mogę znaleźć liczbę kątów wewnętrznych wielokąta, większą niż 180º, mającymi tylko wierzchołki wielokąta?Znaleźć liczbę kątów wewnętrznych wielokąta, większą niż 180º

Dla każdego wierzchołka chcę zawsze kąt wewnętrzny, a nie zewnętrzny.

Dziękuję z Brazylii.

+0

Nie można definiować wielokąta jedynie za pomocą wierzchołków. Ty też możesz określać boki. –

+0

Mam wierzchołek w porządku, więc nie potrzebuję boków. – lucasbls1

+0

Wierzchołki definiują punkty, które byłyby połączone (boki) w celu nadania wielokątu. – Swinders

Odpowiedz

4

Możesz określić kąt dwóch wektorów, po prostu pobierając produkt skalarny (produkt kropkowany).Użyteczną właściwością jest to, że jeśli wektory są ortogonalne, ich iloczyn skalarny wynosi zero; jeśli ich kąt jest rozwarty, produkt jest ujemny, w przeciwnym razie dodatni. Tak, kroki podjąć to:

  • znaleźć pierwszą krawędź z V0 V1 (jako wektor, można uzyskać to poprzez odjęcie współrzędne), następnie obrócić go o 90 stopni w lewo (jest to po prostu przekształcenie (x y) do (-y x))
  • znaleźć drugą krawędź od V1 do V2 (nie obraca się)
  • wziąć produkt skalarne (to tylko (x1 * x2) + (y1 * y2))
  • jeżeli iloczyn skalarny jest ujemny, to jest skręt w prawo, w przeciwnym razie skręt w lewo
  • następna krawędź ...
  • jeśli przejdziesz przez wierzchołki przeciwnie do ruchu wskazówek zegara, policz liczbę prawych nawrotów, w przeciwnym razie liczba lewych zwojów
  • dla ostatniego wierzchołka, musisz wrócić do pierwszego (tj. wykorzystywać krawędzie VN do V0 i V0 V1)

zmienił: Można znaleźć czy wierzchołki są uporządkowane w lewo lub w prawo, stosując następujący wzór do obliczania powierzchni wielokąta za:

 
    1 n-1 
A = --- SUM(x(i)*y(i+1) - x(i+1)*y(i)) 
    2 i=0 

gdzie n jest liczbą wierzchołków. x(n) i y(n) są takie same, jak x(0) i y(0) (aby zamknąć wielokąt).

Jeśli jest dodatnia, to wierzchołki są porządkowane w kierunku przeciwnym do ruchu wskazówek zegara, w przeciwnym razie zgodnie z ruchem wskazówek zegara.

edit: Kiedy uprościć etapy obrotu oraz iloczynem skalarnym, po przybyciu na wzorze na dwuwymiarowym produktu krzyż, x1*y2 - x2*y1. Upraszcza to powyższe pierwsze etapy:

  • znaleźć pierwszą krawędź z V0, V1 (jako wektor, odejmując współrzędnych)
  • dito do drugiej krawędzi V1 V2
  • się produkt poprzeczny ((x1 * y2) - (x2 * y1))
  • jeśli produkt krzyż jest pozytywna, to jest skręt w lewo

Przepraszamy za pokrętny pierwszym podejściu.

+0

Czy możesz zdefiniować produkt skalarny? –

+0

Prawdopodobnie produkt kropkowany. O wiele łatwiej jest używać produktu krzyżowego, ponieważ jest on dobrze zdefiniowany, zakładając, że znasz krętlik. – MSN

+0

Produkt skalarny: x1 * x2 + y1 * y2 = skalarny –

-1

To jest pytanie związane z geometrią, nie do końca związane z programowaniem.

Jeśli masz wierzchołki, możesz po prostu znaleźć wewnętrzne kąty przez trygonometrię, podobnie do tego, jak znaleźć kąty trójkąta.

Używając trzech sąsiednich wierzchołków, wyobraź sobie trójkąt i znajdź wewnętrzne kąty.

Na przykład, spójrz na wielokąta:

Polygon

Możemy skonstruować trójkąt jako:

Construct internal triangle

+0

Działa to tylko wtedy, gdy wielokąt jest całkowicie wypukły. – lucasbls1

0

Jestem zakładając, że jest to nieregularny wielokąt, ponieważ miałoby to Naprawdę trudno jest, aby zwykły wielokąt miał wewnętrzny kąt większy niż 180 stopni.

Dla każdego wierzchołka należy również znać dwa sąsiednie wierzchołki. Następnie można przekształcić to w problem trygonometrii, w którym znajduje się kąt od głównego wierzchołka do, powiedzmy, lewego wierzchołka, i dodać go do kąta od głównego wierzchołka do prawego wierzchołka.

Przykładowo

 
tan(angle_to_left) = (v.y-left.x)/(v.y-left.y) 
tan(angle_to_right) = (v.y-right.x)/(v.y-right.y) 

Następnie dodać kąty razem.

Na koniec, dla wszystkich kątów większych niż 180, zwiększ licznik. Po przejściu przez wszystkie wierzchołki, Twój licznik pokaże, ile wewnętrzne kąty są większe niż 180.

2
  1. Znajdź convex hull z wierzchołków.
  2. Zidentyfikuj wierzchołki, które nie są leżą na wypukłym kadłubie. Są to twoje kandydujące wierzchołki z> 180 zewnętrznymi kątami.
  3. Dla każdego takiego wierzchołka zbadaj dalej kąt (nie możesz teraz myśleć w żaden sposób, ale możesz to przedłużyć).
+0

W przypadku pojedynczych wierzchołków wyłączonych z wypukłego kadłuba kąt wnętrza wynosi> 180. Dla szeregu wierzchołków, rekursywnie badaj wypukły kadłub wielokąta utworzonego przez wykluczone wierzchołki i zawarte wierzchołki na każdym końcu szeregu. – user57368

+0

Ta odpowiedź ma odwrotność - najskuteczniejszy sposób znalezienia wypukłego kadłuba prostego wielokąta _ znajdujemy wklęsłe kąty wewnętrzne. – Svante

0

Problem ze styczną występuje, gdy x == 0. Jeśli znasz tylko wierzchołki wielokąta, nie wiesz wystarczająco dużo, chyba że jest to trójkąt, ponieważ mogą one mieć jakąkolwiek łączność.

Zakładając, że znasz łączność, musisz obliczyć kolejność uzwojenia (tj. W jakim kierunku obracają się punkty wokół wielokąta?). Dzięki porządkowi uzwojenia można następnie pobrać produkt krzyżowy każdego punktu z sąsiednimi punktami i przyjąć odwrotny sinus o wartości tego punktu, aby uzyskać kąt.

+0

Punkty są uporządkowane według kolejności połączeń. – lucasbls1

+0

MSN, dobry punkt. – Niyaz

0

Znalezienie wewnętrzny kąt dwa ostatnie wektory (jako przykład), trzeba realizować to równanie w ciągu ostatnich dwóch wektorów wielokąt

angleRadians = Math.acos ((VX1 * VX2 + VY1 * vy2)/(Math.sqrt (vx1 * vx1 + vy1 * vy1) * Math.sqrt (vx2 * vx2 + vy2 * vy2)));

to używa produktu Dot wektorów. Jeśli masz pytania na ten temat, here's a tutorial

Ale to nie bierze pod uwagę "kierunku nawijania", najpierw musisz dostać produkt krzyżowy, a jeśli produkt krzyżowy jest dodatni, to był skręt w lewo, jeśli negatywny -w prawo skręt (dla którego będziemy kompensować przez odjęcie (zew) kąta od 360.

Zawarłem tutaj mój kod JS, jako istotę: https://gist.github.com/3741816.

: D

Powiązane problemy