Rekenhulp gevraagd...

Gewoon even offtopic praten over van alles en nog wat.

Moderator: Moderators

Rekenhulp gevraagd...

Berichtdoor Swets op 17 Dec 2014 08:55

Afbeelding

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......
http://www.arjan-swets.com (met cnc filmpjes)
Avatar gebruiker
Swets
 
Berichten: 1831
Geregistreerd: 09 Feb 2007 20:49
Woonplaats: krimpen aan den IJssel

Re: Rekenhulp gevraagd...

Berichtdoor KaRaMBa op 17 Dec 2014 09:40

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;
KaRaMBa
 
Berichten: 17
Geregistreerd: 19 Sep 2009 12:17
Woonplaats: Apeldoorn

Re: Rekenhulp gevraagd...

Berichtdoor Swets op 17 Dec 2014 09:44

ga ik even bestuderen.... bedankt!!!
http://www.arjan-swets.com (met cnc filmpjes)
Avatar gebruiker
Swets
 
Berichten: 1831
Geregistreerd: 09 Feb 2007 20:49
Woonplaats: krimpen aan den IJssel

Re: Rekenhulp gevraagd...

Berichtdoor DaBit op 17 Dec 2014 10:00

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.
Avatar gebruiker
DaBit
Donateur
 
Berichten: 7222
Geregistreerd: 05 Dec 2012 12:48
Woonplaats: Oss

Re: Rekenhulp gevraagd...

Berichtdoor KaRaMBa op 17 Dec 2014 10:12

Een isometrisch aanzicht is geen echte rotatie; de hoeken tussen de assen blijft nl geen 90 graden.
KaRaMBa
 
Berichten: 17
Geregistreerd: 19 Sep 2009 12:17
Woonplaats: Apeldoorn

Re: Rekenhulp gevraagd...

Berichtdoor Swets op 17 Dec 2014 10:26

toch nog ff hoor

het gaat niet goed... dus ik zal nog wel fout doen...

ik heb nu dit als code:
Code: Alles selecteren
      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;


Afbeelding

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
http://www.arjan-swets.com (met cnc filmpjes)
Avatar gebruiker
Swets
 
Berichten: 1831
Geregistreerd: 09 Feb 2007 20:49
Woonplaats: krimpen aan den IJssel

Re: Rekenhulp gevraagd...

Berichtdoor KaRaMBa op 17 Dec 2014 10:37

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: Alles selecteren
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: Alles selecteren
y = -(px * cos(30 * pi/180) + py * sin(30 * pi/180)) + yoPallet;
KaRaMBa
 
Berichten: 17
Geregistreerd: 19 Sep 2009 12:17
Woonplaats: Apeldoorn

Re: Rekenhulp gevraagd...

Berichtdoor Swets op 17 Dec 2014 10:49

Code: Alles selecteren
      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)
Avatar gebruiker
Swets
 
Berichten: 1831
Geregistreerd: 09 Feb 2007 20:49
Woonplaats: krimpen aan den IJssel

Re: Rekenhulp gevraagd...

Berichtdoor hugo stoutjesdijk op 17 Dec 2014 10:59

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: Alles selecteren
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 11:05, in totaal 1 keer gewijzigd.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Avatar gebruiker
hugo stoutjesdijk
Donateur
 
Berichten: 5574
Geregistreerd: 02 Maa 2011 16:04
Woonplaats: elst (u)

Re: Rekenhulp gevraagd...

Berichtdoor Swets op 17 Dec 2014 11:05

Code: Alles selecteren
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)
Avatar gebruiker
Swets
 
Berichten: 1831
Geregistreerd: 09 Feb 2007 20:49
Woonplaats: krimpen aan den IJssel

Re: Rekenhulp gevraagd...

Berichtdoor KaRaMBa op 17 Dec 2014 11:13

Swets schreef:
Code: Alles selecteren
       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: Alles selecteren
      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: Alles selecteren
  yBoxMid:=to_dint ((-1*((vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY*cCos60*vScale) +(vPattern.Layer[vCurrentLayer][vBoxNbr].PlacePosY*cSin60*vScale))) + yoPallet) ;
KaRaMBa
 
Berichten: 17
Geregistreerd: 19 Sep 2009 12:17
Woonplaats: Apeldoorn

Re: Rekenhulp gevraagd...

Berichtdoor Swets op 17 Dec 2014 11:14

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: Alles selecteren
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: Alles selecteren
     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)
Avatar gebruiker
Swets
 
Berichten: 1831
Geregistreerd: 09 Feb 2007 20:49
Woonplaats: krimpen aan den IJssel

Re: Rekenhulp gevraagd...

Berichtdoor Swets op 17 Dec 2014 11:33

Code: Alles selecteren
 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) ;


Afbeelding
Afbeelding

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...
http://www.arjan-swets.com (met cnc filmpjes)
Avatar gebruiker
Swets
 
Berichten: 1831
Geregistreerd: 09 Feb 2007 20:49
Woonplaats: krimpen aan den IJssel

Re: Rekenhulp gevraagd...

Berichtdoor hugo stoutjesdijk op 17 Dec 2014 11:59

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.
Avatar gebruiker
hugo stoutjesdijk
Donateur
 
Berichten: 5574
Geregistreerd: 02 Maa 2011 16:04
Woonplaats: elst (u)

Volgende

Terug naar Praathoek



Wie is er online?

Gebruikers in dit forum: Danny, diber, HBZWEEF en 22 gasten