[mat] punkt przecięcia sie 2 prostych

0

Witam. Mam oto taki problem:
Mamy punkty:

  • P1=(x1,y1,z1);
  • P2=(x2,y2,z2);
    i przez te punkty prowadzimy prostą. I teraz mamy punkt trzeci:
  • P3=(x3,y,z3);

No i moje pytanie: Jak wyliczyć punkt przecięcia sie prostej, przeprowadzonej przez P1 i P2, z prostą prostopadła do niej i przechodzącą przez punkt P3.
Za wszelkie podpowiedzi/odpowiedzi z góry dzięki :)

0

Robisz coś takiego: Na podstawie dwóch pierwszych punktów wyliczasz równianie tej prostej. Rozwiązujesz układ równań z niewiadomymi a i b ułożonych w/g schematu: y=ax+b, gdzie x i y to współrzędne każdego punktu. Następnie uzyskujesz współczynnik kierynkowy drugiej prostej a2=-(1/a). Do równiania y=a2x+b2 podstawiasz współrzędne trzeciego punktu pod x i y i otrzymujesz b - ostatnią niewiadomą w równianiu prostej.

0

Jakbyś nie zauważył, to tutaj chodzi o 3D, a nie 2D [glowa]

0

dzięki Adam za chęci ale mi to właśnie chodzi o 3D :( albo może ktoś wie jak w ogóle wygląda ogólne równanie prostej w przestrzeni 3D ... ?
Pozdr.

0

Ogólne wygląda tak:

(x - xa)/(xa - xb) = (y - ya)/(ya - yb) = (z - za)/(za - zb)

0

Ups, sorki, nie zauważyłem [wstyd] . Ale myślę, że powinno się to dać zrobić trochę analogicznie, ale nie operowałem zabardzo w 3D... Coś pomyślę, jak wpadnę jak to zrobić, to napiszę...

0

inną metodą możesz zrobić tak: rozwiązujesz układ czterech równań z czterema niewiadomymi: wzór prostej jest dany parametrycznie, tzn.: x(t), y(t) i z(t). robisz założenie, że np.: prosta nie jest prostopadła do którejś z osi, np.: do osi z, wtedy robisz podstawienie z=t, x = at + b i y = xt + d. za x,y,z podstawiasz współrzędne punktów i robią Ci się cztery równania, z których wyliczasz a,b,c i d. mając te współczynniki możesz sobie parametrycznie rysować prostą przchodzącą przez te punkty.
prostopadłość:
rzutujesz sobie układ współrzędnych 3D na układ 2D, czyli raz zapominasz o wymiarze y, a raz x; wtedy wychodzi układ dwóch równań:
/ (z = t)
| x = (-1/a)*t + B
\ y = (-1/c)*t + D

współczynniki B i D wyznaczasz po wstawieniu za x,y,z współrzędnych trzeciego punktu.
musisz jeszcze sprawdzić, czy nie dzielisz przez zero (zerowe a/c oznacza prostopadłość do osi x/y). wtedy liczy się trochę inaczej, ale już nie chce mi się pisać.
i już. ;p

0

Zauważ, że jak masz ju.sz te równanie prostej to tak naprawdę szukasz najbliższego punktu (tej prostej) do tego trzeciego.

A ogólnie rzecz biorąc:

p1=[p11 p12 p13 p14 ... p1n]
p2=[p21 p22 p23 p24 ... p2n]

//dlaczego mamy się ograniczać do 3D ;P

Równanie prostej jest postaci:

(p1-p2)*t+p1

//Oczywiście t jest parametrem

Masz tesz punkt p3:

p3=[p31 p32 p33 p34 ... p3n]

Teraz musisz znaleźć takie t, by odległość była minimalna:

d(t)=|(p1-p2)*t+p1-p3|

Jeżeli używasz metryki Euklidesowej to:

d(t)=(sum(((p1-p2)*t+p1-p3).^2))^(1/2)

// UWAGA:
v.^x Oznacza podniesienie każdego elementu wektora v do potęgi x indywidualnie.
sum(v)=r jest funkcją sumującą wszystkie elementy wektora v (zwraca liczbę r - ich sumę)

Oczywiście odległości są zawsze dodatnie więc możemy minimalizować kwadrat odległości d2(t) (bo tak jest prościej :d ):

d2(t)=d(t)^2=sum(((p1-p2)*t+p1-p3).^2)

Więc liczymy pochodną:

d2'(t)=sum(2*t*((p1-p2).^2)+2*(p1-p2).*(p1-p3))

//UWAGA:
v.*w - oznacza mnożenie odpowiednich elementów v i w indywidualnie

I znajdujemy t dla którego d2'(t)==0 (wystarczy rozwiązać proste równanko). Obliczone t podstawiamy do równania prostej:

p4=(p1-p2)*t+p1

//p4 jest szukamym punktem

Nie jestem tylko pewny :/ czy to się nie posypie gdy punkty p1 p2 p3 będą współliniowe, ale to przecież można łatwo sprawdzić (chociażby z nierówności trujkonta) przed rozpoczęciem rozwiązywania :>

  • już pisze się przez "ż" - Ł * << gdybym chciał napisać <font color="red">"już"</span> to chyba bym napisał :> - <font color="darkblue">Sebo</span>

<font size="4">---==< 'ort!' są bez sensu >==---</span>
np ten kod przecież jest poprawny:

function <ort>jusz</ort> = <ort>pentle(konec,urzyte);</ort>
for <ort>kture</ort> = 1:konec;
<ort>jusz</ort> = sum(ktore:<ort>urzyte);</ort>
end;

A niech mi ktos bez zagladania powie o <co?> tu chodzi :>

0

Dzięki Sebo za pomysł ale już to wczoraj rozwiązałem i ale nie miałem neta żeby tu napisać :) w sumie to nie rozwiązałem ale mi rozwiązali :)
<jakby kogoś to interesowało :) > :

  type Tpoint3D=record x:single; y:single; z:single; end;
{*******************************************************************}
function Licz_Vector(P1,P2:TPoint3D;P3:Tpoint3D):TPoint3D;
var
  vp12, vp4: TPoint3D;
  dlug, skal: single;
begin
  // Vektor p1-p2
  vp12.x:=p2.x-p1.x;
  vp12.y:=p2.y-p1.y;
  vp12.z:=p2.z-p1.z;
  dlug:=sqrt(sqr(vp12.x)+sqr(vp12.y)+sqr(vp12.z));
  // Normalizacja <wektor jednostkowy>
  vp12.x:=vp12.x/dlug;
  vp12.y:=vp12.y/dlug;
  vp12.z:=vp12.z/dlug;
  // Iloczyn skalarny
  skal:=vp12.x*p3.x+vp12.y*p3.y+vp12.z*p3.z;
  vp4.x:=vp12.x*skal;
  vp4.y:=vp12.y*skal;
  vp4.z:=vp12.z*skal;
  // qniec :P
  result.x:=p1.x+vp4.x;
  result.y:=p1.y+vp4.y;
  result.z:=p1.z+vp4.z;
end;

Ale tak czy siak dzięki za pomoc ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1