Rekenhulp gevraagd...

Gewoon even offtopic praten over van alles en nog wat.

Moderator: Moderators

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

Re: Rekenhulp gevraagd...

Bericht door Swets »

Code: Selecteer alles

for  ySearch:=0 to vPattern.PalletData.Width do
        for xSearch:=0 to vPattern.PalletData.Length Do
            for searchBox:=1 to vBoxNbrMax Do
              if vPattern.Layer[vCurrentLayer][searchBox].PlacePosY=ySearch & vPattern.Layer[vCurrentLayer][searchBox].PlacePosX=xSearch & vPattern.Layer[vCurrentLayer][searchBox].NbrBoxes>0 then
                
                vDrawBoxArray[tel]:=searchBox;
                tel:=tel+1;
              end_if;
            end_for;
        end_for;
     end_for;
ik heb nu het bovenstaande, en dat werkt, maar het is veel te zwaar...

want voor heel de pallet loopt de eerste lus dus van 0 tot 1200 en binnen die lus een lus die loopt van 0 tot 800, en daarin in een lus van 1 tot 50...

ik denk dat ik toch wat anders moet verzinnen....
iemand nog ideeen?
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
ruudpg
Donateur
Berichten: 1051
Lid geworden op: 19 jul 2011 12:37
Locatie: Spijkenisse
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door ruudpg »

Als je "een getal tussen 1 en 1200" zoekt kan je dat natuurlijk ook doen door het te benaderen, eerst kijken ligt het getal tussen 1 en 600 of tussen 601 en 1200, daarna tussen 601 en 900 of tussen 901 en 1200, op die manier heb je het aantal keer tellen teruggebracht van maximaal 1200 naar maximaal 302, maar je kan natuurlijk ook nog verder gaan met benaderen.
Een andere optie is natuurlijk om je nulpunt aan de andere kant van de pallet te zetten, zodat de eerste telling niet tot bijvoorbeeld 1000 hoeft te lopen, maar in dit geval tot 200, bij hetgene dat daarna moet komen hoef je dan pas te beginnen met tellen vanaf 200.
Nog een laatste idee, kan je van 1 tot 1200 niet doen in stappen, van bijvoorbeeld het formaat van de doosjes?
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 12045
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door hugo stoutjesdijk »

Mijn idee was ook bedoelt voor het geval je weet dat die doosjes altijd op een raster van b.v. 100 mm zouden staan.
Dat zou je zelf kunnen simuleren door de positie door 10 te delen ( alleen de cm-ers dus ) dat scheelt gelijk heel veel.
Maar wij weten niet wat de praktisch kleinste afstand zou zijn.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

ruudpg schreef:Als je "een getal tussen 1 en 1200" zoekt kan je dat natuurlijk ook doen door het te benaderen, eerst kijken ligt het getal tussen 1 en 600 of tussen 601 en 1200, daarna tussen 601 en 900 of tussen 901 en 1200, op die manier heb je het aantal keer tellen teruggebracht van maximaal 1200 naar maximaal 302, maar je kan natuurlijk ook nog verder gaan met benaderen.
Een andere optie is natuurlijk om je nulpunt aan de andere kant van de pallet te zetten, zodat de eerste telling niet tot bijvoorbeeld 1000 hoeft te lopen, maar in dit geval tot 200, bij hetgene dat daarna moet komen hoef je dan pas te beginnen met tellen vanaf 200.
Nog een laatste idee, kan je van 1 tot 1200 niet doen in stappen, van bijvoorbeeld het formaat van de doosjes?
ik heb 2 array's, van 50... en nu wil ik die array zo sorteren , dat de kleinste x en kleinst y bovenaan komt te staan en de grooste x en y onderaan....
of een nieuwe array die gevuld wordt boven aan met het nummer van de box welke de kleinste x en y heeft, en als laatste de grooste...

ik heb max 50 doosjes ... dus het moet ik een lus van 50 kunnen... maar dan moet ik misschien 3 arrays aan maken, dat ik ook weet wat van het vorige doosje de x en de y was...

pff moeilijk weer.....
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
DaBit
Donateur
Berichten: 11032
Lid geworden op: 05 dec 2012 13:48
Locatie: Oss

