spiraal plotten met vaste afstanden..

Heb je een leuke wiskunde puzzel of een mooi vraagstuk gevonden en wil je die met ons delen? Post het hier.
Plaats reactie
audiomanics
Nieuw lid
Nieuw lid
Berichten: 13
Lid geworden op: 30 dec 2008, 18:51

spiraal plotten met vaste afstanden..

Bericht door audiomanics » 14 sep 2015, 11:58

https://www.dropbox.com/s/u7qyu1qh9a7g7 ... l.jpg?dl=0
Het gaat om het volgende: ik wil een macro schrijven om op vaste afstanden van elkaar een punt te zetten over een Archimedesspiraal. De gegevens die ik heb zijn de initiele radius (R), de toename van de spiraal per 360 graden(d), de afstand van de punten (D).
R* is dus afhankelijk van de toename per 360 graden en de ingesloten hoek(a). R*=R+(a*d/360)
Verder kan ik het wel in plotcoordinaten voor de machine omzetten, maar na uren stoeien met cosinusregel, sinusregel etc etc.. kom ik er nog niet uit..
wie helpt me bij de formule?

Kees

arie
Moderator
Moderator
Berichten: 3916
Lid geworden op: 09 mei 2008, 09:19

Re: spiraal plotten met vaste afstanden..

Bericht door arie » 15 sep 2015, 20:20

Je spiraal, met centrum in de oorsprong, kan je weergeven met:





waarbij
r = straal, afhankelijk van a
a = aantal omwentelingen
d = toename van de straal per omwenteling (constante)

alfa = hoek, afhankelijk van a
alfa0 = starthoek (constante)

Het min-teken in de 2e formule betekent dat de spiraal groter wordt in de richting van de klok: als r groter wordt, dan wordt a groter en de hoek negatiever (= rechtsom).
Dit is wat je aangeeft met R en R* in je figuur.
Wil je de spiraal linksom laten groeien, dan moet je van die min een plus maken.

Voorbeeld, vergelijkbaar met je plaatje:
R = (3, 4)
d = 2

Uit R = (3, 4) volgt dat



dus a = r/d = 5/2 = 2.5

Ook weten we uit R = (3, 4) dat



dus



ofwel




Nu ligt je spiraal eenduidig vast:





waarbij je voor a = 2.5 in punt R belandt.
Merk op dat we r en alfa eenvoudig om kunnen zetten naar normale (= cartesiaanse) coördinaten in de vorm (x, y):
x = r * cos(alfa)
y = r * sin(alfa)


Uitgaande van R zoek je nu een punt R* dat over de spiraal gemeten een gegeven afstand D van R ligt.
Die R* ligt verder naar buiten op de spiraal.

De booglengte L (afhankelijk van a) van je spiraal is:



