Odbicie od plaszczyzny wektor (plaszczyzny, wektory, proste)

Obiekty i przekształcenia geometryczne, opisane za pomocą układu (nie zawsze prostokątnego) współrzędnych.
Myrag
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 11 lis 2009, o 23:37
Płeć: Mężczyzna
Lokalizacja: Czesta
Podziękował: 1 raz
Pomógł: 5 razy

Odbicie od plaszczyzny wektor (plaszczyzny, wektory, proste)

Post autor: Myrag »

Ok, to teraz tak, powiem na wstepie ze jestem programista a nie matematykiem wiec
zwracam sie do was z prosba o pomoc, ponieaz jestescie bardziej w temacie

zadanie jest czysto programistyczne ale dla celow szybkiego dzialania programu potrzebuje
obliczen matematycznych, no wiec to bedzie mniej wiecej tak

kierunek poruszania obiektu jest zapisany za pomoca wektora, ktory jest wektorem kierunkowym prostej po ktorej porusza sie obiekt

w pewnym momencie prosta przecina pewna plaszczyzne, i tutaj zaczyna sie problem poniewaz chcialbym aby wektor został zmodyfikowany tak ze w momecie napotkania na plaszczyzne
wektor stal sie rownolegly do plaszczyzny, ale zeby utrzymal kierunek (oczywiscie nie bedzie juz
szedl "na wprost" tylko wzdloz plaszczyzny) sproboje to zilustrowac za pomoca rysunku


legenda:
l - prosta przecinajaca plaszczyzne
p - punkt przeciecia prostej z plaszczyzna
p' - punkt w ktory otrzymalibysmy po przesunieciu o wektor kierunkowy prostej bez modyfikacji
p'' - punkt ktory otrzymamy po przesunieciu o zbudyfikowany wektor

ps. pamietajcie ze kierunek prostej moze byc jakikolwiek, a ona wciaz powinna utrzymac kierunek
tylko wzdlug naszej plaszczyzny

jakies pomysly?
ps. przy podawaniu pomyslow prosze o konkrety, czli jak ktos powie oblicz to, to prosilbym o
jakis wzor, czy sposob
dzieki za kazda odpowiedz
Dudenzz
Użytkownik
Użytkownik
Posty: 93
Rejestracja: 8 mar 2009, o 18:21
Płeć: Mężczyzna
Pomógł: 19 razy

Odbicie od plaszczyzny wektor (plaszczyzny, wektory, proste)

Post autor: Dudenzz »

Również jestem programistą . Nie chciałbym Cię męczyć nawałem matematycznych zagadnień, więc powiedz mi tylko czy chodzi o przestrzeń \(\displaystyle{ R^3}\) z określonym iloczynem skalarnym, unormowaną bazą ortogonalną i rotacją przy pomocy kwaternionu. Jeżeli tak, to uświadom sobie, że płaszczyzna jest również opisana za pomocą osi bazowanych na wersorach wzajenie ortogonalnych, mógłbyś rzutować wektor kirunkowy na tę płaszczyznę(przestrzeń anafilaktyczną jeżeli to nie R3), po czym znów przenośić na swoją przestrzeń roboczą. Zanim napiszę jak, odpowiedz.

edit

I tam jest nieścisłość, chodzi o to, że obiekt przecina płaszczyznę, czy prosta zbudowana za pomocą wektora kierunkowego i punktu przecina płaszczyznę.
Myrag
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 11 lis 2009, o 23:37
Płeć: Mężczyzna
Lokalizacja: Czesta
Podziękował: 1 raz
Pomógł: 5 razy

Odbicie od plaszczyzny wektor (plaszczyzny, wektory, proste)

Post autor: Myrag »

oj, i zebym ja wiedzial :)
ogolnie pisze chwilowo program w OpenGL'u, nie wiem do czego odnosza sie te definicje podane przez Ciebie ale tam zostalo to w najprostszej postaci zrealizowane za pomoca przestrzennego ukladu kartezjanskiego, typowo aby stworzyc trojkat podaje mu wsporzedne trzech wierzcholkow w ukladzie,

