2010-11-05 20 views
9

Spędziłem tyle godzin na tym, że czuję, że moje zdrowie psychiczne powoli zsuwa się. Tak więc każda pomoc będzie naprawdę doceniona. Postaram się być tak zwięzły, jak to możliwe.Jak obliczyć (x, y) dla stałej długości łuku z dala od punktu na obwodzie

Mam okrąg na płaszczyźnie 2D. Znam współrzędne kartezjańskie punktu centralnego (C) i promienia (R).

Moje zamieszanie wynika z tego problemu. Dostarczony z punktem na płaszczyźnie poza kołem; Potrafię obliczyć punkt (P) na obwodzie koła najbliżej tego punktu.

Co chcę zrobić, to określić współrzędne (x, y) 2 punktów na obwodzie. Nazwijmy je P1 i P2. P1 i P2 są dwoma końcami łuku. Łuk ma ustaloną długość (X). P jest pośrednim punktem pomiędzy P1 i P2. Jako takie, długość łuku od P do P1 & P do P2 jest zarówno X/2.

W skrócie: podane C, R, P, X; Muszę obliczyć P1 i P2.

Próbuję kodować to w języku C++, ale wszelkie sugestie lub pseudo-kod byłoby świetne.

EDIT: X jest długość łuku, a nie linia prosta pomiędzy P1 i P2

+19

Co z niektórymi przykładami: http://www.codeproject.com/KB/recipes/Wykobi.aspx Są bardzo wydajne i nieco eleganckie, szukają "Najbliższych punktów na okręgu z zewnętrznych punktów" i "Okrągłych odcinków linii stycznej" –

Odpowiedz

4

na okręgu, kąt theta odpowiada na długość łuku theta * R, czyli swój łuk będzie naprzeciwko pod kątem theta = X/R. Jeśli więc zacząć od punktu

P = C + R * (sin(u), cos(u)) 

potem po prostu iść w górę/w dół przez theta/2:

P1 = C + R * (sin(u + theta/2), cos(u + theta/2)) 

i

P2 = C + R * (sin(u - theta/2), cos(u - theta/2)) 
3

łuku, który leży naprzeciwko kąta θ (w radianach) ma długość łuku θR. Tak więc, potrzebujesz pół-kąta θ = X/(2R). Następnie musisz wziąć wektor (P-C), obrócić go o kąty ± θ i dodać ponownie C, aby uzyskać P1 i P2. Aby obrócić wektor o kąt, pomnóż go przez rotation matrix.

Więc w Pseudokod, to będzie wyglądać następująco:

θ = X/(2R) 
A = 2x2 rotation matrix corresponding to a rotation by θ radians 
A' = transpose of A 
P1 = C + A * (P - C) 
P2 = C - A' * (P - C) 
0

Jest kilka rzeczy, które mogą pomóc. Nie napiszę kodu, ale wyobrażam sobie, że rozwiązanie będzie oparte na trójkątach. Rozważ:

Dowolny promień ma tę samą długość.

Tak więc trójkąt narysowany z P1-P1-C jest równoramienny.

Dowolna styczna jest prostopadła do promienia.

Byłbym trudny do udowodnienia tego tutaj i teraz, ale jeśli rozszerzysz linie od C do P1/P2 do stycznej, która przecina okrąg w C-> P, również tworzymy równoramienicę.

Powinien być łatwy do wykrycia.

Powiązane problemy