(zie bijvoorbeeld http://mathworld.wolfram.com/ArchimedesSpiral.html, formule (4) op die pagina, daar alleen met iets andere definitie van de spiraal).


In ons voorbeeld met d = 2 is
L(2.5) = 39.8982234...
dus de afstand vanuit de oorsprong, punt (0, 0), over de spiraal naar R is ongeveer 39.8982234.

Als je bijvoorbeeld zou kiezen voor D = 3, dan zoek je punt R* dat over de spiraal 3 eenheden verder van de oorsprong ligt dan punt R.
R* ligt dan dus op 39.8982234 + 3 = 42.8982234 van de oorsprong.
We zoeken nu nog een a* waarvoor
L(a*) = 42.8982234

Uit bovenstaande formule valt af te leiden (maar niet eenvoudig) dat dan
a* = 2.59355646129

In dat geval is





en





Dus als D = 3, dan is R* het punt (4.8911, 1.7271).

Hier een plaatje van de spiraal, R in blauw, om de 3 lengte-eenheden op de spiraal een rode punt:

Afbeelding

Kom je hier verder mee?

audiomanics
Nieuw lid
Nieuw lid
Berichten: 13
Lid geworden op: 30 dec 2008, 18:51

Re: spiraal plotten met vaste afstanden..

Bericht door audiomanics » 15 sep 2015, 23:12

Bedankt voor de reactie.. Ik ga 't eens bestuderen wat je allemaal schreef (het is nu te laat..)

Ik had het tijdelijk opgelost met een theodorus-spiraal die dan per punt weer gecompenseerd wordt voor de radius... Maar dan heb ik natuurlijk wel een (kleine) afwijking...
Ik ga er dus mee aan de slag..

Kees

arie
Moderator
Moderator
Berichten: 3916
Lid geworden op: 09 mei 2008, 09:19

Re: spiraal plotten met vaste afstanden..

Bericht door arie » 17 sep 2015, 22:21

audiomanics schreef: Ik kan het verhaal volgen en reproduceren.
Echter: ik zie dat je de afstand tussen de punten R en R' neemt over de spiraal, en wel booglengte L.. De afstand(D) tussen R en R' moet echter de koorde zijn (heet dat ook zo bij een spiraal?) Bij een kleine radius zit daar een redelijk groot verschil in.. naarmate de radius van dat boogdeel groter wordt zal de lengte van de koorde steeds dichter bij de booglengte komen..

Ik kan hier niet nog even een verduidelijkend plaatje uploaden, helaas..
maar als ik de afstand tussen de punten D noem, het eerste punt R op X0,Y0 ligt en R' op X1,Y1 is het: D^2 = (X0-X1)^2 + (Y0-Y1)^2..
Vervolgens heb ik een hele waslijst aan formules, maar daar heb ik steed meerder onbekenden in zitten die ik niet onderling eenvoudig kan vervangen voor iets anders..
Je spiraal hadden we al uitgedrukt in 1 onbekende, namelijk a.
In het voorbeeld:









Voor R hadden we:
a = 2.5
xR = 3.0
yR = 4.0

Punten die op afstand D van R liggen vormen de cirkel met middelpunt (xR, yR) en straal D:



Snij deze cirkel met je spiraal:



Omdat we xR, yR en D kennen (in het voorbeeld hierboven hadden we D = 3 gekozen) hebben we alleen 1 vergelijking met 1 onbekende over.

Het eerste probleem is dat we meerdere snijpunten verwachten.
De a* van het snijpunt op de spiraal dat we zoeken ligt tussen
a- = 2.5 (punt R, het middelpunt van de cirkel), en
a+ = 2.5 + 0.25 = 2.75, een punt R+, dat 90 graden verder op de spiraal ligt (eenvoudig na te gaan door de afstand tussen R en R+ te berekenen).

Een tweede probleem is dat de vergelijking niet analytisch is op te lossen.
Je kan a* wel benaderen via bijvoorbeeld de Halveringsmethode, zie
https://nl.wikipedia.org/wiki/Halveringsmethode

In dit geval neem je



en je start-interval (stap 1 van die pagina) = [2.5, 2.75]

Deze procedure herhaal je voor elk volgend punt (neem steeds het laatst gevonden punt R* als middelpunt van de volgende cirkel en pas het startinterval aan aan de a* die je het laatste vond).

Hier wat getallen waar ik op uitkom:

Code: Selecteer alles

a:               x:               y:
2.500000000000   3.000000000000   4.000000000000
2.594943357556   4.908592413198   1.685421204564
2.686448783995   5.213493232515  -1.299044491399
2.774867576509   3.867538053106  -3.980164528813
2.860494727200   1.321164576848  -5.566349297183
2.943580839828  -1.677855989674  -5.643002030862
3.024340980161  -4.324028972414  -4.229577627005
3.102961374194  -5.963601134820  -1.717247409008
3.179604562322  -6.230936005271   1.270817527877
3.254413424120  -5.096778167781   4.048169864125
3.327514362690  -2.836193419004   6.020416449519
3.399019853908   0.061345619557   6.797762910252
3.469030509070   3.011031373637   6.250630428876
3.537636760020   5.453097526660   4.508128519477
3.604920248023   6.952348609480   1.909620064485
3.670954977734   7.262891924461  -1.074263788737
3.735808283144   6.352759094168  -3.932875030445
3.799541641667   4.390659033316  -6.202272164313
3.862211364610   1.702657798350  -7.534431824723
3.923869186244  -1.290225427401  -7.740950581777
3.984562769123  -4.141597830146  -6.808386685380
4.044336139770  -6.445506637724  -4.886927810889
4.103230066125  -7.889846323395  -2.257501471856
4.161282386015  -8.291755471772   0.715454807077
4.218528294179  -7.612620173497   3.637573087818
4.275000594099  -5.953257363434   6.136876003548
4.330729919759  -3.532229214852   7.908491848977
4.385744931616  -0.651862752141   8.747234384258
4.440072490360   2.342632085352   8.565573523781
4.493737811471   5.105484220904   7.396536280116
4.546764603093   7.329216682239   5.382829762174
4.599175189397   8.776138041399   2.754823182957
4.650990621236   9.299849995413  -0.199110768441
4.702230775679   8.855517755535  -3.166023113052
4.752914445741   7.498951493739  -5.841789914803
4.803059421483   5.375663448285  -7.961140729566
4.852682563459   2.701915831815  -9.321682417064
4.901799869395  -0.259681597850  -9.800159861255
4.950426534824  -3.227233668793  -9.360120424106
4.998577008353  -5.926546607319  -8.051033085574
5.046265042127  -8.115600952092  -5.999682048908
5.093503737982  -9.604548773848  -3.395256126735
5.140305589742 -10.269863853412  -0.469960270773
5.186682522036 -10.061911497430   2.522823686956
5.232645925989  -9.005830234082   5.330793125039
5.278206692078  -7.196180684867   7.723525560775
5.323375240435  -4.786279828251   9.510248220082
5.368161548826  -1.973477451206  10.553389048394
5.412575178528   1.018165188590  10.777161959515
5.456625298288   3.956265623017  10.170889877675
5.500320706537   6.618104985237   8.787195110127
5.543669852016   8.806892068424   6.735558908342
5.586680852943  10.365230997575   4.172049637462
5.629361514850  11.185010486907   1.286228854934
en als plaatje (in groen geplot in vorig plaatje):

Afbeelding

Bedoelde je dit?

PS:
Hier een aantal mogelijkheden om plaatjes toe te voegen: viewtopic.php?f=15&t=5039
Die hierboven heb ik er via tinypic.com ingezet ( http://tinypic.com/ ).
Als je daar een plaatje upload, dan krijg je een aantal links,
gebruik die onder "IMG-code voor forums & berichtenforums", dus in de vorm [ img ] ....... [ /img ]

audiomanics
Nieuw lid
Nieuw lid
Berichten: 13
Lid geworden op: 30 dec 2008, 18:51

Re: spiraal plotten met vaste afstanden..

Bericht door audiomanics » 18 sep 2015, 07:53

Ik denk wel dat dit is wat ik bedoel.. Door deze zin snap ik ook dat ik er zelf niet zo 1-2-3 uit kwam..
arie schreef:Een tweede probleem is dat de vergelijking niet analytisch is op te lossen.
Tja, en dan moet er een trukendoos opengetrokken worden..
Ik ga het laatste verhaal eens "even" in een macro gieten, "the proof... is the eating"
Bedankt zover..
Kees

audiomanics
Nieuw lid
Nieuw lid
Berichten: 13
Lid geworden op: 30 dec 2008, 18:51

Re: spiraal plotten met vaste afstanden..

Bericht door audiomanics » 18 sep 2015, 10:44

bij nader inzien... de halveringsmethode is een iteratief proces waarbij ik de waarde steeds dichter bij de echte waarde zal krijgen.. stel dat ik het proces per punt ca 10 maal doorloop.. dan is dat een behoorlijke berekening al met al.
We weten dat de cirkel D de spiraal op 2 punten snijdt. is het mogelijk (eventueel uitgedrukt in de spiraal hoek) die twee hoeken er zonder benadering (halveringsmethode) uit te persen?
Beide hoeken zijn in principe bruikbaar: als ik de spiraal van buiten naar binnen wil volgen bijvoorbeeld.
't probleem waar ik tegen op loop is dat de hoek zich in de term SIN of COS bevindt maar ook daarbuiten.. maar het is maar 1 kwadraat.. met de vierkantsvergelijking moet die er dus zo uitvallen..
De tabel die je in de laatste post geplaatst hebt, is dat een spreadsheet? zou je die (of anders de celformules) willen delen met me?

Kees

arie
Moderator
Moderator
Berichten: 3916
Lid geworden op: 09 mei 2008, 09:19

Re: spiraal plotten met vaste afstanden..

Bericht door arie » 18 sep 2015, 22:17

audiomanics schreef:bij nader inzien... de halveringsmethode is een iteratief proces waarbij ik de waarde steeds dichter bij de echte waarde zal krijgen.. stel dat ik het proces per punt ca 10 maal doorloop.. dan is dat een behoorlijke berekening al met al.
Met een programmeerbare rekenmachine/computer gaat dit zeer snel.
Elke iteratie halveert het interval, dus elke 10 iteraties verkleinen het interval met een factor (1/2)^10 = 1/1024.
Ofwel: elke 10 iteraties leveren ongeveer 3 cijfers meer nauwkeurigheid.
Met 50 iteraties heb je je antwoord in ongeveer 15 cijfers nauwkeurig.
audiomanics schreef: We weten dat de cirkel D de spiraal op 2 punten snijdt.
Pas op: in het voorbeeld hierboven snijdt de cirkel (met middelpunt R en straal D) de spiraal in 6 punten.
audiomanics schreef: is het mogelijk (eventueel uitgedrukt in de spiraal hoek) die twee hoeken er zonder benadering (halveringsmethode) uit te persen?
Nee, dat was het tweede probleem hierboven.
audiomanics schreef: Beide hoeken zijn in principe bruikbaar: als ik de spiraal van buiten naar binnen wil volgen bijvoorbeeld.
Dan hoef je alleen het interval maar aan te passen (het punt voor R op de spiraal: a in [2.25, 2.5])
Let wel op: als we al te dicht op de oorsprong van de spiraal komen (als a heel klein wordt) komen we niet meer uit met dat 90 graden verschil.
audiomanics schreef: 't probleem waar ik tegen op loop is dat de hoek zich in de term SIN of COS bevindt maar ook daarbuiten..
Dit is de oorzaak van het tweede probleem.
audiomanics schreef: maar het is maar 1 kwadraat.. met de vierkantsvergelijking moet die er dus zo uitvallen..
Voorbeeld:
x^2 - x*cos(x) - 9 = 0
Hoe los je hieruit x op?
audiomanics schreef: De tabel die je in de laatste post geplaatst hebt, is dat een spreadsheet? zou je die (of anders de celformules) willen delen met me?
Hieronder de berekening in Pari/GP.
De solve() opdracht daarin vindt nulpunten, vergelijkbaar met de halveringsmethode.
Alles na \\ op een regel is commentaar.

Code: Selecteer alles

\\ set precision to 16 digits:
\p16

\\ function f(a): spiral - circle intersection:
f(a)={
(2*a*cos(alp0-2*Pi*a)-xr)^2 + (2*a*sin(alp0-2*Pi*a)-yr)^2 - D^2
}

\\MAIN PROGRAM:
{
\\ given parameters:
xr = 3.0;   \\ R = (xr, yr)
yr = 4.0;
d = 2.0;    \\ spiral rotation distance
D = 3.0;    \\ distance of the points

\\ calculate initial ar and alp0:
ar = sqrt(xr^2 + yr^2)/d;
alp0 = atan(yr/xr) + 2*ar*Pi;

\\ calculate next 20 values:
for(i=1,20,
  \\ calculate next ar value:
  alo = ar;                   \\ calculate interval boundaries: alo = too low value
  ahi = ar+0.25;              \\ ahi = too high value
  ar = solve(a=alo,ahi,f(a)); \\ find ar = solution of f(a)=0 in interval [alo, ahi]

  \\ now we have ar, calculate next point: R_star:
  r = d*ar;
  alp = alp0 - 2*Pi*ar;
  xr = r * cos(alp);
  yr = r * sin(alp);

  \\ print results:
  print(ar," ",xr," ",yr);
  );
}
Vraag:
In welke taal / omgeving schrijf jij je macro???

audiomanics
Nieuw lid
Nieuw lid
Berichten: 13
Lid geworden op: 30 dec 2008, 18:51

Re: spiraal plotten met vaste afstanden..

Bericht door audiomanics » 19 sep 2015, 10:31

arie schreef:Vraag:
In welke taal / omgeving schrijf jij je macro???
In G-code.. dat is een taal om CNC-machines aan te sturen.
De controller die ik gebruik (en nog vele anderen) is van Eding. Die heeft de mogelijkheid om macro's te programmeren. Een voorbeeld van zo'n macro is dit: (dit is die theodorus spiraal met een compensatie zodat het punt ook op de Archimedes-spiraal komt.. Er zit hier nog een fout in zodat D steeds groter wordt.. Ik moet die bug er dus nog uithalen..

Code: Selecteer alles

#100 = 0	; XCenter
#101 = 0	        ; YCenter
#102 = 5	        ; Radius binnenring
#103 = 100 	; Radius buitenring
#104 = 4 	; afstand dots D
#105 = 5	        ; afstand spiraalringen
#106 = 1	        ; richting Links = -1 rechts = 1
#110 = #102	; kopie initiele radius
#111 = 90	; initiele hoek

DLGMSG "Spiraal plotten" "Center X" 100 "Center Y" 101 "Radius binnenring" 102 "radius buitenring" 103 "afstand tussen dots" 104 "afstand spiraalringen" 105 "linksom 1 rechtsom -1" 106
if [#5398 == 1]          ; OK
	#206 = #102	; kopie initiele radius
	#111 = 90	; initiele hoek	
	#112 = #100	; X positie
	#113 = [#101 + #102]	; Y positie
	G0 X[#112] Y[#113]
	#114 = 0		        ;hoekteller gamma
	while [#103 > #206]
		#200 = SQRT[[#104 * #104]+[#110 *#110]] 	; R2		
		#201 = [ASIN[#104 / #200]]		; nieuwe ingesloten hoek
		#114 = [#114 + [#106 * #201]]		; Hoekteller
		#206 = [[[#105 * #114 * #106] / 360]+#102]	; nieuwe radius gecorrigeerd
		#202 = [#100 + [#206 * COS[#114]]]	; nieuwe xpositie
		#203 = [#101 + [#206 * SIN[#114]]]	; nieuwe ypositie
		GOSUB doewat()
	endwhile
 	M30
Endif

SUB doewat
	G0 X[#202] Y[#203] F2000
	G1 Z-1.00 F300
	G0 Z10 F2000
ENDSUB
Ik denk ook wel dat ik met ca 3-5 iteraties voldoende nauwkeurigheid heb omdat de machines meestal beperkt zijn tot een nauwkeurigheid van 1/100 mm
Ik zal me eens buigen over jouw code.. zien of ik het snap wat daar staat..(ik ken dat programma en de syntax die daar gebruikt wordt niet..)
Kees

audiomanics
Nieuw lid
Nieuw lid
Berichten: 13
Lid geworden op: 30 dec 2008, 18:51

Re: spiraal plotten met vaste afstanden..

Bericht door audiomanics » 20 sep 2015, 11:24

Het programma werkt, met de gegevens die we hier gebruikt hebben kom ik op nagenoeg dezelfde waarden uit die je in de tabel hebt staan (de cijfers die ik hier heb zijn slechts 4 cijfers achter de komma, wat de resolutie van het programma is weet ik niet)
Echter als ik een spiraal neem die bijvoorbeeld 3mm per omwenteling wijkt zie ik dat de afstand D naar nul loopt.. vervolgens loopt het programma vast.
Ik moet dus nog ergens een foutje hebben dat met d=2 wel goed werkt maar met d=3 fout gaat..
Ik verwacht dat de formule (f(a)={(2*a*cos(alp0-360*a)-xr)^2 + (2*a*sin(alp0-360*a)-yr)^2 - D^2) zelf universeel is.. (het programma rekent met graden vandaar dat 2*Pi vervangen is door 360)

Kees
Edit: als ik de 2 in de term 2*a*cos(.. vervang door d werkt het wel.. de formule is dus:
(f(a)={(d*a*cos(alp0-360*a)-xr)^2 + (d*a*sin(alp0-360*a)-yr)^2 - D^2)
correct?
Kees

arie
Moderator
Moderator
Berichten: 3916
Lid geworden op: 09 mei 2008, 09:19

Re: spiraal plotten met vaste afstanden..

Bericht door arie » 20 sep 2015, 16:27

audiomanics schreef:als ik de 2 in de term 2*a*cos(.. vervang door d werkt het wel.. de formule is dus:
(f(a)={(d*a*cos(alp0-360*a)-xr)^2 + (d*a*sin(alp0-360*a)-yr)^2 - D^2)
correct?
Kees
Klopt, de factor (d*a) voor de cos() en sin() is de straal van dat moment.
Ik had hem inderdaad nog hard gecodeerd staan op d=2, jouw formule is de correcte.
Hieronder nog enkele berekeningen:


Met
R = (3, 4)
d = 3
D = 3
kom ik uit op deze getallen:

Code: Selecteer alles

a:                 x:                 y:
1.666666666666667  3.000000000000000  4.000000000000000
1.760523293201221  4.983478368106962  1.749263773061858
1.849528576772492  5.412833105219281 -1.219853016442928
1.934369538618356  4.227306352482894 -3.975669831571669
2.015584333634139  1.820280668943847 -5.766263967266128
2.093603948741931 -1.151842270645731 -6.174289986001948
2.168779960854894 -3.972571846345208 -5.152779016518876
2.241403667659453 -6.032069959392689 -2.971387826852551
2.311719662467137 -6.934282326737977 -0.110266919898563
2.379935708898622 -6.540318527982402  2.863752670701014
2.446230079557648 -4.956745349896470  5.411751098810188
2.510757112863317 -2.484255400149717  7.110807733652387
2.573651490438509  0.455807899835519  7.707488378620804
2.635031578023042  3.400897851274087  7.136134567103309
2.695002069165007  5.919793132060587  5.506666382562260
2.753656101841071  7.669447192676838  3.069719385155656
2.811076971122679  8.431554677148724  0.168134958999503
2.867339528372708  8.127872124369427 -2.816454947024011
2.922511334421230  6.816158856733098 -5.514492808787042
2.976653617649739  4.670515444094302 -7.611207941035518
3.029822075895872  1.950923872419780 -8.877628757066627
en met
R = (3, 4)
d = 3
D = 2
op deze getallen:

Code: Selecteer alles

a:                 x:                 y:
1.666666666666667  3.000000000000000  4.000000000000000
1.729292140836019  4.466117634855609  2.639669495760168
1.789717972563589  5.305495990807470  0.824333720880063
1.848161202661074  5.419104172926732 -1.172436967245030
1.904805330494529  4.814133303122125 -3.078744981886907
1.959807156735468  3.587262034041331 -4.658234421264102
2.013301928413920  1.900628682356360 -5.733068332612231
2.065407274598383 -0.045043560374537 -6.196058099093655
2.116226263158844 -2.036660353309700 -6.013130380858677
2.165849807335910 -3.871799595855559 -5.217980105458982
2.214358583630624 -5.377016944607166 -3.901043989689814
2.261824577134771 -6.420662635924277 -2.194936234887900
2.308312339145472 -6.920117899471136 -0.258303993156048
2.353880019969631 -6.843852735190882  1.740241384041404
2.398580224183440 -6.209042820800248  3.636821562307368
2.442460724295314 -5.075679705517813  5.284695358724221
2.485565060460435 -3.538188175590392  6.563804343682673
2.527933047731159 -1.715552407930602  7.387211204503742
2.569601207697206  0.259127653168241  7.704447167626889
2.610603137854129  2.248854304994227  7.501992602320623
2.650969829343123  4.122081828590802  6.801265376618463
en met
R = (1, 5)
d = 3
D = 2
op deze getallen:

Code: Selecteer alles

a:                 x:                 y:
1.699673171197595  1.000000000000000  5.000000000000000
1.761120036969830  2.910758960061705  4.409237614142612
1.820485334990215  4.462927912087637  3.147979692713883
1.877967600781983  5.454349416622645  1.411004332973411
1.933735653191476  5.773791889568261 -0.563319983464592
1.987934476615209  5.401340457088284 -2.528333960626997
2.040689684967468  4.398212112529925 -4.258574846845909
2.092110964407971  2.889578950720776 -5.571596546243802
2.142294766773775  1.043733179279906 -6.341566278151400
2.191326443975385 -0.949574922496734 -6.505037411357261
2.239281959008604 -2.899417309371943 -6.059936674057501
2.286229271955029 -4.631025347906900 -5.059170167383184
2.332229473412398 -5.999231172625152 -3.600399170548160
2.377337719448013 -6.897591507925798 -1.813516771519474
2.421604008983788 -7.263205338140196  0.152780898508123
2.465073834912334 -7.077565673396636  2.144146740053543
2.507788733148905 -6.364013591071600  4.012526633386161
2.549786748523112 -5.182499298755877  5.626225482940710
2.591102832409695 -3.622413369320191  6.877677396829850
2.631769183941322 -1.794246392078158  7.688729493382055
2.671815544291573  0.179217887264268  8.013442810262467

audiomanics
Nieuw lid
Nieuw lid
Berichten: 13
Lid geworden op: 30 dec 2008, 18:51

Re: spiraal plotten met vaste afstanden..

Bericht door audiomanics » 20 sep 2015, 18:11

't klopt helemaal, nu ook beide kanten op.. Misschien nog even stoeien om de spiraal ook van buiten naar binnen te laten lopen.. Met zo'n perlage-stift geeft dat een bol effect ipv een hol effect.
Voor de volledigheid, hier de complete G-code macro:

Code: Selecteer alles

#100 = 0									; X-Center
#101 = 0									; Y-Center
#102 = 5									; Kleinste Radius
#103 = 10									; Grootste Radius 
#104 = 3									; afstand dots D
#105 = 2									; afstand spiraalringen
#106 = 1									; richting Links = -1 rechts = 1
#110 = 53.13010235 							; starthoek

DLGMSG "Spiraal plotten" "Center X" 100 "Center Y" 101 "Radius binnenring" 102 "radius buitenring" 103 "afstand tussen dots" 104 "afstand spiraalringen" 105 "linksom 1 rechtsom -1" 106 "starthoek" 110
if [#5398 == 1]								; OK
	#206 = #102							; kopie initiele radius
	#212 = [#102*cos[#110]]					; X positie
	#213 = [#102*sin[#110]]					; Y positie
	G0 X[#212] Y[#213]
;--------------------------------------------------------------------
	while [#103 > #206]
		#202 = ATAN[#213]/[#212]				; alpha X
		#203 = [SQRT[[#212**2] + [#213**2]] / #105]	; ar
		#204 = [#202 -#106*[#203*360]]			; alpha0
		#220 = 0.25						; grootste stap 0.25=90 graden
		#221 = #220						; werkkopietje
		#222 = 0.5							; deler
		#223 = [#203+#220]					; initiele zoekwaarde
		#227=1							; dummywaarde
;---------------------------------------------------------------------
		while [[#227 > 0.0001] OR [#227 < -0.0001]]	; hoe kleiner hoe nauwkeuriger 
			#224=[[#105*#223*cos[#204+#106*360*#223]-#212]**2]	; snijpunt X 
			#225=[[#105*#223*sin[#204+#106*360*#223]-#213]**2]	; snijpunt Y 
			#226=[#104 **2]					; D^2
			#227=[#224+#225-#226]				; afwijking >0
;---------------------------------------------------------------------
	  		if [#227>0]					; binair zoeken
	  			#223 = [#223 -[#222*#220]]					
	 		else
	  			#223 = [#223 + [#222*#220]]
			endif
			#222 = [#222/2]					; binair halveren
		endwhile							; tot juiste ar gevonden
;----------------------------------------------------------------------
		#205 = [#204 +#106*[#223*360]]			; alp0
		#206 = [#223 * #105]					; radius nieuw punt

		#232=#212							; kopie oude X tbv D berekening
		#233=#213							; kopie oude Y tbv  D berekening

		#212 = [#206 * COS[#205]]				; nieuwe X-positie
		#213 = [#206 * SIN[#205]]				; nieuwe Y-positie

		#234=sqrt[[#212-#232]**2 + [#213-#233]**2] ;lengte D
		msg "a: "#223" X: " #212 " Y: " #213 " D " #234
;------------------------------------------------------------------------
		GOSUB doewat()
;------------------------------------------------------------------------
	endwhile								; tot maximum radius is bereikt
;------------------------------------------------------------------------
	G0Z10									; en terug naar X0Y0Z10
	G0X0Y0
 	M30									; en uit....
Endif

SUB doewat
	G0 X[#212+#100] Y[#213+#101] F2000
;	G1 Z-0.00 F300
;	G0 Z10 F2000
ENDSUB

arie
Moderator
Moderator
Berichten: 3916
Lid geworden op: 09 mei 2008, 09:19

Re: spiraal plotten met vaste afstanden..

Bericht door arie » 20 sep 2015, 21:52

Mooi dat het werkt.

In het algemene geval zijn er nog wel wat aandachtspunten:

[1] atan() geeft een waarde tussen -PI/2 en PI/2 (ofwel -90 en 90 graden).
Voor R met negatieve xr moet je hiervoor nog corrigeren (180 graden optellen).
Sommige programmeertalen hebben een functie, bv.: atan2(x, y), die gegeven een punt (x, y) de juiste richtingshoek over de 4 quadranten teruggeeft.

[2] We hadden voor de bovengrens van het zoekinterval
ahi = ar + 0.25
genomen.
Om grotere D-waarden op te kunnen lossen kan je ook nemen:
ahi = ar + 0.50
voor kleinere D-waarden kost het 1 iteratieslag om weer terug te komen op ar + 0.25

[3] Echter: als je terug gaat richting het spiraalcentrum, wil je het verschil tussen alo en ahi zo klein mogelijk houden om zo veel mogelijk punten te kunnen vinden.
De variabele a mag niet kleiner dan nul worden.

audiomanics
Nieuw lid
Nieuw lid
Berichten: 13
Lid geworden op: 30 dec 2008, 18:51

Re: spiraal plotten met vaste afstanden..

Bericht door audiomanics » 20 sep 2015, 22:51

De functie ATAN is in dit programma ATAN2 waarbij je de waarden apart moet opgeven (aan weerszijde van het deelstreepje). Deze functie houdt dan al meteen rekening met het kwadrant waar de hoek zich bevindt https://en.wikipedia.org/wiki/Atan2 :D
Daar kwam ik achter omdat ik steeds een foutmelding kreeg dat er een slash miste, terwijl ik geen fout kom ontdekken in de syntax (#100=ATAN[0,25] zou moeten werken, dacht ik).. Even de maker van de controller gemaild en binnen een uur dit antwoord.. Best wel slim die ATAN2 :mrgreen:
Ik ga even uitzoeken waar het spaak loopt met die 0,25, dan kan ik daar nog wel een paar regels voor schrijven in het programma.
Zover het er nu uitziet loop het alle kanten goed op:
van binnen naar buiten, links- en rechtsom en van buiten naar binnen, links- en rechtsom.
Ik moet misschien nog even wat polijsten aan de code maar we zijn op de goede weg..
Kees

Plaats reactie