Rekenhulp gevraagd...
Moderator: Moderators
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Rekenhulp gevraagd...
https://www.dropbox.com/s/p120nsuv5l1fq ... n.png?dl=0
Omdat hier nogal slimme mensen komen, dacht ik, ik vraag het ook even hier...
ik ben bezig met een stukje software , om palletpatronen te visualiseren op een plc scherm... (dus echt niets met CNC te maken)
ik heb een 2D plaatje , van bovenaf, en ik wil een 3D plaatje laten zien....
nu heb ik al een 3D pallet en 3d doosjes gemaakt, welke mee verschalen als ik de lengte, breedte of hoogte veranderd....
maar ik zit nu een beetje het doosje op de goede plek zetten op het 3D plaatje...
hoe reken ik nu uit van uit 0,0 waar die rode stip terecht komt, als ik 1030 opzij gaat, en 90 omlaag?
de pallet hoeken zijn 30 graden....
hoop dat er hier een wiskundige zit, die het zo ff weet......
Omdat hier nogal slimme mensen komen, dacht ik, ik vraag het ook even hier...
ik ben bezig met een stukje software , om palletpatronen te visualiseren op een plc scherm... (dus echt niets met CNC te maken)
ik heb een 2D plaatje , van bovenaf, en ik wil een 3D plaatje laten zien....
nu heb ik al een 3D pallet en 3d doosjes gemaakt, welke mee verschalen als ik de lengte, breedte of hoogte veranderd....
maar ik zit nu een beetje het doosje op de goede plek zetten op het 3D plaatje...
hoe reken ik nu uit van uit 0,0 waar die rode stip terecht komt, als ik 1030 opzij gaat, en 90 omlaag?
de pallet hoeken zijn 30 graden....
hoop dat er hier een wiskundige zit, die het zo ff weet......
Laatst gewijzigd door Swets op 21 jul 2022 14:30, 3 keer totaal gewijzigd.
http://www.arjan-swets.com (met cnc filmpjes)
Re: Rekenhulp gevraagd...
Lijkt mij een simpele 2D transformatie. Even uit mijn hoofd:
X-as wordt beschreven door vector in een hoek van -30 graden, y-as door een as in 60 graden
xVector = (cos(-30 * pi/180), sin(-30 * pi/180)) = (0.866, -0.5)
yVector = (cos(60 * pi/180), sin(60*pi/180)) = (0.5, 0.866)
xMapped = x * xVector.x + y*xVector.y = 0.866*x - 0.5*y;
yMapped = x * yVector.x + y*yVecotr.y = 0.5*x + 0.866*y;
X-as wordt beschreven door vector in een hoek van -30 graden, y-as door een as in 60 graden
xVector = (cos(-30 * pi/180), sin(-30 * pi/180)) = (0.866, -0.5)
yVector = (cos(60 * pi/180), sin(60*pi/180)) = (0.5, 0.866)
xMapped = x * xVector.x + y*xVector.y = 0.866*x - 0.5*y;
yMapped = x * yVector.x + y*yVecotr.y = 0.5*x + 0.866*y;
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
ga ik even bestuderen.... bedankt!!!
http://www.arjan-swets.com (met cnc filmpjes)
Re: Rekenhulp gevraagd...
Ik doe dat soort geintjes meestal met een setje 4x4 matrices om te transformeren van 3D naar 2D. Voordeel van 4x4 matrices is dat je de matrices van de afzonderlijke bewerkingen (translatie, rotatie, 3D->2D projectie) met elkaar kunt vermenigvuldigen. Resultaat is 1 4x4 matrix waar je vervolgens je XYZ-coordinaten mee kunt vermenigvuldigen wat je weer 'scherm-coordinaten' oplevert.
Als je de mogelijkheid hebt om met 4x4 matrices te werken op je PLC zou ik zoiets wel overwegen; dat gaat je in de toekomst ellende schelen. Kun je ook je doosje roteren en zoomen a-la CAD-software enzo, en als je een representatie van het ding in de pallet weer wilt geven kun je dat ook.
Voor jouw specifieke geval is een rotatie van het punt volgens mij al wel genoeg. Die is vrij simpel:
(http://nl.wikipedia.org/wiki/Rotatiematrix)
Theta is je rotatiehoek, x en y je coordinaten tov (0,0), x' en y' je geroteerde coordinaat.
Als je de mogelijkheid hebt om met 4x4 matrices te werken op je PLC zou ik zoiets wel overwegen; dat gaat je in de toekomst ellende schelen. Kun je ook je doosje roteren en zoomen a-la CAD-software enzo, en als je een representatie van het ding in de pallet weer wilt geven kun je dat ook.
Voor jouw specifieke geval is een rotatie van het punt volgens mij al wel genoeg. Die is vrij simpel:
(http://nl.wikipedia.org/wiki/Rotatiematrix)
Theta is je rotatiehoek, x en y je coordinaten tov (0,0), x' en y' je geroteerde coordinaat.
De belangrijkste wet in de wetenschap: 'hoe minder efficient en hoe meer herrie, hoe leuker het is'
Re: Rekenhulp gevraagd...
Een isometrisch aanzicht is geen echte rotatie; de hoeken tussen de assen blijft nl geen 90 graden.
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
toch nog ff hoor
het gaat niet goed... dus ik zal nog wel fout doen...
ik heb nu dit als code:
ik heb ff de Y op 200 gezet, omdat anders helemaal buiten beeld valt,
dus eerst de x maar even
xoPallet,yoPallet, in die variabelen staan de x en y coördinaat van de hoek van de pallet (staat cirkel omheen)
vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosX x-coördinaat van het doosje
vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY y-coördinaat van het doosje
vScale = verschalings getal... loop van 0,2 tot 1 , om te zorgen dat alles op het beeld pas.... (de ruimte waar het in moet komen is maar iets van 700 x 500 pixels..)
maar dat rondje links boven is wat die uit gerekend heb.....
dus ik doe iets fout...
oja het scherm links bovenin is 0,0 , rechts beneden is dus 700,500
het gaat niet goed... dus ik zal nog wel fout doen...
ik heb nu dit als code:
Code: Selecteer alles
cSin30:=0.5;
cCos30:=0.866025;
cSin60:=0.866025;
cCos60:=0.5;
// middenpunt van het te plaatsen doosje uitrekenen
// xVector = (cos(-30 * pi/180), sin(-30 * pi/180)) = (0.866, -0.5)
// yVector = (cos(60 * pi/180), sin(60*pi/180)) = (0.5, 0.866)
//xMapped = x * xVector.x + y*xVector.y = 0.866*x - 0.5*y;
//yMapped = x * yVector.x + y*yVecotr.y = 0.5*x + 0.866*y;
xBoxMid:=to_dint ( ( ((vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosX-xoPallet) *vScale) *cCos30) - ( ((vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY-yoPallet) *vScale) *cSin30) ) ;
yBoxMid:=to_dint( ( ( (vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY-yoPallet) *vScale) *cCos60 ) -( ( (vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY-yoPallet) *vScale)* cSin60)) ;
yBoxMid:=200;
dus eerst de x maar even
xoPallet,yoPallet, in die variabelen staan de x en y coördinaat van de hoek van de pallet (staat cirkel omheen)
vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosX x-coördinaat van het doosje
vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY y-coördinaat van het doosje
vScale = verschalings getal... loop van 0,2 tot 1 , om te zorgen dat alles op het beeld pas.... (de ruimte waar het in moet komen is maar iets van 700 x 500 pixels..)
maar dat rondje links boven is wat die uit gerekend heb.....
dus ik doe iets fout...
oja het scherm links bovenin is 0,0 , rechts beneden is dus 700,500
Laatst gewijzigd door Swets op 21 jul 2022 14:33, 2 keer totaal gewijzigd.
http://www.arjan-swets.com (met cnc filmpjes)
Re: Rekenhulp gevraagd...
Ik kan je code niet helemaal volgen, maar ik denk dat het een volgorde probleem is.
Even aannemen dat je punt (x,y) het positie op het pallet is, dan doe je de transformaties in de volgende volgorde:
- Eerst verschalen, zodat je palletbreedte gemapt wordt op het aantal pixels dat je palet groot is
- Dan je assen verdraaien, naar een isometrisch perspectief (met een formule zoals ik je die gaf)
- Dan de oorsprong verplaatsen naar waar de hoek van je palet op je scherm staat
(verschalen en roteren kun je eventueel ook andersom doen)
Verder zag ik dat ik een foutje had gemaakt: de yVector staat onder een hoek van 30 graden, en niet 60...
edit: zoiets?
edit2:
Oh, ik zie ook dat je coordinatenruimte "andersom" is (in mijn hoofd is links-onder de oorsprong, maar bij computer graphics is dat vaak links-boven). Dat maakt dat je de y-as nog ergens moet spiegelen, bijv door het aan te passen tot:
Even aannemen dat je punt (x,y) het positie op het pallet is, dan doe je de transformaties in de volgende volgorde:
- Eerst verschalen, zodat je palletbreedte gemapt wordt op het aantal pixels dat je palet groot is
- Dan je assen verdraaien, naar een isometrisch perspectief (met een formule zoals ik je die gaf)
- Dan de oorsprong verplaatsen naar waar de hoek van je palet op je scherm staat
(verschalen en roteren kun je eventueel ook andersom doen)
Verder zag ik dat ik een foutje had gemaakt: de yVector staat onder een hoek van 30 graden, en niet 60...
edit: zoiets?
Code: Selecteer alles
px := vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosX * vScale;
py := vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY * vScale;
x = px * cos(-30 * pi/180) + py * sin(-30 * pi/180) + xoPallet
y = px * cos(30 * pi/180) + py * sin(30 * pi/180) + yoPallet;
Oh, ik zie ook dat je coordinatenruimte "andersom" is (in mijn hoofd is links-onder de oorsprong, maar bij computer graphics is dat vaak links-boven). Dat maakt dat je de y-as nog ergens moet spiegelen, bijv door het aan te passen tot:
Code: Selecteer alles
y = -(px * cos(30 * pi/180) + py * sin(30 * pi/180)) + yoPallet;
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
Code: Selecteer alles
cSin30:=0.5;
cCos30:=0.866025;
cSin60:=0.866025;
cCos60:=0.5;
// middenpunt van het te plaatsen doosje uitrekenen
// xVector = (cos(-30 * pi/180), sin(-30 * pi/180)) = (0.866, -0.5)
// yVector = (cos(60 * pi/180), sin(60*pi/180)) = (0.5, 0.866)
//xMapped = x * xVector.x + y*xVector.y = 0.866*x - 0.5*y;
//yMapped = x * yVector.x + y*yVecotr.y = 0.5*x + 0.866*y;
xBoxMid:=to_dint (( ((vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosX *cCos30) - ( vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY *cSin30)) *vScale)+xoPallet) ;
yBoxMid:=to_dint( (( ( (vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY)*cCos60 ) +(vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY* cSin60)) *vScale)+yoPallet) ;
// even een rode punt zetten om te kijken of 0.0 goed uitgerekend is..
Graphic.WritePixel(x1:=to_int(xBoxMid), y1:=to_int(yBoxMid), attrib:=T_COPY, color:=LIGHTRED);
Graphic.Oval(x1:=to_int(xBoxMid-10), y1:=to_int(yBoxMid-10), x2:=to_int(xBoxMid+10), y2:=to_int(yBoxMid+10), start:=0, bend:=3600, attrib:=T_COPY, color:=LIGHTRED);
begint er op te lijken geloof ik...
ook als ik hem nu verschaal, met die slider "zoom totaal" , dan blijf die x van waar het doosje moet komen op de goede plek staan....
alleen zit de y nog veel te hoog...
ik heb alleen maar LTS hoor... wat jij daar neer zet begrijp ik nix van....DaBit schreef:Ik doe dat soort geintjes meestal met een setje 4x4 matrices om te transformeren van 3D naar 2D. Voordeel van 4x4 matrices is dat je de matrices van de afzonderlijke bewerkingen (translatie, rotatie, 3D->2D projectie) met elkaar kunt vermenigvuldigen. Resultaat is 1 4x4 matrix waar je vervolgens je XYZ-coordinaten mee kunt vermenigvuldigen wat je weer 'scherm-coordinaten' oplevert.
Als je de mogelijkheid hebt om met 4x4 matrices te werken op je PLC zou ik zoiets wel overwegen; dat gaat je in de toekomst ellende schelen. Kun je ook je doosje roteren en zoomen a-la CAD-software enzo, en als je een representatie van het ding in de pallet weer wilt geven kun je dat ook.
Voor jouw specifieke geval is een rotatie van het punt volgens mij al wel genoeg. Die is vrij simpel:
(http://nl.wikipedia.org/wiki/Rotatiematrix)
Theta is je rotatiehoek, x en y je coordinaten tov (0,0), x' en y' je geroteerde coordinaat.
http://www.arjan-swets.com (met cnc filmpjes)
- hugo stoutjesdijk
- Donateur
- Berichten: 12045
- Lid geworden op: 02 mar 2011 17:04
- Locatie: elst (u)
- Contacteer:
Re: Rekenhulp gevraagd...
Hmm, ik teken gewoon altijd een paar driehoekjes en dan kijk ik waar het uitkomt.
En als ik dat nu doe, wordt een eindpunt in X opgebouwd uit 2x een cosinus waarde. ( X1+X2 en omdat Y negatie is wordt X2 dat ook )
De schuine X-as ligt onder -30 graden, de schuine Y-as onder +30 graden.
De Y waarde van het punt is wel een negatieve.
Dus ik gok dat het meer zoiets moet zijn:
Code: Selecteer alles
x = px * cos(-30 * pi/180) + py * cos(-30 * pi/180) + xoPallet
y = px * sin(-30 * pi/180) + py * sin(30 * pi/180) + yoPallet;
Laatst gewijzigd door hugo stoutjesdijk op 17 dec 2014 12:05, 1 keer totaal gewijzigd.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
Code: Selecteer alles
xBoxMid:=to_dint (((vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosX *cCos30*vScale) + ( vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY *cSin30*vScale))+xoPallet) ;
yBoxMid:=to_dint (((vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY*cCos30*vScale) +(vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY* cSin30*vScale)) +yoPallet) ;
http://www.arjan-swets.com (met cnc filmpjes)
Re: Rekenhulp gevraagd...
Nu ik nog een keer naar je plaatje kijk, had ik de assen tov de oorsprong compleet verkeerdSwets schreef:ook als ik hem nu verschaal, met die slider "zoom totaal" , dan blijf die x van waar het doosje moet komen op de goede plek staan....Code: Selecteer alles
cSin60:=0.866025; cCos60:=0.5;
alleen zit de y nog veel te hoog...
de Y-as staat onder een hoek van 210 graden, en de X-as onder een hoek van -30
Je variabelen kun je aanpassen naar:
Code: Selecteer alles
cSin60:=-0.5;
cCos60:=-0.866;
Oh, en je moet de Y-as nog even spiegelen:
Code: Selecteer alles
yBoxMid:=to_dint ((-1*((vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY*cCos60*vScale) +(vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY*cSin60*vScale))) + yoPallet) ;
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
hugo stoutjesdijk schreef:
Hmm, ik teken gewoon altijd een paar driehoekjes en dan kijk ik waar het uitkomt.
En als ik dat nu doe, wordt een eindpunt in X opgebouwd uit 2x een cosinus waarde. ( X1+X2 en omdat Y negatie is wordt X2 dat ook )
De schuine X-as ligt onder -30 graden, de schuine Y-as onder +30 graden.
De Y waarde van het punt is wel een negatieve.
Dus ik gok dat het meer zoiets moet zijn:Zou ook liever HoekX en HoekY invullen om verwarring te voorkomen.Code: Selecteer alles
x = px * cos(-30 * pi/180) + py * cos(-30 * pi/180) + xoPallet y = px * sin(-30 * pi/180) + py * sin(30 * pi/180) + yoPallet;
Code: Selecteer alles
xBoxMid:=to_dint (((vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosX *cCos30*vScale) + ( vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY *ccos30*vScale))+xoPallet) ;
yBoxMid:=to_dint (((vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY*cSin30*vScale) +(vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY* cSin30*vScale)) + yoPallet) ;
http://www.arjan-swets.com (met cnc filmpjes)
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
Code: Selecteer alles
xBoxMid:=to_dint (((vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosX *cCos30*vScale) + ( vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY *ccos30*vScale))+xoPallet) ;
yBoxMid:=to_dint ((-1*((vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY*cCos60*vScale) +(vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY*cSin60*vScale))) + yoPallet) ;
en aan de hand van die 2 plaatjes kan je zie wat er gebeurt als ik verschaal....
maar Y blijft te hoog....
het zou 1030,94 moeten zijn...maar dat is in mm... de pallet is 1200 x800... dus x lijkt aardig te kloppen.... maar ja Y vlieg boven het pallet.... dus dat klopt niet...
Laatst gewijzigd door Swets op 21 jul 2022 21:19, 2 keer totaal gewijzigd.
http://www.arjan-swets.com (met cnc filmpjes)
- hugo stoutjesdijk
- Donateur
- Berichten: 12045
- Lid geworden op: 02 mar 2011 17:04
- Locatie: elst (u)
- Contacteer:
Re: Rekenhulp gevraagd...
Voer je wel een negatief getal in voor Y ?
Begin eens met X500 Y0, dan moet je tenminste op de rand uitkomen. Daarna nog eens met X0 Y-500.
Dan zie je wel wat er gebeurd.
Begin eens met X500 Y0, dan moet je tenminste op de rand uitkomen. Daarna nog eens met X0 Y-500.
Dan zie je wel wat er gebeurd.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.