Re: Rekenhulp gevraagd...

Bericht door DaBit »

Kun je daar niet gewoon een sorteeralgorithme op los laten? Bubble sort is heel simpel.

Even droog uit het hoofd (maar da's iets troebel op het moment) zou dit de truuk wel eens kunnen doen:

Code: Selecteer alles

do
	NrSwaps = 0
	for i:=1 to (vBoxNbrMax-1) do
		pos1 = 10000*vPattern.Layer[vCurrentLayer][i].PlacePosY + vPattern.Layer[vCurrentLayer][i].PlacePosX
		pos2 = 10000*vPattern.Layer[vCurrentLayer][i+1].PlacePosY + vPattern.Layer[vCurrentLayer][i+1].PlacePosX
		if pos1 > pos2 then
			NrSwaps = 1
			 temp_x = vPattern.Layer[vCurrentLayer][i].PlacePosX
		     temp_y = vPattern.Layer[vCurrentLayer][i].PlacePosY
			 vPattern.Layer[vCurrentLayer][i].PlacePosX = vPattern.Layer[vCurrentLayer][i+1].PlacePosX
			 vPattern.Layer[vCurrentLayer][i].PlacePosY = vPattern.Layer[vCurrentLayer][i+1].PlacePosY
			 vPattern.Layer[vCurrentLayer][i+1].PlacePosX = temp_x
			 vPattern.Layer[vCurrentLayer][i+1].PlacePosY = temp_y
			break;
		end_if
	end_for
while (NrSwaps < 1)
Kost dat teveel tijd dan heb je nog andere algorithmes zoals bijv. quicksort.
De belangrijkste wet in de wetenschap: 'hoe minder efficient en hoe meer herrie, hoe leuker het is'
Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

https://www.dropbox.com/s/p120nsuv5l1fq ... n.png?dl=0

zit ik weer te k#tten...

hoe reken ik uit van de midden van de box naar die rode punt....
Laatst gewijzigd door Swets op 21 jul 2022 21:21, 3 keer totaal gewijzigd.
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 12045
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door hugo stoutjesdijk »

Volgens mij hetzelfde als het begin van je verhaal.
halve-lengte*cos(H1)+halve breedte*cos(H2) en halve-lengte*sin(H1)+halve breedte*sin(H2)
Maar volgens mij heb je ergens een onlogisch dingetje in je opzet waardoor je steeds ruzie hebt met plussen en minnen.
Dat verhaal over dat 3e kwadrant, drong pas later tot me door, maar eigenlijk betekend het gewoon dat je coordinaat -x en -y wordt.
Als je nu eens begint met in je plaatjes de +X en +Y as aan te geven, anders kloppen de hoeken en de richtingen ook niet natuurlijk. ( Volgens de standaard althans. Als je genoeg + en - wisselt en sin, cos komt je uiteindelijk wel op het juiste punt )
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

hugo stoutjesdijk schreef:Volgens mij hetzelfde als het begin van je verhaal.
halve-lengte*cos(H1)+halve breedte*cos(H2) en halve-lengte*sin(H1)+halve breedte*sin(H2)
Maar volgens mij heb je ergens een onlogisch dingetje in je opzet waardoor je steeds ruzie hebt met plussen en minnen.
Dat verhaal over dat 3e kwadrant, drong pas later tot me door, maar eigenlijk betekend het gewoon dat je coordinaat -x en -y wordt.
Als je nu eens begint met in je plaatjes de +X en +Y as aan te geven, anders kloppen de hoeken en de richtingen ook niet natuurlijk. ( Volgens de standaard althans. Als je genoeg + en - wisselt en sin, cos komt je uiteindelijk wel op het juiste punt )
ik werk in het 3d Kwadrant, omdat die plc schermen bijna altijd in het 3de kwadrant werken.... links bovenin 0,0, rechts onderin 800,600

en ja... dat wisselen doe ik ook :-) in de hoop dat het goed kom.... want ik kan die doosjes ook nog draaien.... dus dan wisselt de lengte en de breedte... daarom ben ik het af en toe helemaal de weg kwijt...
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 12045
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door hugo stoutjesdijk »

ik werk in het 3d Kwadrant, omdat die plc schermen bijna altijd in het 3de kwadrant werken.... links bovenin 0,0, rechts onderin 800,600
Ja, ik ken dat, maar dat is gewoon een kwestie van op het allerlaagste niveau (600-Y) schrijven en je nulpunt ligt links onder.
En dan werkt de wiskunde weer hetzelfde als 30 jaar geleden op school, en je CNC en de rest van de wereld.
Op dat punt doe ik ook de schaling naar pixels. En een nulpuntverplaatsing waar de oorsprong op het scherm komt.
( kunnen ze dat nou nog niet in die grafische functies ? Volgens mij kun je onder de Windows API gewoon een virtueel assenkruis definieren, met schaling en nulpunt zoals jij het wilt, is al weer een poos geleden dat ik daarmee gewerkt heb)


Begrijp eigenlijk niet waarom je dat 3e kwadrant noemt, maar dat maakt mij ook niets uit hoe het heet, als je het juiste pixel maar benoemd krijgt.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

heet het niet zo dan?

ik heb nog eens gekeken op internet, maar we zitten dus in het 4de kwadrant.... :-)
x richting is positief, y richting is negatief....

Beide negatief is het 3de kwadrant.... sorry..

Afbeelding
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 12045
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door hugo stoutjesdijk »

Maakt ook niet uit ;-)
Maar in het 4e kwadrant heb je een negatieve Y-waarde, daar ben ik het mee eens, maar op je scherm moet je in omgekeerde richting rekenen. Als je dat pas helemaal op het laats omzet, dan gaat het denkwerk wel kloppen met wat we ooit geleerd hebben.
O en oeps, dan wil je natuurlijk de kleinste X en de GROOTSTE Y als eerste tekenen, die zit nl achteraan.

Hoeveel doosjes kunnen er eigenlijk maximaal op zo'n pallet ?
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

hugo stoutjesdijk schreef:Maakt ook niet uit ;-)
Maar in het 4e kwadrant heb je een negatieve Y-waarde, daar ben ik het mee eens, maar op je scherm moet je in omgekeerde richting rekenen. Als je dat pas helemaal op het laats omzet, dan gaat het denkwerk wel kloppen met wat we ooit geleerd hebben.
O en oeps, dan wil je natuurlijk de kleinste X en de GROOTSTE Y als eerste tekenen, die zit nl achteraan.

Hoeveel doosjes kunnen er eigenlijk maximaal op zo'n pallet ?
ja, tekenen in dat scherm is allemaal heel basic... dus een beetje lijnen en rechthoeken enzo...

en ik moet de pallet zeg maar achter vandaan naar voren vullen, om dat ik dan eerst het achterste doosje teken, en dan de volgende er voor...

dus ik moet uit de data uit zien te zoeken welk doosje de laagste x, en de laagste y heeft.... ik doe het nu dus zo:

Code: Selecteer alles

for  ySearch:=0 to vPattern.PalletData.Width do
        for xSearch:=0 to vPattern.PalletData.Length Do
            for searchBox:=1 to vBoxNbrMax Do
              if vPattern.Layer[vCurrentLayer][searchBox].PlacePosY=ySearch & vPattern.Layer[vCurrentLayer][searchBox].PlacePosX=xSearch & vPattern.Layer[vCurrentLayer][searchBox].NbrBoxes>0 then
                
                vDrawBoxArray[tel]:=searchBox;
                tel:=tel+1;
              end_if;
            end_for;
        end_for;
     end_for;
en dit werk perfect... alleen duurt te lang.... zo'n plc probeert het hele verhaaltje ook in een cyclus te doen.... dus ik ga nu iets van 1000x1200x50 keer rond in die lussen...
om 50 doosjes te sorteren...

nu begin ik dus bij 0.0 en ga zo alles af tot 1200.1000 en elke doosje wat ik tegen kom, gooi ik zijn nummer in een "nieuwe" array "vDrawBoxArray"

en in die array staat dan van boven naar beneden het nummer van de box,

stukje verder op bij het tekenen... begin ik met dat eerst doosje...
en dan krijg je dit:


