2009-12-17 15 views
10

Znam punkty końcowe odcinka linii i odległość/rozmiar prostopadłych końcówek, które chciałbym utworzyć, ale muszę obliczyć końcowe punkty prostej prostopadłej. Waliłem głową o ścianę za pomocą trójkątów 45-45-90 i produktów z kropek, ale po prostu nie mogę się z tym pogodzić.Jak obliczyć punkty końcowe prostopadłych odcinków linii?

Znam punkty na niebiesko i odległość do punktów na czerwono, muszę znaleźć punkty na czerwono.

Przed oznaczeniem jako duplikat, wypróbowałem odpowiedź zamieszczoną pod numerem this question, ale w rezultacie pojawiły się końcówki, które zawsze były pionowe.

http://rauros.net/files/caps.png http://rauros.net/files/caps.png

+0

Zależałoby od punktu na znanej linii, na której chcesz, aby linia prostopadła do niego również. Twój przykładowy diagram zdaje się pokazywać, że są w środkowym punkcie znanych linii. – ZombieSheep

+0

tak, są przecinane w punkcie środkowym czerwonej linii – basszero

+0

Powiązane: [Oblicz prostopadłe przesunięcie od linii ukośnej] (http://stackoverflow.com/q/17195055/183120). – legends2k

Odpowiedz

16

Jeśli B1 jest niebieski punkt między 2 punkty czerwone i B2 jest inny Blue Point to sposób, aby to zrobić, to:

  • Find B1 - B2
  • Normalizacja ten wektor
  • następnie waga tego wektora przez połowę odległości pomiędzy czerwone punkty
  • obrócone o 90 stopni
  • Dodaj wektora B1 (to jest R1)
  • Su odejmij ten wektor od B1 (to jest R2)

Wszystkie powyższe są dość proste - najtrudniejszym zadaniem byłoby zastanowienie się, jak napisać tekst w tekście!

Może to być pomocne chociaż - matryca obraca się o 90 stopni:

[ 0 -1 ] 
[ 1 0 ] 
+0

Proste wyjaśnienie angielskiego wektora jest dokładnie tym, czego potrzebowałem połóż kawałki razem w mojej głowie. Dzięki! Szkoda, że ​​nie udało ci się zdobyć wielu upiorów – basszero

3

Wiesz nachylenie linii niebieskiej, nazwijmy to m. I linia prostopadła do niebieskiej linii będzie miała nachylenie -1/m.

aby znaleźć współrzędną x potrzebujesz trig, sine \theta = d/delta_x, gdzie \ theta jest kątem niebieskiej linii dla osi x, a d jest odległością do jednego z czerwonych punktów od niebieskiego punktu. Następnie dodaj/odejmij delta_x do współrzędnej x niebieskiego punktu, do którego linia ma być prostopadła. Teraz możesz użyć wzoru nachylenia punktu, aby obliczyć współrzędną y.

+0

Musisz jednak rozwiązać układ równań obejmujących odległość, aby przekształcić kształt skarpy w segment linii. Miałem nadzieję, że rozwiązane rozwiązanie systemowe – basszero

+0

Tak, przegapiłem krok, musisz najpierw znaleźć współrzędną x formuły punktowej, w której pojawia się trig. – nlucaroni

8

Prosty sposób wokół tej jednej nie oznacza, że ​​w zakresie nachylenia m, ale raczej na zmianę w x i y, które Wzywam dx, dy (z notacji rachunku). Powód jest po pierwsze, że zajmowanie się nachyleniem linii pionowej jest nieskończone iw żadnym wypadku nie trzeba używać funkcji trygonometrycznych, kod ten będzie szybszy i prostszy.

dx = x2 - x1; 
dy = y2 - y1; 

Zakładam, że punkt 2 jest przecięciem żądanej linii.

Ok, więc linia prostopadła ma nachylenie z ujemnym odwrotnością pierwszego. Istnieją dwa sposoby, aby to zrobić:

dx2 = -dy 
dy2 = dx 

lub

dx2 = dy 
dy2 = -dx 

odpowiada obu kierunkach, jeden skręca w prawo, a drugi zostawiony.

Jednak dx i dy są skalowane do długości pierwotnego segmentu linii. Twoja prostopadła ma inną długość.

Oto odległość między dwoma punktami:

double length(double x1, double y1, double x2, double y2) { 
return sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); 
} 

Rób, co chcesz, aby przejść do jednej lub drugiej stronie, to:

double scale = length(whatever length you want to go)/sqrt(dx*dx+dy*dy); 
double dx2 = -dy * scale; 
double dy2 = dx * scale 

a następnie takie samo dla drugiej strony . Po prostu zdałem sobie sprawę, mój przykład jest nieco C++, ponieważ użyłem sqrt, ale różnice są trywialne. Zauważ, że możesz napisać kod bardziej efektywnie, łącząc pierwiastki kwadratowe.

Powiązane problemy