Kreslení kružnice

ruzne programy,konverze dat, digitalizace, atd...
hlinskoelektrikar
Příspěvky: 8
Registrován: 14. 4. 2016, 6:10

16. 4. 2016, 1:13

Super takže ještě jednou se ujistím že chápu správně funkci IJ takže sem řekněme na souřadnici X0 Y0 parametry I30 a J10 udávají vzdálenost ke středu tj. Z výchozího bodu začnu obkreslovat bod ve vzdálenosti 30 od výchozího bodu a jakmile osa X překročí právě 30 nastaví se nová vzdálenost středu kružnice a to 10. A bude
pokračovat dokud se nedostanu na přímku.
Jsem správně?
prochaska
Sponzor fora
Příspěvky: 8346
Registrován: 16. 7. 2006, 12:33
Bydliště: Praha Bohnice + Roudnice nad Labem
Kontaktovat uživatele:

16. 4. 2016, 2:38

Chybí tam koncový bod, takže to neví, kde je konec toho oblouku (teď pominu, že by nějaký systém mohl místo vyhlášení chyby objet plnou kružnici, protože by předpokládál, že výchozí a koncový bod jsou totožné). Zkus to zadat i s tím X a Y, já pak zkusím popsat, co by to asi tak mohlo dělat :-)
Aleš Procháska
teensy
Příspěvky: 8
Registrován: 29. 6. 2014, 7:19

20. 7. 2016, 12:06

Dobrý den,

na začátku diskuze jste se ptal na algoritmus. Jak jsem pochopil píšete vlastní interpolátor, kterým řídíte krokové motory. Potřebujete tedy algoritmus, který vrací sekvenci příkazů "step X, step X, step Y, step X, atd." opisující kruhový oblouk. Teprve později jste se začal ptát jak funguje příkaz G-kódu. To už bylo vysvětleno, já bych se vrátil zpět k té úplně původní otázce a poradil s algoritmem.

Robokop měl pravdu. Algoritmus musí být rychlý, proto by neměl používat operace násobení/dělení (travají více taktů, při násobená vznikají velká čísla, při dělení zaokrouhlovací chyby) a už vůbec ne goniometrické funkce (bez ALU zaručeně emulované). Ideálně by si měl vystačit s celočíselnými operacemi sčítání, odečítání a porovnávání malých čísel (dle bitovosti použitého mikročipu). Takový algoritmus správně radil prochaska. Myslím že to byla přesně ta informace, kterou jste potřeboval. Jen to asi uniklo pozornosti.

Na začátek je dobré znát algoritmus interpolace rovné čáry. Např. vedoucí z bodu kde se nacházím, do bodu vzdáleného 37 kroků ve směru X a 21 kroků ve směru Y. Tato čára má sklon dy/dx = 21/37, který říká, že na každých 37 kroků v ose x musí algoritmus vyprodukovat 21 kroků v ose y a to rovnoměrně prostřídaných. A přesně tohle umí tento jednoduchý algoritmus:

vezmu číslo 37 a odečítám od něj číslo 21 tak dlouho dokud nevznikne záporné číslo. Pokud vznikne záporné číslo, přičtu k němu 37 a tak pořád dokola. Při každé operaci "odečítání" udělám krok v ose X, při každé operaci "sčítání" udělám krok v ose Y. A to tak dlouho dokud se nedostanu do cílového bodu (t.j. dokud neudělám 37 kroků v ose X a 21 korků v ose Y).

A teď k interpolaci kruhového oblouku. Při interpolaci rovné čáry se používaly konstanty dy = 21 a dx = 37. Jejich poměr určoval sklon čáry. Pokud by čára neměla být rovná, ale chtěli bychom opisovat křivku (aby čára například začala zatáčet nahoru), tak bychom v průběhu interpolace mohli konstanty dy a dx pozvolna měnit. Otázka zní, jak často a o kolik je mám měnit, aby vznikl kruhový oblouk a ne něco jiného ? Odpověď je překvapivě jednoduchá. Při každém kroku v ose X zmenšit dy o jedničku a při každém kroku v ose y zvětšit dx o jedničku.

Zdůvodnění je toto: pro kružnici se středem v počátku souřadné soustavy platí, že tečna v jejím libovolném bodě [X,Y] má sklon -Y/X. Takže naše dx by mělo mít v libovolné fázi interpolace totožnou hodnotu jako absolutní souřadnice Y bodu ve kterém se nacházíme. A podobně, dy by mělo mít stejnou hodnotu jako absolutní souřadnice X. Tedy až na opačné znaménko. Jenže to platí pro kruh se středem v počátku. Abychom nemuseli kruh posouvat do počátku souřadného systému, stavíme na tom, že dx a dy mají na počátku hodnotu nastavenou správně a dále při výpočtu jejich hodnoty už jen opravujeme. Takže když uděláme +1 krok v ose X, okamžitě opravíme dy o +1. Když uděláme +1 kork v ose Y, okamžitě opravíme hodnotu dx o -1.

Příklad: Pokud interpolaci začínám s hodnotami dy = 0 / dx = R, začínám vlastně s nulovým skolonem křivky, tedy začínám kreslit kružnici od jejího nejnižším bodu. Několik prvních kroků, které algorimtus vyprodukuje budou kroky v ose X. S každým krokem v ose X se bude zvětšovat hodnota dy a tím se mezi kroky X stále častěji budou objevovat kroky ve směru osy Y a křivka se z vodorovné začne stáčet nahoru. Tím že poleze nahoru (v ose Y) klesá hodnota dx (s každým krokem ve směru osy Y o 1) a tím klesá četnost kroků ve směru osy X. Po R krocích bude dx nulové a kroky ve směru X ustanou. A to už jsme na pravém okraji kružnice (je vykreslena celá čtvrtina kruhu). Písmeno R jsem nepoužil náhodně, takto vzniklý kruh má poloměr R kroků. Pro vykreslení zbývajících kvadrantů je potřeba otáčet znaménka toho co přičítám nebo odečítám.
doncarlos
Příspěvky: 755
Registrován: 9. 1. 2008, 9:49

20. 7. 2016, 6:07

Říká se tomu BRESSENHAMUV ALGORITMUS, někdy před 20-ti lety jsem ho udělal v assembleru (ještě pod DOSEM) a kreslil ďábelskou rychlostí na PC vektorovou grafiku
Uživatelský avatar
Habešan
Příspěvky: 1138
Registrován: 12. 12. 2013, 2:25
Bydliště: Čechy
Kontaktovat uživatele:

20. 7. 2016, 6:51

To už byly Windows 95...
prochaska píše:algoritmus, který se používal v dávnověku
Nedivil bych se, kdyby dodnes (třeba v tom GRBL).
Díky za popis.

V Apple Macintosh prý použili vzorec, ve kterém součet řady lichých čísel (1 až (2n-1)) dá druhou mocninu sudého čísla (n*n).
1+3=4
1+3+5=9
1+3+5+7=16

Prý také existoval extrémně jednoduchý způsob jak nakreslit kružnici, který může být dodnes vidět při poruše RAM v některých grafických systémech.
Koupím hliníkové profily délky cca 60cm, nabízím 90,-Kč/kg.
Odpovědět

Zpět na „Ostatní software“