Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Dobrý den,
mohl bych poprosit o radu jak zjistit rotační matici k 3D trojúhelníku tak, aby byl položený v XY rovině?
Zadání:
Trojúhelník: tři vrcholy v1, v2, v3
Postup:
1) určíme normálový vektor
trojúhelníku podle vzorečku
V počítači jsem si to zapsal takto: Normal(Cross((v2 - v1), (v3 - v1)))
2) určíme rotační osu
na osu
podle vzorečku 
Zde již nevím, protože po doplnění dostanu
, což mi přijde jako chybné. V počítači jsem si to zapsal takto: Normal(Cross(z, n))
3) určíme rotační úhel podle vzorečku
.
Zde opět nevím co má znamenat tečka mezi
a
. V počítači jsem si to zapsal takto: arccos(Dot(z, n))
Rotační matici vytvářím podle odkazu: http://en.wikipedia.org/wiki/Rotation_m … _and_angle
Následně provedu transformaci všech vrcholů trojúhelníka podle rotační matice. Výsledek je ale chybný, jelikož hodnota osy Z není konstanta.
Prosím o radu. Omlouvám se za neodborný popis. V matice jsme toto brali VELMI okrajově.
Děkuji.
SpaM
Offline
ahoj ↑ unknow005:,
Je potřeba spočítat průsečnici roviny trojúhelníka s rovinou z=0. Kolem ní se bude otáčet.
Offline
Bohužel jsem s problémem nepostoupil. Našel jsem nějaké příklady ale po naprogramování byl výsledek chybný (někdy správný, ale chybně polohovaný). Aplikace mi zobrazuje dva polygony a pokud existují průniky, tak je zobrazím. Tím si ověřím správné fungování...
Pořád nacházím nějaké vzorce rovin x+y+z+d=0. To jsme brali kdysi dávno na škole a už se nepamatuji. V žádném příkladu pro programování se ale s tímto zápisem nepracuje. Mám dané body trojúhelníka XYZ nebo dva vektory (směrový a normálový) který popisuje roviny... to "d" tam prostě nikde není...
Mohl by mi prosím někdo poradit jak vyvodit průsečnici dvou trojúhelníků, ale "programátorsky"? Né, přes ten vzoreček výše? Stačí mi napsat třeba ... vytvoř normálové vektory trojúhelníků, pak cross, dot ... prostě s použitím běžných programátorských funkcí...
Děkuji.
Offline
↑ unknow005:
Nebude to asi úplně "programátorsky" - programátor má umět minimálně SŠ matematiku a je tristní, že to tak dnes často není. Lepení kódu z něčeho, o čem nevím co to znamená, programování není. Pokud nevíš kde se v těch rovnicích vzalo to d, nebo pokud třeba nevíš, co je to skalární součin, domluva bude prostě těžká.
Každopádně tvůj postup snad úplně špatný není, kromě toho, že nemáš tušení co děláš. První krok, spočítat vektorový součin dvou vektorů té roviny a dostat tak normálový vektor té roviny, je v pořádku. Pak chceš evidentně zjistit směrový vektor té průsečnice. Ten musí ležet v rovině trojúhelníka (tedy být kolmý na její normálový vektor) a současně ležet v rovině xy (takže být kolmý na z). Tedy určitě ho půjde dostat vektorovým součinem těch dvou vektorů. Někde máš ovšem chybu. Pokud počítám vektorový součin čehokoli s vektorem (0,0,1), výsledek musí mít z-ovou souřadnici nulovou.
O kolik otočit? No, musíme otočit o tolik, aby vektor n po rotaci skončil svisle (ve směru z). Takže o úhel mezi vektory n a z, který se nejsnáze spočítá pomocí skalárního součinu. To tedy také vypadá ok.
Násobením maticí samozřejmě jde otáčet pouze kolem přímky procházející počátkem. V obecném případě bude tedy zřejmě třeba nejprve provést nějaké posunutí, pak otočit, a pak posunout zpátky.
Nepromýšlel jsem všechny detaily a speciální případy, ale zhruba nějak takhle by to mohlo být.
Jo, a ještě jedna věc. Netvrdím, že tento postup je nejlepší. Ještě je potřeba nějak vymyslet to posouvání a může se přitom ukázat, že to šlo dělat celé jinak.
Offline
↑ LukasM:
... o matematiku musí mít člověk zájem, jinak se vše zapomene. Naštěstí zde máte trpělivost i lidmi jako jsem já :)
K řešení:
Když mám dva trojúhelníky X1,Y1,Z1 a X2,Y2,Z2, vyvodím si normálové vektory následovně:
V1 = X1 - Y1
V2 = X1 - Z1
V3 = cross( V1, V2 )
N1 = norm( V3 ) <= N1 normálový vektor prvního trojúhelníku
V1 = X2 - Y2
V2 = X2 - Z2
V3 = cross( V1, V2 )
N2 = norm( V3 ) <= N2 normálový vektor druhého trojúhelníku
Průsečnice P, neboli směrový vektor:
V1 = (0, 0, 1)
P = cross( N1, V1 )
P = norm( P ) <= P směrový vektor průsečnice
Úhel U otočení:
V1 = (0, 0, 1)
U = dot( N1, V1 )
U = arccos( U ) <= U úhel natočení
... je to správně?
Děkuji.
Offline
Když mám dva trojúhelníky X1,Y1,Z1 a X2,Y2,Z2
Odkud pochází ten druhý trojúhelník?
Offline
↑ KennyMcCormick:
Možná jsem to špatně formuloval. Dva trojúhelníky - každý tři body. První trojúhelník (X1, Y1, Z1) a druhý trojúhelník (X2, Y2, Z2).
Offline
Dva trojúhelníky
Původně jsi psal, že máš na vstupu jeden trojúhelník:
↑ unknow005:
Zadání:
Trojúhelník: tři vrcholy v1, v2, v3
Offline
↑ KennyMcCormick:
Ách ano. Už se mi to vše plete. Děkuji za upozornění. Ano, mám jeden trojúhelník. Ten druhý trojúhelník je v tomto případě zbytečný.
Offline
Ano, mám jeden trojúhelník.
Takže, kdybych smazal z tvého komentáře druhý trojúhelník, zůstane z tvého kódu:
Nechybí ti tam ta rotační matice?
Offline
↑ KennyMcCormick:
Ano, máme tedy zadání:
Když mám trojúhelník X1,Y1,Z1, vyvodím si normálové vektory následovně:
V1 = X1 - Y1
V2 = X1 - Z1
V3 = cross( V1, V2 )
N1 = norm( V3 ) <= N1 normálový vektor prvního trojúhelníku
Průsečnice P, neboli směrový vektor:
V1 = (0, 0, 1)
P = cross( N1, V1 )
P = norm( P ) <= P směrový vektor průsečnice
Úhel U otočení:
V1 = (0, 0, 1)
U = dot( N1, V1 )
U = arccos( U ) <= U úhel natočení
Rotační matice je jen další krok. Jen mě napadlo, neměl bych trojúhelník transformovat tak aby byl jeden bod rovný 0,0,0 ?
Offline
Tak se mi podařilo dosáhnout úspěšného výsledku, ale jen v několika případech. Před počítáním je třeba transformovat všechny vrcholy tak, aby jeden bod trojúhelníku ležel na 0,0,0 souřadnicích.
rotační osu a úhel jsem si spočítal takto:
osa: norm( cross( (0, 0, 1), N1))
úhel: arccos( dot((0, 0, 1), N1))
Bohužel se občas objeví kombinace, kdy matematika selže ...
Offline
Funkce "norm" normuje vektor?
Offline
↑ KennyMcCormick:
Ano. Mohu napsat přesné mat. vyjádření, ale pak by to bylo trochu nepřehledné.
Offline
arccos( dot((0, 0, 1), N1))
Tohle změň na
a dej vědět, jestli stále existují trojúhelníky, na kterých to nefunguje. ̶A̶̶̶ ̶̶̶u̶̶̶ž̶̶̶ ̶̶̶b̶̶̶y̶̶̶ ̶̶̶n̶̶̶e̶̶̶m̶̶̶ě̶̶̶l̶̶̶o̶̶̶ ̶̶̶b̶̶̶ý̶̶̶t̶̶̶ ̶̶̶p̶̶̶o̶̶̶t̶̶̶ř̶̶̶e̶̶̶b̶̶̶a̶̶̶ ̶̶̶t̶̶̶e̶̶̶n̶̶̶ ̶̶̶t̶̶̶r̶̶̶o̶̶̶j̶̶̶ú̶̶̶h̶̶̶e̶̶̶l̶̶̶n̶̶̶í̶̶̶k̶̶̶ ̶̶̶p̶̶̶o̶̶̶s̶̶̶o̶̶̶u̶̶̶v̶̶̶a̶̶̶t̶̶̶ ̶̶̶d̶̶̶o̶̶̶ ̶̶̶p̶̶̶o̶̶̶č̶̶̶á̶̶̶t̶̶̶k̶̶̶u̶̶̶ ̶̶̶s̶̶̶o̶̶̶u̶̶̶ř̶̶̶a̶̶̶d̶̶̶n̶̶̶i̶̶̶c̶̶̶.̶̶̶
EDIT: Pokud se takové trojúhelníky najdou, napiš, jaké.
EDIT: Označil jsem téma jako nevyřešené, dokud se nedobereme k řešení.
EDIT: Zjednodušil jsem vzoreček smazáním jmenovatele, u kterého jsem si všiml rovnosti jedné.
Offline
↑ KennyMcCormick:
Ty arccos vzorečky jsou stejné. Ta tečka mezi vektory je dot produkt. Tj.: v1X * v2X + v1Y * v2Y + v1Z * v2Z
Bez posunutí trojúhelníku do 0,0,0 vyjde průnik chybný (modelově ověřeno)
K těm zvláštním případům. To jsou spíše takové programátorské perličky se kterýma se asi matematik nesetká. Jedná se o nepřesné zaokrouhlování desetinných čísel. Např. ten samý trojúhelník otočený o 360° v jedné ose už může vycházet jinak. Problém mi pak nastával, pokud rotační osa vycházela 0,0,-1 .. i když je to samé jako 0,0,1
S podobnými problémy se setkávám běžně. I 100x lajknutý algoritmus se může v některých hraničních situacích chovat chybně.
Téma jsem původně označil za vyřešené, protože to možná nemá z tohoto důvodu řešení.
Offline
Ty arccos vzorečky jsou stejné.
Já tam mám navíc absolutní hodnotu. :)
Bez posunutí trojúhelníku do 0,0,0 vyjde průnik chybný (modelově ověřeno)
Jsem pako. Musíš ho tam posunout, pak otočit a pak posunout tam, kde má být.
Problém mi pak nastával, pokud rotační osa vycházela 0,0,-1 .. i když je to samé jako 0,0,1
Není to to samé - otočit něco o úhel
je totéž jako obrátit směr rotační osy a otočit to o úhel
(tj. záleží na orientaci osy).
Téma jsem původně označil za vyřešené, protože to možná nemá z tohoto důvodu řešení.
Určitě má. :-)
EDIT: Jak ti může rotační osa vyjít (0,0,-1), když musí náležet rovině x-y (tj. mít z-ovou složku nulovou)?
EDIT: Ve kterém případě ti to tak vychází?
Offline
Absolutní hodnotu jsem doplnil, ale chová se to hůře. Na prvním obrázku je vidět plný obdélník posunutý na 2,2,2 a jeho projekce z čáry na XY rovině. Na obrázku dva jsem plný obdélník otočil okolo osy Y o 45° a jeho projekce již neleží na XY rovině.
U druhého obrázku mi vyšla rotační osa 0,1,0 a úhel 45° ... což je chybné. Znamená to tedy, že mám chybu v rotační matici ... asi ...

