Notes
Notes - notes.io |
„G01 X41.930159 Y203.200008 Z-0.125000”
„G02 X157.238097 Y69.346038 Z-0.125000 I-2.066544 J0.200699”
„G21”
A mondatot szavakra darabolja a szóközök mentén, és egyenként elemzi a kapott szavakat. Az első azonosítja a mozgás típusát, melyből síkvágás esetén két félét különböztetünk meg:
G00, G01: Egyenes vonalú mozgatást jelent, a két utasítás között a különbség, hogy G01 esetében az előtolást is meg lehet adni a szükségesebb paraméterek után.
G02: Kör interpoláció, azaz elmozdulás egy kör kerületén.
Mindkét típus megadja a célkoordinátát, melyet a későbbi szavakban található számok jelölnek .
A G02 esetén paraméterként még megkapjuk azon kör középpontjának koordinátáit, melynek a kerületén el kell mozdulnunk.
A G21 utasítás adja meg a koordinátarendszer léptékét, vagyis, hogy az X,Y, és Z szavakban található számokat milyen hosszmérték szerint kell értelmezni. A G21 arról tájékoztat, hogy ezek az értékek miliméterben értendők.
Ezzel elérkeztünk a feladat lényegi megvalósításához, azaz a G-kód végrehajtásához. Ahogy korábban kifejtésre került, bresenham megfelelő algoritmusait használjuk a különféle mozgások elvégzéséhez. Egyenes vonalú mozgás esetén a következő metódus fut le:
void G01(int x0, int y0, int x1, int y1) {
int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1;
int err = (dx>dy ? dx : -dy)/2, e2;
for(;;){
setPixel(x0,y0);
if (x0==x1 && y0==y1) break;
e2 = err;
if (e2 >-dx) { err -= dy; x0 += sx; }
if (e2 < dy) { err += dx; y0 += sy; }
}
}
Paraméterként szükségünk van az induló, és végkoordinátákra. Utóbbit a G-kód elemzése során meghatároztuk, az indulási pont pedig minden esetben a jelenlegi pozíciónk lesz, ami megegyezik az előző utasítás végpontjával.
Az algoritmus először kiszámolja a két pont koordinátái közötti különbséget, melyeket a dx, és dy változókban tárol, majd ezek alapján meghatározza, hogy a két síkon előre, vagy hátrafelé kell-e lépnünk. A léptetés során figyelembe kell venni, hogy a motor egy lépés során 1.8 fokot fordul el, az ékszíjat mozgató tengely átmérője egy centiméter, így egy lépés során 0.157 millimétert tesz meg a szerszám, tehát egy milliméternyi elmozdulás megtételéhez 6 teljes lépést, és egy negyed lépést kell az érintett motorral elvégezni.
A meredekséget az err változóban tároljuk. A legtöbb egyenes vonalú mozgás esetén az egyik síkon mindig lépünk, míg a másikon csak bizonyos időközönként. Azt, hogy a nem domináns síkon mikor kell lépnünk, az err változóval figyeljük. Az értéke növekszik, ha a domináns síkon lépünk, és mikor elérünk egy határértéket, a másik síkon is lépünk egyet, a hibaváltozót pedig csökkentjük. A léptetéseket addig hajtjuk végre, amíg a kezdő, és végkoordináták meg nem egyeznek, ezután elmentjük a mostani végkoordinátákat, és értesítjük a számítógépet, hogy végeztünk.
A körcikkeket rajzoló algoritmus a következőképpen valósul meg:
#include <math.h>
void G02(int x0, int y0, int x1, int y1, int cx, int cy)
{
int radius=(abs(cx-x)*abs(cx-x))+ (abs(cy-y)*abs(cy-y)) ;
radius=sqrt(radius);
int error = 1 - radius;
int errorY = 1;
int errorX = -2 * radius;
int x = radius, y = 0;
int dx=abs(x0-x1);
int dy=abs(y0-y1);
setPixel(cx, cy - radius);
setPixel(cx + radius, cy);
setPixel(cx - radius, cy);
setPixel(cx, cy + radius);
while(y < x && x<=dx && y<=dy)
{
if(error == 0)
{
x--;
errorX += 2;
error += errorX;
}
y++;
errorY += 2;
error += errorY;
setPixel(cx + x, cy + y);
setPixel(cx - x, cy + y);
setPixel(cx + x, cy - y);
setPixel(cx - x, cy - y);
setPixel(cx + y, cy + x);
setPixel(cx - y, cy + x);
setPixel(cx + y, cy - x);
setPixel(cx - y, cy - x);
}
}
Ez a kód a jelenlegi koordinátát, és a végkoordinátát kapja paraméterül, valamint a képzeletbeli kör középpontját, melyen az elmozdulást végezzük(a kör középpontjának koordinátáit a G02-es G-kódú utasítássorokban az ’I’, illetve ’J’ karakterek utáni számok mutatják).
Először Pitagorasz tételével kiszámítjuk a kör sugarát, majd a kezdő és végpontok x,y koordinátái közötti különbséget. A szerszám leengedése után a körcikk kezdő pozíciójába állunk, az elmozdulást a tengelyeken pedig egy-egy külön változóban tároljuk. Mikor az elmozdulás abszolút értéke eléri a két pont közti különbséget megállunk.
|
Notes.io is a web-based application for taking notes. You can take your notes and share with others people. If you like taking long notes, notes.io is designed for you. To date, over 8,000,000,000 notes created and continuing...
With notes.io;
- * You can take a note from anywhere and any device with internet connection.
- * You can share the notes in social platforms (YouTube, Facebook, Twitter, instagram etc.).
- * You can quickly share your contents without website, blog and e-mail.
- * You don't need to create any Account to share a note. As you wish you can use quick, easy and best shortened notes with sms, websites, e-mail, or messaging services (WhatsApp, iMessage, Telegram, Signal).
- * Notes.io has fabulous infrastructure design for a short link and allows you to share the note as an easy and understandable link.
Fast: Notes.io is built for speed and performance. You can take a notes quickly and browse your archive.
Easy: Notes.io doesn’t require installation. Just write and share note!
Short: Notes.io’s url just 8 character. You’ll get shorten link of your note when you want to share. (Ex: notes.io/q )
Free: Notes.io works for 12 years and has been free since the day it was started.
You immediately create your first note and start sharing with the ones you wish. If you want to contact us, you can use the following communication channels;
Email: [email protected]
Twitter: http://twitter.com/notesio
Instagram: http://instagram.com/notes.io
Facebook: http://facebook.com/notesio
Regards;
Notes.io Team