Matematické Fórum

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
! 04. 11. 2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
17. 01. 2016 (Jel.) Rok 2016 s novými a novějšími krystaly od kolegy Pavla!
17. 01. 2016 (Jel.) Nabídka knih z oborů matematiky, fyziky, chemie
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

#1 02. 03. 2017 08:29

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Výpočet rotační matice 3D trojúhelníka na XY rovinu

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 $n$ trojúhelníku podle vzorečku $n=\frac{(v2-v1)×(v3-v1)}{|(v2-v1)×(v3-v1)|}$
V počítači jsem si to zapsal takto: Normal(Cross((v2 - v1), (v3 - v1)))

2) určíme rotační osu $k$ na osu $z=[0,0,1]$ podle vzorečku $k=\frac{n×x}{|n×x|}$
Zde již nevím, protože po doplnění dostanu $k = [0, 0, 1]$, 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 $\vartheta=cos-1(n\cdot x)$.
Zde opět nevím co má znamenat tečka mezi $n$ a $x$. 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

  • (téma jako vyřešené označil(a) KennyMcCormick)

#2 03. 03. 2017 10:21

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

Opravdu prosím nikdo neporadí?

... nějak jsem se v tom zasekl a nevím jak dál.

Děkuji.

Offline

 

#3 03. 03. 2017 14:47

Eratosthenes
Příspěvky: 1912
Reputace:   120 
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

ahoj ↑ unknow005:,

Je potřeba spočítat průsečnici roviny trojúhelníka s rovinou z=0. Kolem ní se bude otáčet.


Nejraději chodím bos, když mé boty uvíznou v řiti nějakého hňupa.

Offline

 

#4 15. 03. 2017 09:31

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

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

 

#5 15. 03. 2017 13:30 — Editoval LukasM (15. 03. 2017 13:36)

LukasM
Příspěvky: 2995
Reputace:   175 
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

↑ 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

 

#6 15. 03. 2017 15:49

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

↑ 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

 

#7 15. 03. 2017 23:55

KennyMcCormick
Příspěvky: 1265
Reputace:   45 
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

Když mám dva trojúhelníky X1,Y1,Z1 a X2,Y2,Z2

Odkud pochází ten druhý trojúhelník?


Even if you take the best course of action, the universe is still allowed to say "So what?" and kill you.

Offline

 

#8 16. 03. 2017 07:04

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

↑ 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

 

#9 16. 03. 2017 15:14

KennyMcCormick
Příspěvky: 1265
Reputace:   45 
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

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


Even if you take the best course of action, the universe is still allowed to say "So what?" and kill you.

Offline

 

#10 16. 03. 2017 15:47

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

↑ 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

 

#11 19. 03. 2017 00:11

KennyMcCormick
Příspěvky: 1265
Reputace:   45 
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

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?


Even if you take the best course of action, the universe is still allowed to say "So what?" and kill you.

Offline

 

#12 19. 03. 2017 08:09

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

↑ 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

 

#13 20. 03. 2017 10:59

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

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

 

#14 21. 03. 2017 01:26

KennyMcCormick
Příspěvky: 1265
Reputace:   45 
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

Funkce "norm" normuje vektor?


Even if you take the best course of action, the universe is still allowed to say "So what?" and kill you.

Offline

 

#15 21. 03. 2017 01:28

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

↑ KennyMcCormick:

Ano. Mohu napsat přesné mat. vyjádření, ale pak by to bylo trochu nepřehledné.

Offline

 

#16 21. 03. 2017 02:53 — Editoval KennyMcCormick (21. 03. 2017 08:05)

KennyMcCormick
Příspěvky: 1265
Reputace:   45 
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

↑ unknow005:

arccos( dot((0, 0, 1),  N1))

Tohle změň na
$\arccos |(0,0,1)\cdot N_1|$ 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é.


Even if you take the best course of action, the universe is still allowed to say "So what?" and kill you.

Offline

 

#17 21. 03. 2017 07:17 — Editoval unknow005 (21. 03. 2017 07:17)

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

$\arccos |(0,0,1)\cdot N_1|$↑ 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

 

#18 21. 03. 2017 07:56 — Editoval KennyMcCormick (21. 03. 2017 08:07)

KennyMcCormick
Příspěvky: 1265
Reputace:   45 
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

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 $\theta$ je totéž jako obrátit směr rotační osy a otočit to o úhel $-\theta$ (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í?


Even if you take the best course of action, the universe is still allowed to say "So what?" and kill you.

Offline

 

#19 21. 03. 2017 08:40 — Editoval unknow005 (21. 03. 2017 08:42)

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

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 ...

http://forum.matematika.cz/upload3/img/2017-03/81741_q_q_ex1.png

http://forum.matematika.cz/upload3/img/2017-03/81761_q_q_ex2.png

Offline

 

#20 21. 03. 2017 09:13

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

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

 

#21 21. 03. 2017 11:51

LukasM
Příspěvky: 2995
Reputace:   175 
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

↑ 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

 

#22 21. 03. 2017 14:38

KennyMcCormick
Příspěvky: 1265
Reputace:   45 
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

↑ unknow005:

Absolutní hodnota tam být nesmí.

No jo, ty nemáš pravotočivý systém souřadnic. Moje chyba.


Even if you take the best course of action, the universe is still allowed to say "So what?" and kill you.

Offline

 

#23 21. 03. 2017 14:39

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

↑ LukasM:

Jj, po aplikaci norm vypadne 1,1,1 což je chybné.
Děkuji za tip.

Offline

 

#24 21. 03. 2017 14:47 — Editoval unknow005 (21. 03. 2017 15:14)

unknow005
Příspěvky: 82
Škola: "Výběrová" Střední
Pozice: Programátor
Reputace:   
 

Re: Výpočet rotační matice 3D trojúhelníka na XY rovinu

↑ 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

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson