2011-07-08 12 views
5

To jest podstawowa geometria grafiki i/lub trygonometr, a ja jestem głupi, gdy o to pytam, ale nie pamiętam, jak to się dzieje. A więc:Znajdź linię przecinającą znaną linię pod kątem prostym, biorąc pod uwagę punkt

  1. Mam linię zdefiniowaną przez dwa punkty (x1, y1) i (x2, y2).
  2. Mam trzeci punkt (xp, yp), który leży gdzieś indziej.

Chcę obliczyć punkt (x ', y'), który leży gdzieś wzdłuż linii w punkcie #, tak, że po połączeniu z punktem z # 2, tworzy nową linię prostopadłą do pierwszej linii . enter image description here

Dzięki.

Odpowiedz

5

Można znaleźć ten punkt rozważając pierwszy ogólny punkt (x, y) wzdłuż linii od (x1, y1) do (x2, y2):

x = x1 + t*(x2 - x1) 
y = y1 + t*(y2 - y1) 

i obliczania (do kwadratu) odległość od tego punktu z (xp, yp)

E = (x - xp)**2 + (y - yp)**2 

, która zastępuje definicję x i y przez podanie

E = (x1 + t*(x2 - x1) - xp)**2 + 
    (y1 + t*(y2 - y1) - yp)**2 

następnie znaleźć minimum tej odległości różnym t możemy czerpać E względem t

dE/dt = 2*(x1 + t*(x2 - x1) - xp)*(x2 - x1) + 
     2*(y1 + t*(y2 - y1) - yp)*(y2 - y1) 

że po pewnym obliczenie daje

dE/dt = 2*((x1 - xp)*(x2 - x1) + (y1 - yp)*(y2 - y1) + 
      t*((x2 - x1)**2 + (y1 - y2)**2)) 

poszukuje kiedy ta pochodna jest równa zeru otrzymujemy jawne równanie dla t

t = ((xp - x1)*(x2 - x1) + (yp - y1)*(y2 - y1))/
    ((x2 - x1)**2 + (y2 - y1)**2) 

, więc końcowy punkt można obliczyć przy użyciu tej wartości dla t w definicji (x, y).

Korzystanie notacji wektorowej To jest dokładnie taka sama formuła zaproponowana przez Gareth ...

t = <p - p1, p2 - p1>/<p2 - p1, p2 - p1> 

gdzie zapis <a, b> reprezentuje operację iloczynu skalarnego ax*bx + ay*by.

Należy również zauważyć, że ta sama formuła działa w przestrzeni n-wymiarowej.

+0

Dzięki za to. Udzielenie ci zaakceptowanej odpowiedzi, ponieważ twoja jest jedyną, która bierze to, co wiem (kartezjańskie kohorty) i podaje mi faktyczną formułę, do której je podłączę. (Podoba mi się pomysł na wektor, ale to rodzi więcej pytań niż odpowiedzi z moją pamięcią geometrii). –

+0

To heroiczny wysiłek z @ 6502, ale ta odpowiedź pokazuje, dlaczego mam moją regułę na temat wektorów! –

+0

@gareth: Gdy mam do czynienia z problemem geometrycznym, zawsze myślę w wektorach (dlatego przejmowałem twoją odpowiedź), ale wiem, że większość programistów nie czuje się z nimi dobrze. – 6502

0

Można rozwiązać nachylenie linii łączącej (x1, y1) i (x2, y2). Wtedy wiadomo, że linia prostopadła ma ujemną odwrotność tego nachylenia.

Aby znaleźć osią y, użyj stoku, aby zobaczyć jak daleko linia podróżuje w y od x=0 do x1.

b + (x1 - x0) * m = y1 
b + (x1 - 0) * m = y1 
b + (x1 * m)  = y1 
b = y1 - x1 * m 

Następnie można uzyskać wzory na linii między dwoma punktami i linii od (xp, yp) z powyższym stoku. Dla danego x, mają one równe y, więc można rozwiązać dla tego x, a następnie podłączyć go do którejkolwiek z formuły dla y.

m = slope_from_1_to_2 = (y2 - y1)/(x2 - x1) 
n = slopePerpendicular = (-1)/m 

b = intercept_for_1_to_2 = y1 - x1 * m 
c = intercept_for_p  = yp - xp * n 

Zatem równanie dla przewodów mają postać y = mx + b

punkty 1 i 2:

y(x) = mx + b

punkt P:

y(x) = nx + c

ustawił jeszcze y jest równa znaleźć x '

mx' + b = nx' + c 
(m-n)x' = c - b 
    x' = (c - b)/(m - n) 

A zatem użyć formuły do ​​obliczenia y”

y' = mx' + b

+0

Dzięki. W równaniu 'y (x) = mx + y2' - dlaczego używasz' y2', aby zastąpić 'b'? –

+0

Dobra rada, "b" powinno być punktem przecięcia z osią Y, gdzie linia uderza w oś y. 'y2' niekoniecznie jest tak, pozwól mi przejrzeć moją matematykę. –

+1

Używanie formuły 'y = m * x + q' dla prawdziwego problemu dwuwymiarowego oznacza szukanie kłopotów. Nie można obsłużyć pionowych linii przy takim podejściu; lepiej używać równań parametrycznych 'x = x (t), y = y (t)' zamiast tego. – 6502

1

Linia odpowiedź brzmi:

y=ax+b 
where a=(x1-x2)/(y2-y1) 
     b=yp-(x1-x2)*xp/(y2-y1) 

Jak uzyskano wynik:

1) slope for the original line: (y2-y1)/(x2-x1) 

2) slope for the answer: -1/((y2-y1)/(x2-x1)) = (x1-x2)/(y2-y1) 

3) Plug this into (xp,yp) we can have the result line. 

Wystarczy obliczyć odpowiedź z linii po tym (to jest za długie ... Jestem głodny).

+0

To nie działa dla 'y1 = y2' (dzielenie przez zero). W rzeczywistości nie należy używać formuł opartych na "nachyleniu", gdy mamy do czynienia z prawdziwymi problemami dwuwymiarowymi. Formuła "y = mx + q" działa tylko ładnie, gdy mamy do czynienia z problemami o wymiarach 1,5-wymiarowych (tzn. Z wykresami 'y = y (x)'). – 6502

+0

@ 6502 Hmm. Dziękuję za uratowanie błędów w przyszłości, ponieważ nie zapomnę tego ponownie. –

5

Przydatną regułą w tego rodzaju geometrii obliczeniowej jest to, że powinieneś pracować z wektorami tak długo, jak możesz, przełączając się na współrzędne kartezjańskie tylko w ostateczności. Rozwiążmy to za pomocą algebry wektorowej.Załóżmy, że linia przechodzi od p do p + r, a innym punktem jest q.

Teraz każdy punkt na linii, w tym miejscu, w którym starają się znaleźć (nazywają to ów), może być wyrażona jako s = p + λ r dla skalarnego parametru Î.

teraz wektor z q do s musi być prostopadła do R. Dlatego

( P - (+ P λ R)) R · = 0

przypadku · jest dot product operator. Rozwinąć produkt:

(q - p) ° R = X (R · R)

i dzielą:

λ = (q - p) · r/r · r

Kiedy dojdziesz do jego realizacji, trzeba sprawdzić, czy r · r = 0, aby uniknąć dzielenia przez zero.

+0

Dzięki za oświecające myślenie w wektorach. –

Powiązane problemy