Discussion:
Punkt przeciecia prostej i trójkat a 3D
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Pawel A
2007-02-28 11:15:07 UTC
Permalink
pisze wlasnie program do rozwijania siatek bryl o nieregularnych przekrojach
(np. do rozwijania siatek kadlubów statków czy okretów) i stanalem przed
problemem z którym nie moge sie uporac :-/ moze grupowicze cos mi doradza...

siatka takiej bryly sklada sie z trójkatów...
i na przyklad mamy trójkat3D ABC gdzie:
(x - os pozioma, y - os pionowa, z - "glebokosc")

Ax=0, Ay=0, Az=0
Bx=0 , By=30, Bz=0
Cx=2, Cy=40, Cz=60

mamy tez prosta równolegla do osi X lezaca na y=20 i z=25.

w jaki sposób sprawdzic czy prosta przecina trójkat i obliczyc wspólrzedne
punktu przeciecia?
--
pozdrawiam
Pawel

ps. autora rozwiazania z checia umieszcze w okienku "O programie" :-)
Antek Laczkowski
2007-02-28 12:58:02 UTC
Permalink
Post by Pawel A
Ax=0, Ay=0, Az=0
Bx=0 , By=30, Bz=0
Cx=2, Cy=40, Cz=60
mamy tez prosta równolegla do osi X lezaca na y=20 i z=25.
w jaki sposób sprawdzic czy prosta przecina trójkat i obliczyc wspólrzedne
punktu przeciecia?
Jeżeli masz tylko proste równoległe do osi układu,
to obliczenia się upraszczają,
ale w ogólnym przypadku możesz zrobić np. tak:

1) Przedstawić prostą w postaci parametrycznej:
(x,y,z) = (x0,y0,z0) + t * (vx,vy,vz); gdzie:
(x0,y0,z0) - jakis punkt na prostej
(vx,vy,vz) - wektor równoległy do prostej, niekoniecznie jednostkowy
t - liczba rzeczywista
(x,y,z) - wsp. punktu na tej prostej.

Np. w przypadku jak wyżej:
(x,y,z) = (0,20,25) + t * (1,0,0) (*)

2) Przedstawić płaszczyznę w postaci parametrycznej:
(x,y,z) = (x1,y1,z1) + s1 * (ux,uy,uz) + s2 * (wx,wy,wz); gdzie
wektory u, w są różne i równoległe do płaszczyzny,
punkt (x1,y1,z1) leży na płaszczyźnie.

Np. w przypadku jak wyżej punkt to punkt A, wektory to AB i AC.
(x,y,z) = (0,0,0) + s1 * (0, 30, 0) + s2 * (2, 40, 60) (**)

Jeżeli prosta (*) przecina płaszczyznę (**) to przez porównanie
wartości (x,y,z) z obu równań dostajesz 3 równania na niewiadome
t, s1, s2; wystarczy wyznaczyć 't', wstawić do (*) i masz punkt
przecięcia.

Jest tu niuans numeryczny: Prosta może być "prawie" równoległa
do płaszczyzny. W takim przypadku istnieją liczby a,b takie, że:
a * u + b * w (prawie =) v; gdzie v,u,w - wektory jak wyżej. (***)

Teoretycznie można to sprawdzić licząc wyznacznik macierzy
złożonej z (v,u,w) i porównując go z zerem. Ale jest to "prawie".
W praktyce chyba szybciej wziąść 2 z równań (***), obliczyć a,b
i pokazać, że po podstawieniu do trzeciego dostaje się sprzeczność
w granicach jakiegoś błędu.

Gdy masz już wsp. punktu przecięcia to najpierw zrób tak:
Znajdź srodek trójkąta i promień opisanego na nim okręgu.
Wyznacz odległość punktu przecięcia od środka okręgu;
jeżeli jest większa, to prosta trójkąta nie przecina.

Jeżeli nie, to pozostaje sprawdzanie, po której stronie
prostych, wyznaczanych przez wierzchołki trójkąta leży punkt przecięcia,
a to już robi się tak, jak na płaszczyźnie, np badając znaki
iloczynów wektorowych AP x AB, AP x AC, etc, gdzie P - punkt przecięcia.
Albo obracając układ wsp tak, aby płaszczyzna leżała np na pł. X'Y'
i badając znak 'y' z r-nia prostej y = ax+b (to inne x,y,a,b niż wyżej).

Antek
Antek Laczkowski
2007-02-28 13:07:31 UTC
Permalink
Dnia 28-02-2007 o 13:58:02 Antek Laczkowski
Post by Antek Laczkowski
Jest tu niuans numeryczny: Prosta może być "prawie" równoległa
do płaszczyzny.
I jeszcze mam taki pomysł, jak to sprawdzić:
Jeżeli masz wektory kierunkowe płaszczyzny (u, w)
znaczenie - patrz mój poprzedni post) i wektor prostej v,
to iloczyn wektorowy u x w wyznacza wektor prostopadły
do płaszczyzny. Jeżeli płaszczyzna jest równoległa do
prostej to wektor prostopadły do płaszczyzny jest też
prostopadły do prostej, zatem iloczy skalarny (oznaczam kropką)

(u x w) . v = 0 (*)

Dzieląc iloczyn (*) przez iloczyn długości wektorów u,v,w
masz liczbę, będącą "miarą równoległości", możesz przyrównać
ją do jakiegoś 'epsilon', np. 0.001.

Antek
chips
2007-03-07 11:27:46 UTC
Permalink
Post by Pawel A
pisze wlasnie program do rozwijania siatek bryl o nieregularnych przekrojach
(np. do rozwijania siatek kadlubów statków czy okretów) i stanalem przed
problemem z którym nie moge sie uporac :-/ moze grupowicze cos mi doradza...
siatka takiej bryly sklada sie z trójkatów...
(x - os pozioma, y - os pionowa, z - "glebokosc")
Ax=0, Ay=0, Az=0
Bx=0 , By=30, Bz=0
Cx=2, Cy=40, Cz=60
mamy tez prosta równolegla do osi X lezaca na y=20 i z=25.
w jaki sposób sprawdzic czy prosta przecina trójkat i obliczyc wspólrzedne
punktu przeciecia?
--
pozdrawiam
Pawel
ps. autora rozwiazania z checia umieszcze w okienku "O programie" :-)
Dorzucę swoje trzy grosze do rozważań Antka. Jeśli nasza prosta nie
jest równoległa do X to obracamy układ współrzędnych tak, żeby była
(inaczej: obracamy wszystko, prostą i trójkąty). Rzutujemy wszystko na
płaszczyznę x=0 i nasz problem zmienia się w następujący: czy dany
punkt leży wewnątrz trójkąta na płaszczyźnie.
Pawel A
2007-03-07 14:12:55 UTC
Permalink
Dorzucê swoje trzy grosze do rozwa¿añ Antka. Je¶li nasza prosta nie
jest równoleg³a do X to obracamy uk³ad wspó³rzêdnych tak, ¿eby by³a
(inaczej: obracamy wszystko, prost± i trójk±ty). Rzutujemy wszystko na
p³aszczyznê x=0 i nasz problem zmienia siê w nastêpuj±cy: czy dany
punkt le¿y wewn±trz trójk±ta na p³aszczyŒnie.
Prosta jest równoleg³a do X.
Aczkolwiekz tym obracaniem to "Trafna uwaga Morris!!!" :-)

Dziêkujê wszystkim za rady. Znalaz³em kupê materia³ów na ten jak¿e
interesuj±cy mnie temat.

pozdrawiam
Pawel

Loading...