Matek

Fórumok

Sziasztok!

Tudna valaki segíteni nekem abban, hogy hogy tudom a leghatékonyabban kiszámíttatni egy egyenes és egy henger metszéspontjait a programommal?

Az egyenesnek adott egy pontja és az irányvektora (kétszer 3 koordiánta).
A hengernek adott a magassága és az alapkör sugara, illetve tudjuk, hogy a középpontja az origó, tehát -(m/2) és (m/2) közötti Z koordinátákat vesz fel.

Előre is köszi a segítséget.

Hozzászólások

A specialitás miatt 2D ben is meg lehet oldani sztem.

Alapkör metszés vizsgálata a az egyenes "síkbeli vetületével". (Négyjegyű fügvénytábla ;) )

Ha metszéspontban az eredeti egyenes Z kooridinátája -m/2 és m/2 közé esik akkor ez a metszés/érintés pont a megoldás (paláston metszi/érinti).

Ha ezen kívül akkor az egyenes Z = -m/2 ill. +m/2 koordinátáti kell meghatározni. (alapon van a metszés.)

Köszi, valami hasonlóval próbálkozom én is, csak egyszerűbb lenne szerintem valami 3D-s egyenlet ami megadja nekem a teljes felületét a hengernek és azt próbálnám megoldani az egyenes egyenletével együtt, mert az a baj, hogy nem biztos, hogy metszi és ha igen, akkor is ugye igen sokféle lehetőség van:
1) palástot metsz, ott is lép ki
2) alapot metsz, másik alapon megy ki
3) paláston be, alapon ki
4) alapon be, paláston ki
5) alapot érint (azaz az alapkör egy húrján megy végig)
6) palástot érint
7) alap és palást határán érint

Ezeket mind külön lecsekkoltatni vele azzal a módszerrel amit 2D-s vetületeknél nézünk szerintem nem egyszerű.

--
MacBook Black
OS X 10.6.5

Ha H( x ) a Heaviside fuggveny, akkor a palast egyenlete:

|x^2+y^2 -R^2| + |H( z + M/2 ) - H(M/2-M/2) -1 |= 0

Ez csak a palast. Hasonloan leirhato a ket alap

|H( R^2 - x^2+y^2 )-1| + ||z| - M/2| = 0

A ketto szorzata a henger teljes feluleten nulla, mashol pedig nem nulla. Ugy remlik meg lehet oldani Heaviside nelkul is, az abszolut erteket helyett is lehet negyzetreemelest hasznalni ( kiveve, hogy a |z|-M/2 helyett z^2 - M^2/4 kell ), igy talan lehet ebbol differencialhato egyenletet is csinalni, de nyilvan ugy sem konnyebb hasznalni.

Ps: bocs,ha bugos kicsit az egyenlet, csak meg akartam mutatni, nem lehetetlen osszerakni egy ilyet

Ezeket mind külön lecsekkoltatni vele azzal a módszerrel amit 2D-s vetületeknél nézünk szerintem nem egyszerű.

Pedig más módon nem fog menni. A henger felületének egyenlete - ha egyben akarod az alapokat meg a felületet - egy halom IF() függvényt fog tartalmazni. Ergó megoldásnál ezeket szét kell majd választanod, és az IF() ágainak megfelelően külön-külön kiértékelni és megoldani - pont ugyanott vagy.
Az egyik megoldás - amit már fentebb javasoltak - az egyenesnek az alapsíkra vetett vetületével indítani, és utána ebből tovább okoskodni.
A másik megoldás, hogy mind a három független felületére a hengernek felírni egy végtelen egyenletet (két végtelen sík és egy végtelen cső), azokat megoldani, majd megnézni, hogy a megoldás a beleesik-e a hengerhez tartozó részbe (alul-felül a körön belül van-e, a paláston meg az alsó-felső lapon belül).

epp ma kellett egy hasonlo, csak epp a legkozelebbi elhaladas pontjara volt szukseg.

neked a vonal parameteres egyenelte van meg, ahol legyen t egy szabad valtozo, r = (x_0, y_0, z_0) egy pont ahol athalad az egyenes, es v = (v_x, v_y, v_z) az iranyvektor.
Ezzel r(t) = (x(t) , y(t) , z(t) ) = r + v*t leirja a vonal egyenletet. Ahhoz hogy konnyu legyen metszespontot szamolni, legjobb ha helyettesitjuk x(t) -vel t -t.

x = x(t) = x_0 + v_x *t -> t = (x-x_0) / v_x

A hengerrel valo metszespontok a henger R sugarabol jonnek ki:

y = y(t) = y_0 + v_y *t = y_0 + v_y *(x-x_0)/v_x

R^2 = x^2 + y^2 = x^2 + (y_0 + v_y *(x-x_0)/v_x )^2

Nulla, egy vagy ket megoldas lesz x-re, hisz ez egy masodfoku egyenlet. A z koordinata pedig hasonloan szamolhato mint az y :

z = z(t) = z_0 + v_z *t = z_0+ v_z * (x-x_0) /v_x

es itt ellenorizni kell, hogy |z| < m/2

Voila!
Ha |z| > m/2 valamelyik x-re, akkor ott ki kell fejezni az x(z) es y(z) -kbol az x, y metszespontot, de nem ordongosseg.

Abban igazad van, az egy specialis eset, csak lusta voltam leirni. De azon a ponton csak akkor fog atmenni, ha az egyenesed atmegy az origon es az iranyvektor fuggoleges. Ezt konnyu vizsgalni, foleg mert v_x ilyenkor nulla, es nem lehet vele osztani.
Technikailag ez ugy megy, hogy ha v_x nulla, akkor v_y-t kell hasznalni, hogy kifejezd x-et (ami konstans lesz, de attol meg bele megy az R^2 szamolasba). Utana pedig z-t y-nal fejezed ki. Ha v_x es v_y is nulla, akkor a problema meg egyszerubb, mert a vonal fuggoleges lehet csak ( (v_x, v_y, v_z) normaja 1 kell legyen, tehat v_z = -+1), tehat a megadott pont vetulete vagy belesik a henger vetuletbe, a korbe, vagy sem. A metszespontok siman (x_0, y_0, +-M/2).

Először a henger tengely és egyenes távolságát számolnám ki:
http://mathworld.wolfram.com/Line-LineDistance.html
vagy
http://softsurfer.com/Archive/algorithm_0106/algorithm_0106.htm
ha ez kisebb vagy egyenlő mint a sugár, akkor lehet metszés vagy érintőpont.
Ezek után az érintésnél - a távolságnál számított keresztszorzatot felhasználva - megállapítható hogy a pont a paláston van-e, tehát a hengert lezáró két sík között van-e egyszerű távolságméréssel:
http://mathworld.wolfram.com/Point-PlaneDistance.html
Ha metszés van, azon tovább kell számolni, de az eddig felhasznált keresztszorzatok, sík és pont távolsága számításokat újra lehet használni, illetve ha a hengert lezáró sík és egyenes döféspontját keressük:
http://mathworld.wolfram.com/Line-PlaneIntersection.html