https://www.dropbox.com/s/p7h0uxs5jl0qy ... d.PNG?dl=0

https://www.dropbox.com/s/9ppxi4dpdk3xi ... d.PNG?dl=0

Dus tja... langzaam komen we er wel...

edit: oja... Max 50 doosjes per laag... dus ik denk dat dat sorteren van hoog naar laag sneller moet kunnen....
Laatst gewijzigd door Swets op 21 jul 2022 21:21, 3 keer totaal gewijzigd.
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 12045
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door hugo stoutjesdijk »

max 50 doosjes, maak er 120 van ( 12x10)
Je maakt een array van 12x10, pakt een positie van een doosje, en zet ID van dat doosje op array[(intpositieX/100),int(positieY/100)] de kans is dan toch wel erg klein dat je 2 doosjes binnen die 100 mm hebt volgens mij
Dat doe je voor beide assen, en dan heb je je tabelletje wat je afloopt, kijkt even welke positie er in staat en tekend een doos, als de cel niet leeg is.
Dan zou je nog een tellertje bij kunnen houden dat je per PLC cyclus maar 1 laag tekend ( althans ik denk dat dat wel kan, want ik weet niets van PLC's )
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

Code: Selecteer alles

for i:=1 to vBoxNbrMax Do// alles naar de plaatsings array kopieren
  vDrawBoxArray[i].boxX:=vPattern.Layer[vLayout][i].PlacePosX ;
  vDrawBoxArray[i].boxY:=vPattern.Layer[vLayout][i].PlacePosY ;
  vDrawBoxArray[i].boxNr:=i ;
end_for;



Sorted := 0;

 While Sorted=0 Do
      Sorted := 1;
  For i := 1 To vBoxNbrMax-1 Do

     If vDrawBoxArray[i].boxY >= vDrawBoxArray[i+1].boxY  & vDrawBoxArray[i].boxX > vDrawBoxArray[i+1].boxX Then
          
          TempDrawArray:=vDrawBoxArray[i+1];
          vDrawBoxArray[i+1]:=vDrawBoxArray[i];
          vDrawBoxArray[i]:=TempDrawArray;
          
          Sorted := 0;
      End_If
  end_for;
end_while;

ik heb/had nu dit bovenstaande verhaal, en dat werk goed... althans... het doet het zelfde als die routine die alle pixels van de pallet bekeek, en dus 1200x1000x50 duurde..

hier kopieer ik de x,y in een andere array welke bestaat uit nummerdoosje, xdoosje, ydoosje...

dan die for-next lus, is nu maar het echte aantal doosje per laag lang... en het grootste aantal dozen wat ik heb per laag is 33... maar meestal zit het rond de 25...
en in de for-next lus, worden steeds 2 waarden vergeleken, en gewisseld van plaats...
hoevaak die do-while lus doorlopen word is een beetje afhankelijk van de data... maar dit werkt super snel...

Maar ik zit weer met een nieuw probleem.....
zo'n pallet gaat goed:

https://www.dropbox.com/s/mkm7zyzdtm83a ... d.PNG?dl=0

maar zo'n pallet:

https://www.dropbox.com/s/9t5uyg2mx0cn5 ... t.PNG?dl=0

gaat fout..... toestand.... en ik weet ook wel waarom....


https://www.dropbox.com/s/34zr8ghwise1g ... g.PNG?dl=0

omdat sommige doosjes gedraaid zijn, gaat dat verhaal met van voor naar achter verhaal niet helemaal op...
ik heb er ff getallen op gezet in de volgorde van tekenen... en als doos 8 getekend wordt, tekent hij over de hoek van doos 3...
eigenlijk had 7 en 8, eerder getekend moeten worden... en 3 ,4,5,6 later...

ik heb een 1 doosje zwart gemarkeerd.... dat teken ik dus van achter naar voor....

maar ik heb eigenlijk geen idee hoe ik dit nu weer op moet lossen..... pfffff...
Laatst gewijzigd door Swets op 21 jul 2022 21:22, 3 keer totaal gewijzigd.
http://www.arjan-swets.com (met cnc filmpjes)
Plaats reactie