Offline
Tak jsem se konečně dobral k dobrému výsledku. Absolutní hodnota tam být nesmí. Jediné, kdy se chybně vypočítá rotační matice je v případě, že rotační osa vyjde 1,1,1. Nenapadá Vás, co to znamená?
Děkuji!!!
Offline
↑ unknow005:
Rotační osa nemůže mít směrový vektor (1,1,1), to by neležela v rovině xy (což tu ovšem už asi dvakrát padlo, takže je celkem jasné, že proto to nefunguje). Takže problém je už někde předtím. Nestane se to náhodou v případě, že zadaný trojúhelník leží v rovině rovnoběžné s xy? Pak by vektorový součin n a osy z vyšel (0,0,0), a je otázka, co s takovým vektorem udělá třeba ta normovací funkce. Takový vektor normovat nejde, takže to záleží na tom, jestli a jak je to v ní ošetřené.
Jinak mi to ale nedá, musím zopakovat co jsem už napsal. "Programovat" tímto způsobem (pokus-omyl) není vhodné. Pak se právě všude objevují výjimky a speciální případy, které nikdo neošetřil, protože neměl ani tušení, že by mohly nastat. Nebo to ani výjimky nejsou, ale ty si myslíš, že ano - jako to s tou rotací kolem os (0,0,1) a (0,0,-1).
Offline
Absolutní hodnota tam být nesmí.
No jo, ty nemáš pravotočivý systém souřadnic. Moje chyba.
Offline
↑ KennyMcCormick:
Může pořadí bodů zmást algoritmus? Po doplnění celého algoritmu do aplikace mi to nefunguje.
EDIT: Beru zpět. Výsledek vypadá správně. Zatím jsem nenarazil na vyjímku.
Offline
Stránky: 1