no wiec precyzujac, dane wejscioew ktore posiadam to:
- 'p' okreslajacy aktualna pozycje
- wektor va = \(\displaystyle{ \vec{pp'}}\)
- zbior V = { 'A', 'B', 'C' i 'D' } czyli wierzcholki mojej plaszczyzny

sposob rozwiazania ktory wymyslilem (prosze o opinie, czy sposob jest 'najszybszy' a przez szybkosc
tutaj mam na mysli jak najmniejsza liczbe wykonanych obliczen do osiagniecia danego wyniku)
- obliczyc rownanie ogolne plaszczyzny z 3 dowlonych punktow za zbioru V
- obliczyc punkt p' przesowajac punkt p o wektor va
- obliczyc rzut prostopadly punktu p' na moja plaszczyzne (do tego potrzebne to rownanie ogolne)
- punkt rzutu prostopadlego to nasz szukany punkt p''

co wy na to?
jesli wydaje sie ze rozwiazanie jest dobre i mozliwie jak najszybsze to prosze o podanie
mi odpowiednich wzorow, wskazowek, jak obliczyc rownanie ogolne plaszczyzny a potem
rzut prostopadly
Dudenzz
Użytkownik
Użytkownik
Posty: 93
Rejestracja: 8 mar 2009, o 18:21
Płeć: Mężczyzna
Pomógł: 19 razy

Odbicie od plaszczyzny wektor (plaszczyzny, wektory, proste)

Post autor: Dudenzz »

OpenGL liczy rotacje z kwaternionu, więc jest iloczyn skalarny i baza ortogonalna :).

W dalszym ciągu nie rozumiemy się w niektórych kwestiach, teraz zrozumiałem, że ta 'płaszczyzna' jest figurą, czworokątem, na płaszczyźnie, prawda?

Jeżeli tak, musisz pamiętać o wielokątach wklęsłych. Rozwiązanie jest ok, rzutowanie to nie jest wcale duży problem, polecam stworzyć własne narzędzie do rzutowania (jeżeli masz na to czas), musiałoby ono zawierać definicje punktu, wektora, prostej, osi, przestrzeni, płaszczyzny. Narzędzie do "wyodrębnienia" płaszczyzny z przestrzeni w którego skład wchodziłoby narzędzie tworzenia osi opisanej za pomocą dwóch punktów, oraz tworzenia drugiej osi, ortogonalnej(prostopadłej, iloczyn skalarny równy 0) do osi pierwszej i przechodzącej przez trzeci punkt oraz rzutowanie wersora (wektora o długości 1),narzędzie do rzutowania punktu, prostej, odcinka z przestrzeni na płaszczyznę, narzędzia do poprawnego liczenia wersorów tej płaszczyzny. Mając je program ograniczałby się do.

1.Jeżeli nie nastąpiło rzutowanie przesuń p o wektor pp' w przestrzeni
2.Jeżeli nie nastąpiło rzutowanie i p jest pomiędzy odcinkami |AB||BC||CD||DA| następuje rzutowanie
3.Jeżeli nastąpiło rzutowanie rzutuj wektor pp' na płaszczyznę rzutującą i przesuń p o wektor pp''
4.Jeżeli nastąpiło rzutowanie i wektor pp'' nie jest pomiędzy w/w odcinkami wyrzuć wyjątek

Tu mamy zaledwie kilka mnożeń i porównań, w porównaniu do innych operacji (np. liczenie wspomnianego wcześniej kwaternionu, gdzie mnożeń jest 16) nie jest to wogóle skomplikowane i nie będzie wadzić, jeżeli chodzi o złożoność obliczeniową, trochę gorsze, jeżeli chodzi o złożoność pamięciową, bo każdą strukturę praktycznie powielamy, ale kto mówił, że to ma być optymalne :P
Myrag
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 11 lis 2009, o 23:37
Płeć: Mężczyzna
Lokalizacja: Czesta
Podziękował: 1 raz
Pomógł: 5 razy

Odbicie od plaszczyzny wektor (plaszczyzny, wektory, proste)

Post autor: Myrag »

mozliwe, ale na chwile obcena potrzebuje jedynie prostej klasy zajmujacej sie danym problemem, bo w razie niepowodzenie szkoda czasu, wiec wracajac do mojego sposobu potrzebuje teraz jedynie kogos kto poda mi odpowiednie wzory dzieki ktorym bede mogl juz obliczyc co mam, zeby latwiej bylo zrozumiec moze poprostu ktos mi rozwiaze przyklad

A=(2,3,2), B=(11,1,2), C=(11,14,2), D=(6,12,2)
punktu p=(5,6,0) i wektoru \(\displaystyle{ \vec{pp'}}\)=(2,3,4)

jak widac A,B,C i D sa napewno na 1 plaszczyznie rownoleglej do osi X i Y, punkt p lezy przed dana plaszczyzna, a wektor zostal ustalony tak aby po przesunieciu punkt znajdowal sie za plaszczyzna
odrazu liczac punkt po przesunieciu o wektor mamy p'=(7,9,4)

teraz powracam do pytania jak z 4 punktow utworzyc rownanie ogolne plaszczyzny, a potem majac rownanie stworzyc rzut prostopadly do tej plaszczyzny, i obliczyc punkt p''

ps. gdyby sie dalo jako ze w programowaniu przydaloby mi sie cos w stylu zapisu linijkowego
to chcialbym aby do rownania plaszczyzny Ax+By+Cz+D=0
ktos moglby napisac jak po kolei ze wzorow liczyc
A = ...
B = ...
C = ...
D = ...
p'' = ...

-- 12 lis 2009, o 09:33 --

ok rozwiazalem juz problem :)
majac punkty v1=(x1,y1,z1), v2=(x2,y2,z2) i v3=(x3,y3,z3) okreslajace plaszczyzne
liczymy wektor ab i bc
\(\displaystyle{ \vec{ab}=(x2-x1, y2-y1, z2-z1)}\)
\(\displaystyle{ \vec{bc}=(x3-x2, y3-y2, z3-z2)}\)
nastepnie iloczyn wektorowy \(\displaystyle{ \vec{v}=\vec{ab} x \vec{bc}}\)
\(\displaystyle{ \vec{v}=(ab.y*bc.z - bc.y*ab.z, ab.x*bc.z - bc.x*ab.z, ab.x*bc.y - bc.x*ab.y)}\)
a wiec nasze A, B i C do wzoru ogolnego to kolejne wartosci wektora v
\(\displaystyle{ A = v.x}\)
\(\displaystyle{ B = v.y}\)
\(\displaystyle{ C = v.z}\)
potem liczymy D do wzoru ogolnego
\(\displaystyle{ D = - (A*x1 + B*y1 + C*z1)}\)
tutaj zauwazylem fajny myk, jesli w tym momecie obliczmy sobie pewna zmienne ze wzoru
postawiajac pod wzor ogolny punkt p'=(x', y', z') ktory oznacza punkt po przesunieciu o wektor
\(\displaystyle{ zmienna = A*x' + B*y' + C*z' + D}\)
i jesli nasza zmienna jest ujemna to oznacza ze punkt znajduje sie 'za' plaszczyzna a nie 'przed' nia
oczywiscie zalezne jest to od kolejnosci podawania punktow a, b, c, odwrocenie kolejnosci zmienia
wartosc zmiennej na odwrotna
wracajac do mojego przypadku gdy zmienna jest mniejsza od 0 to znaczy ze jest 'za' i mozemy wykonac rzut prostopadly wedlug wzorow
obliczamy t ze wzrou
\(\displaystyle{ t = (-(A*x' + B*y' + C*z') - D) / (A*A + B*B + C*C)}\)
i final, wspolrzedne rzutowanego punktu na plaszczyzne to
\(\displaystyle{ P = (x' + t*A, y' + t*B, z' + t*C)}\)


ps. wszytskie wzory sa wyprowadzone poprawnie z podstawowych wzorow
- odleglosc punktu od prostej
- iloczyn wektorowy
- wektor 2 puntkow
- rownanie ogolne plaszczyzny
- rownanie parametryczne plaszczyzny
oraz dzialan algebraicznych, sprawdzone i przetestowane na programie w srodowisku 3D
wiec zapewniam ze dziala o ile poprawnie przepisalem :)

PS. teraz kolejne pytanie, jak widac na rysunku prosta przechodzi przez figure, a my wszytsko
tutaj policzylismy dla plaszczyzny, teraz moje pytanie jak sprawdzic czy dany punkt jest ograniczony przez pewna figure ktorej jedynie znaczmy rownanie ogolne oraz 4 punkty narozne, ps. kiedys robilem cos podobnego tylko dla lini (sprawdzilem czy punkt lezy po prawej czy lewej stronie odcinka) obliczalem wtedy wektory i liczylem ich iloczyn sprawdzajac czy wartosci nie byly ujemne, czy da sie to tez wykonac w przestrzeni trojwymiarowej?
Dudenzz
Użytkownik
Użytkownik
Posty: 93
Rejestracja: 8 mar 2009, o 18:21
Płeć: Mężczyzna
Pomógł: 19 razy

Odbicie od plaszczyzny wektor (plaszczyzny, wektory, proste)

Post autor: Dudenzz »

Przecierz masz równanie płaszczyzny, wektor na tej płaszczyźnie, odcinki zbudowane z A,B,C,D też mógłbyś szybko sprowadzić na tą płaszczyznę. Rozwiąż ten problem dla płaszczyzny. Zachowaj kierunek rysowania, w lieraturze szukaj pomocy pod pojęciem triangualcji wielokątów na płaszczyźnie. Jak wspomniałem uważaj na czworokąty wklęsłe.
ODPOWIEDZ