PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bresenham-Algorithmus



_maddin
03.08.2008, 10:31
hallo.
ich habe auf der seite
http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo32.php
einen schönen kurzen algorihmus zum kreise zeichenen gefunden. den wollte ich gleich auf meinem glcd anwenden (mega644, glcd mit 240x128 pixeln).
aber die kreise die da rauskommen sehen nicht sehr schön "kreisig" =) aus.
je größer der radius (30+ pixel wird, desto rechteckiger werden die kreise. kleine kreise sind zwar als solche erkennbar aber nicht sehr schön. das kann ms paint besser =(.

ich würde gern wissen ob ich den den algorithmus falsch umgesetzt habe oder ob es bei diesem einfachen algorithmus einfach immer so ist.


void lcd_circle(unsigned char x, unsigned char y, unsigned char r){
signed char Y=r, X=0;
signed char F = 1-r;
lcd_setdot(x , y+r);
lcd_setdot(x+r , y);
lcd_setdot(x-r , y);
lcd_setdot(x , y-r);
while(X<Y){
X++;
if(F<0) F= F + 2*x - 1;
else {
F= F + 2*(x - Y);
Y--;
}
lcd_setdot(x+X , y+Y);
lcd_setdot(x-X , y+Y);
lcd_setdot(x+X , y-Y);
lcd_setdot(x-X , y-Y);
lcd_setdot(x+Y , y+X);
lcd_setdot(x-Y , y+X);
lcd_setdot(x+Y , y-X);
lcd_setdot(x-Y , y-X);
}
}

mfg maddin

_maddin
03.08.2008, 10:34
uh wie peinlich, der fehler ist so offensichtlich, dass ich ihn ne halbe stunde lang übersehen habe, es muss natürlich heißen


void lcd_circle(unsigned char x, unsigned char y, unsigned char r){
signed char Y=r, X=0;
signed char F = 1-r;
lcd_setdot(x , y+r);
lcd_setdot(x+r , y);
lcd_setdot(x-r , y);
lcd_setdot(x , y-r);
while(X<Y){
X++;
if(F<0) F= F + 2*X - 1;
else {
F= F + 2*(X - Y);
Y--;
}
lcd_setdot(x+X , y+Y);
lcd_setdot(x-X , y+Y);
lcd_setdot(x+X , y-Y);
lcd_setdot(x-X , y-Y);
lcd_setdot(x+Y , y+X);
lcd_setdot(x-Y , y+X);
lcd_setdot(x+Y , y-X);
lcd_setdot(x-Y , y-X);
}
}

sorry für den überflüssigen post. aber vllt interessierts ja jemanden, der sich auch mit glcds beschäftigt