Breaker schreef:Breaker schreef:Je hebt de ‘modulus’ functie nodig om hier uit te komen, en die zie ik niet in je code...
hugo stoutjesdijk schreef:Ehm,
Dat was inderdaad iets te stellig. Had pas de situatie waarin het setpoint tussen 0-360 lag terwijl de actuele hoek veel groter kon zijn (bv een A-as die verschillende keren rond is geweest), dan werkt de truc met 360 optellen niet, hier wel.
Swets schreef:Maar ik snap de MOD ook niet helemaal precies...
Modulus is niets anders dan de 'rest' die je op school leerde, 10:3 = 3 rest 1, of 22:5 = 4 rest 2. Ideaal voor assen waar je weet dat de werkelijke positie altijd ergens tussen de 0-360 ligt en niet geinteresseerd bent in hoe vaak de as zelf is rondgeweest.
ja ik snap wel wat MOD doet.... maar op een of andere manier weet ik het nooit zo toe te passen.... ik heb het wel eens eerder gehad... had ik een heel verhaal met allerlei vergelijkingen... en toen kreeg ik ook van iemand ander zo'n heel simpel dingetje terug met MOD erin... :-)
maar ja.... ik heb me ook zelf maar alles aangeleerd.... dus ja sommige dingen zijn minder binnen gekomen dan andere... :-)
ik weet nog dat ik met binair en hexadecimaal aan het tobbe was.... en hoe leuk ik het vond toen het kwartje viel...
dat deel in dit 3D doosjes verhaal met die matrixen (wat ik van Dabit gekregen heb) begrijp ik ook niet veel:
Code: Selecteer alles
FUNCTION StapelPatroon3D::ScaleMatrix
VAR_INPUT
ScaleFactor : REAL;
Pointer : ^REAL;
AmountOfPoints : DINT;
END_VAR
VAR
i : DINT;
lCountPoint : DINT;
lOrigineel : ARRAY[0..3] of real;
lGetransformeerd : ARRAY[0..3] of real;
lMatrix : ARRAY[0..3,0..3] of REAL;
END_VAR
//matrix invullen
//
// 0 1 2 3
//
// 0 [ SX, 0, 0, 0]
// 1 [ 0, SY, 1, 0]
// 2 [ 0, 0, SZ, 0]
// 3 [ 0, 0, 0, 1]
lMatrix[0][0]:=ScaleFactor; lMatrix[0][1]:=0 ; lMatrix[0][2]:=0 ; lMatrix[0][3]:=0 ;
lMatrix[1][0]:=0 ; lMatrix[1][1]:=ScaleFactor ; lMatrix[1][2]:=0 ; lMatrix[1][3]:=0 ;
lMatrix[2][0]:=0 ; lMatrix[2][1]:=0 ; lMatrix[2][2]:=ScaleFactor ; lMatrix[2][3]:=0 ;
lMatrix[3][0]:=0 ; lMatrix[3][1]:=0 ; lMatrix[3][2]:=0 ; lMatrix[3][3]:=1 ;
for lCountPoint:=1 to AmountOfPoints do
lOrigineel[0]:= Pointer^ ;
Pointer := Pointer + sizeof(REAL);
lOrigineel[1]:= Pointer^ ;
Pointer := Pointer + sizeof(REAL);
lOrigineel[2]:= Pointer^ ;
lOrigineel[3]:=1.0;
for i := 0 to 3 Do
lGetransformeerd[i] := lOrigineel[0] * lMatrix[0][i] + lOrigineel[1] * lMatrix[1][i] + lOrigineel[2] * lMatrix[2][i] + lOrigineel[3] * lMatrix[3][i];
end_for;
pointer := Pointer - sizeof(REAL)*2;
Pointer^ := lGetransformeerd[0]/lGetransformeerd[3];
Pointer := Pointer + sizeof(REAL);
Pointer^ := lGetransformeerd[1]/lGetransformeerd[3];
Pointer := Pointer + sizeof(REAL);
Pointer^ := lGetransformeerd[2]/lGetransformeerd[3];
Pointer := Pointer + sizeof(REAL);
end_for;
END_FUNCTION
maar ik heb het wel eens stap voor stap zitten bekijken... en ik vind het wel super hoe dat allemaal werkt.... ik vraag me ook altijd gelijk af wie dat allemaal uitgevonden heb... :-)
heel het doosjse verhaal werkt ook met die matrixen... eentje voor het verschalen... eentje voor het roteren, en eentje voor het verschuiven.... maar het werkt super.... ik weet nu hoe ik het gebruiken moet... ik werk in een soort van virtueel assenstelsel in millimeters... en dat verschaal/vershuif en roteer ik zo dat het op het beeld klopt... :-)
ik heb wel eens zitten lezen op internet over die matrixen.... maar dat gaat zo hard... en dan komen er gelijk allemaal formules met rare haken Enzo... en dat soort wiskunde heb ik nooit gehad op de lts :-)