Je kan het ook oplossen zonder matrices door alleen de eindresultaten daarvan te gebruiken.
De rotaties berekend via de rotatiematrices (zie bijvoorbeeld de link die ik hierboven gaf:
https://en.wikipedia.org/wiki/Rotation_ ... _rotations)
roteren de ruimte om de oorsprong.
Daarom roteren we het object eerst in de juiste orientatie, vervolgens plaatsen (transleren) we het naar de juiste locatie.
Een ruwe schets van het programma wordt dan:
[1] definieer het object (het bewegende blok):
// blokafmetingen (zie het voorbeeldplaatje uit mijn vorige post):
bloklengte=10;
blokdiepte=8;
blokhoogte=6;
bovenruimte=2;
// blokcoordinaten met blokcentrum in de oorsprong:
BA=[bloklengte/2, -blokdiepte/2, -blokhoogte/2];
BB=[bloklengte/2, blokdiepte/2, -blokhoogte/2];
BC=[-bloklengte/2, blokdiepte/2, -blokhoogte/2];
BD=[-bloklengte/2, -blokdiepte/2, -blokhoogte/2];
BE=[bloklengte/2 - bovenruimte, -blokdiepte/2, blokhoogte/2];
BF=[bloklengte/2 - bovenruimte, blokdiepte/2, blokhoogte/2];
BG=[-bloklengte/2 + bovenruimte, blokdiepte/2, blokhoogte/2];
BH=[-bloklengte/2 + bovenruimte, -blokdiepte/2, blokhoogte/2];
[2] definieer het frame en het assenstelsel daarin (oorsprong in het midden):
// frame afmeting (hier een kubus):
frame=100;
// coordinaten hoekpunten frame:
KE=[frame/2, -frame/2, -frame/2];
KF=[frame/2, frame/2, -frame/2];
KG=[-frame/2, frame/2, -frame/2];
KH=[-frame/2, -frame/2, -frame/2];
KA=[frame/2, -frame/2, frame/2];
KB=[frame/2, frame/2, frame/2];
KC=[-frame/2, frame/2, frame/2];
KD=[-frame/2, -frame/2, frame/2];
[3] Geef de gewenste orientatie en middelpuntlocatie van het object:
// rotatie-hoeken:
gamma = 20 *Pi/180; \\ roll-hoek in radialen
beta = 10 *Pi/180; \\ pitch-hoek in radialen
alfa = 25 *Pi/180; \\ yaw-hoek in radialen
// translatie-vector (10 naar links, 0 naar voor/achter, 10 omhoog):
t = [-10, 0, 10];
[4] Bereken de kabel-aangrijpingspunten van het object na rotatie en translatie:
ca=cos(alfa);
sa=sin(alfa);
cb=cos(beta);
sb=sin(beta);
cg=cos(gamma);
sg=sin(gamma);
// P[1] = de x-coordinaat van de eindpositie, P[2] de y-coordinaat en P[3] de z-coordinaat:
PA[1] = ca*cb*BA[1] + (ca*sb*sg-sa*cg)*BA[2] + (ca*sb*cg+sa*sg)*BA[3] + t[1];
PA[2] = sa*cb*BA[1] + (sa*sb*sg+ca*cg)*BA[2] + (sa*sb*cg-ca*sg)*BA[3] + t[2];
PA[3] = -sb*BA[1] + cb*sg*BA[2] + cb*cg*BA[3] + t[3];
PB[1] = ca*cb*BB[1] + (ca*sb*sg-sa*cg)*BB[2] + (ca*sb*cg+sa*sg)*BB[3] + t[1];
PB[2] = sa*cb*BB[1] + (sa*sb*sg+ca*cg)*BB[2] + (sa*sb*cg-ca*sg)*BB[3] + t[2];
PB[3] = -sb*BB[1] + cb*sg*BB[2] + cb*cg*BB[3] + t[3];
PC[1] = ca*cb*BC[1] + (ca*sb*sg-sa*cg)*BC[2] + (ca*sb*cg+sa*sg)*BC[3] + t[1];
PC[2] = sa*cb*BC[1] + (sa*sb*sg+ca*cg)*BC[2] + (sa*sb*cg-ca*sg)*BC[3] + t[2];
PC[3] = -sb*BC[1] + cb*sg*BC[2] + cb*cg*BC[3] + t[3];
PD[1] = ca*cb*BD[1] + (ca*sb*sg-sa*cg)*BD[2] + (ca*sb*cg+sa*sg)*BD[3] + t[1];
PD[2] = sa*cb*BD[1] + (sa*sb*sg+ca*cg)*BD[2] + (sa*sb*cg-ca*sg)*BD[3] + t[2];
PD[3] = -sb*BD[1] + cb*sg*BD[2] + cb*cg*BD[3] + t[3];
PE[1] = ca*cb*BE[1] + (ca*sb*sg-sa*cg)*BE[2] + (ca*sb*cg+sa*sg)*BE[3] + t[1];
PE[2] = sa*cb*BE[1] + (sa*sb*sg+ca*cg)*BE[2] + (sa*sb*cg-ca*sg)*BE[3] + t[2];
PE[3] = -sb*BE[1] + cb*sg*BE[2] + cb*cg*BE[3] + t[3];
PF[1] = ca*cb*BF[1] + (ca*sb*sg-sa*cg)*BF[2] + (ca*sb*cg+sa*sg)*BF[3] + t[1];
PF[2] = sa*cb*BF[1] + (sa*sb*sg+ca*cg)*BF[2] + (sa*sb*cg-ca*sg)*BF[3] + t[2];
PF[3] = -sb*BF[1] + cb*sg*BF[2] + cb*cg*BF[3] + t[3];
PG[1] = ca*cb*BG[1] + (ca*sb*sg-sa*cg)*BG[2] + (ca*sb*cg+sa*sg)*BG[3] + t[1];
PG[2] = sa*cb*BG[1] + (sa*sb*sg+ca*cg)*BG[2] + (sa*sb*cg-ca*sg)*BG[3] + t[2];
PG[3] = -sb*BG[1] + cb*sg*BG[2] + cb*cg*BG[3] + t[3];
PH[1] = ca*cb*BH[1] + (ca*sb*sg-sa*cg)*BH[2] + (ca*sb*cg+sa*sg)*BH[3] + t[1];
PH[2] = sa*cb*BH[1] + (sa*sb*sg+ca*cg)*BH[2] + (sa*sb*cg-ca*sg)*BH[3] + t[2];
PH[3] = -sb*BH[1] + cb*sg*BH[2] + cb*cg*BH[3] + t[3];
[5] Bereken de draadlengtes:
// draadlengtes (via de stelling van Pythagoras):
DA = sqrt( (PA[1]-KA[1])^2 + (PA[2]-KA[2])^2 + (PA[3]-KA[3])^2 );
DB = sqrt( (PB[1]-KB[1])^2 + (PB[2]-KB[2])^2 + (PB[3]-KB[3])^2 );
DC = sqrt( (PC[1]-KC[1])^2 + (PC[2]-KC[2])^2 + (PC[3]-KC[3])^2 );
DD = sqrt( (PD[1]-KD[1])^2 + (PD[2]-KD[2])^2 + (PD[3]-KD[3])^2 );
DE = sqrt( (PE[1]-KE[1])^2 + (PE[2]-KE[2])^2 + (PE[3]-KE[3])^2 );
DF = sqrt( (PF[1]-KF[1])^2 + (PF[2]-KF[2])^2 + (PF[3]-KF[3])^2 );
DG = sqrt( (PG[1]-KG[1])^2 + (PG[2]-KG[2])^2 + (PG[3]-KG[3])^2 );
DH = sqrt( (PH[1]-KH[1])^2 + (PH[2]-KH[2])^2 + (PH[3]-KH[3])^2 );
Punten [1] en [2] zijn één keer nodig, punten [3], [4] en [5] bereken je herhaald voor elke stap in je laatste post.