spiraal plotten met vaste afstanden..
-
- Nieuw lid
- Berichten: 13
- Lid geworden op: 30 dec 2008, 18:51
spiraal plotten met vaste afstanden..
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
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
Re: spiraal plotten met vaste afstanden..
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:
Kom je hier verder mee?
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:
Kom je hier verder mee?
-
- Nieuw lid
- Berichten: 13
- Lid geworden op: 30 dec 2008, 18:51
Re: spiraal plotten met vaste afstanden..
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
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
Re: spiraal plotten met vaste afstanden..
Je spiraal hadden we al uitgedrukt in 1 onbekende, namelijk a.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..
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
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 ]
-
- Nieuw lid
- Berichten: 13
- Lid geworden op: 30 dec 2008, 18:51
Re: spiraal plotten met vaste afstanden..
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..
Ik ga het laatste verhaal eens "even" in een macro gieten, "the proof... is the eating"
Bedankt zover..
Kees
Tja, en dan moet er een trukendoos opengetrokken worden..arie schreef:Een tweede probleem is dat de vergelijking niet analytisch is op te lossen.
Ik ga het laatste verhaal eens "even" in een macro gieten, "the proof... is the eating"
Bedankt zover..
Kees
-
- Nieuw lid
- Berichten: 13
- Lid geworden op: 30 dec 2008, 18:51
Re: spiraal plotten met vaste afstanden..
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
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
Re: spiraal plotten met vaste afstanden..
Met een programmeerbare rekenmachine/computer gaat dit zeer snel.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.
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.
Pas op: in het voorbeeld hierboven snijdt de cirkel (met middelpunt R en straal D) de spiraal in 6 punten.audiomanics schreef: We weten dat de cirkel D de spiraal op 2 punten snijdt.
Nee, dat was het tweede probleem hierboven.audiomanics schreef: is het mogelijk (eventueel uitgedrukt in de spiraal hoek) die twee hoeken er zonder benadering (halveringsmethode) uit te persen?
Dan hoef je alleen het interval maar aan te passen (het punt voor R op de spiraal: a in [2.25, 2.5])audiomanics schreef: Beide hoeken zijn in principe bruikbaar: als ik de spiraal van buiten naar binnen wil volgen bijvoorbeeld.
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.
Dit is de oorzaak van het tweede probleem.audiomanics schreef: 't probleem waar ik tegen op loop is dat de hoek zich in de term SIN of COS bevindt maar ook daarbuiten..
Voorbeeld:audiomanics schreef: maar het is maar 1 kwadraat.. met de vierkantsvergelijking moet die er dus zo uitvallen..
x^2 - x*cos(x) - 9 = 0
Hoe los je hieruit x op?
Hieronder de berekening in Pari/GP.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?
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);
);
}
In welke taal / omgeving schrijf jij je macro???
-
- Nieuw lid
- Berichten: 13
- Lid geworden op: 30 dec 2008, 18:51
Re: spiraal plotten met vaste afstanden..
In G-code.. dat is een taal om CNC-machines aan te sturen.arie schreef:Vraag:
In welke taal / omgeving schrijf jij je macro???
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 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
-
- Nieuw lid
- Berichten: 13
- Lid geworden op: 30 dec 2008, 18:51
Re: spiraal plotten met vaste afstanden..
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
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
Re: spiraal plotten met vaste afstanden..
Klopt, de factor (d*a) voor de cos() en sin() is de straal van dat moment.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
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
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
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
-
- Nieuw lid
- Berichten: 13
- Lid geworden op: 30 dec 2008, 18:51
Re: spiraal plotten met vaste afstanden..
'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:
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
Re: spiraal plotten met vaste afstanden..
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.
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.
-
- Nieuw lid
- Berichten: 13
- Lid geworden op: 30 dec 2008, 18:51
Re: spiraal plotten met vaste afstanden..
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
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
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
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
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