Rekenhulp gevraagd...

Gewoon even offtopic praten over van alles en nog wat.

Moderator: Moderators

Plaats reactie
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Rekenhulp gevraagd...

Bericht door Swets »

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......
Laatst gewijzigd door Swets op 21 jul 2022 14:30, 3 keer totaal gewijzigd.
http://www.arjan-swets.com (met cnc filmpjes)
KaRaMBa
Berichten: 17
Lid geworden op: 19 sep 2009 14:17
Locatie: Apeldoorn

Re: Rekenhulp gevraagd...

Bericht door KaRaMBa »

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;
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

ga ik even bestuderen.... bedankt!!!
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
DaBit
Donateur
Berichten: 11017
Lid geworden op: 05 dec 2012 13:48
Locatie: Oss

Re: Rekenhulp gevraagd...

Bericht door DaBit »

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:

Afbeelding
(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'
KaRaMBa
Berichten: 17
Lid geworden op: 19 sep 2009 14:17
Locatie: Apeldoorn

Re: Rekenhulp gevraagd...

Bericht door KaRaMBa »

Een isometrisch aanzicht is geen echte rotatie; de hoeken tussen de assen blijft nl geen 90 graden.
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

toch nog ff hoor

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;
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
Laatst gewijzigd door Swets op 21 jul 2022 14:33, 2 keer totaal gewijzigd.
http://www.arjan-swets.com (met cnc filmpjes)
KaRaMBa
Berichten: 17
Lid geworden op: 19 sep 2009 14:17
Locatie: Apeldoorn

Re: Rekenhulp gevraagd...

Bericht door KaRaMBa »

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?

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;
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:

Code: Selecteer alles

y = -(px * cos(30 * pi/180) + py * sin(30 * pi/180)) + yoPallet;
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

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);
      
Afbeelding

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

Afbeelding
(http://nl.wikipedia.org/wiki/Rotatiematrix)

Theta is je rotatiehoek, x en y je coordinaten tov (0,0), x' en y' je geroteerde coordinaat.
ik heb alleen maar LTS hoor... wat jij daar neer zet begrijp ik nix van....
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 11995
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door hugo stoutjesdijk »

9697
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;
Zou ook liever HoekX en HoekY invullen om verwarring te voorkomen.
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.
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

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) ;
ik heb nu dit, en het lijkt wel dat x het goed doet, alleen Y staat tov de pallet veel te hoog....?
http://www.arjan-swets.com (met cnc filmpjes)
KaRaMBa
Berichten: 17
Lid geworden op: 19 sep 2009 14:17
Locatie: Apeldoorn

Re: Rekenhulp gevraagd...

Bericht door KaRaMBa »

Swets schreef:

Code: Selecteer alles

       cSin60:=0.866025;
      cCos60:=0.5;

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...
Nu ik nog een keer naar je plaatje kijk, had ik de assen tov de oorsprong compleet verkeerd :P

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;
Dan kloppen de naamen weliswaar niet meer, maar het zou al beter moeten zijn ;)

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) ;
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

hugo stoutjesdijk schreef:9697
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;
Zou ook liever HoekX en HoekY invullen om verwarring te voorkomen.

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) ;
nog steeds Y ver boven het pallet getekend....ik word gek....
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

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) ;
Dit heb ik nu,
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)
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 11995
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door hugo stoutjesdijk »

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.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Plaats reactie