Proteus, KiCAD и другие ECAD Разработчик так или иначе сталкивается с системами автоматизированного проектирования. Данный раздел - по САПР. |
22.10.2007, 20:22
|
#1
|
Частый гость
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Реализация на С++ рисования окружности
Вообщем, написал библиотеку для CodeVision AVR для работы с графическим индикатором KS0108 (128x64)
Все отлично продумал, библиотека полная... Выводит текст, линии в ЛЮБОМ направлении рисует...
Но тут одна проблемка с окружностью выходит! В нете выкопал реализацию алгоритма Брезенхамера для быстрого рисования окружности... так вместо круга... ромб выводит!!!
Код вывода окружности:
...
void main(void)
{
glcd_init();
glcd_on();
/* glcd_rectangle(0,0,127,63);
glcd_rectangle(2,2,125,61);
glcd_line(0,0,127,63);
glcd_line(0,63,127,0);
glcd_texttrans(1);
glcd_gotoxy(5,1);
glcd_putsf("Тестування");
glcd_gotoxy(5,2);
glcd_putsf("іІндикатора!"); */
glcd_circle(10,10,10); // Выводит РОМБ вместо окружности!
...
Реализация вывода окружности:
// Малювання кола
void glcd_circle(unsigned char x, unsigned char y, unsigned char radius)
{
char tswitch, dy, dx = 0;
int d;
d = y - x;
dy = radius;
tswitch = 3 - 2 * radius;
while (dx‹=dy)
{
glcd_putpixel(x+dx,y+dy);
glcd_putpixel(x+dx,y-dy);
glcd_putpixel(x-dx,y+dy);
glcd_putpixel(x-dx,y-dy);
glcd_putpixel(y+dy-d,y+dx);
glcd_putpixel(y+dy-d,y-dx);
glcd_putpixel(y-dy-d,y+dx);
glcd_putpixel(y-dy-d,y-dx);
if (tswitch ‹ 0) tswitch += (4 * dx + 6);
else {
tswitch += (4 * (dx - dy) + 10);
dy--;
}
dx++;
}
}
Реализация стандартна!
Но выводит РОМБ!
Ребят, в чем дело-то? Почему ромб вместо круга?
Спасибо огромное!!!
Скриншот протеуса прилагается....
-- Прилагается рисунок: --
|
|
|
|
22.10.2007, 20:25
|
#2
|
Частый гость
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Пожалуйста, подскажите, кто знает нормальный быстрый рабочий алгоритм вывода окружности (параметрический с синусами и косинусами просьба не предлагать) ? Или как подправить выше алгоритм?
Спасибо огромное
|
|
|
|
22.10.2007, 21:56
|
#3
|
Прописка
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
На ассемблере для IBM PC X86 это делалось так.
Если захочешь переведешь на асм язык контроллера будет все шустро работать. А так подожди минут 30 я тебе этот код на "человеческий язык переведу"
Код:
|
si= радиус
ax= Х начала
bx= У начала
fast_circle:
push si
push ax
push bx
mov di,-1
mov ax,1
sub ax,si
loop:
inc di
cmp di,si
ja exit
pop bx
pop dx
push dx
push bx
push ax
add bx,di
add dx,si
putdot bx=x, dx=y
sub dx,si
sub dx,si
putdot bx=x, dx=y
sub bx,di
sub bx,di
putdot bx=x, dx=y
add dx,si
sdd dx,si
putdot bx=x, dx=y
sub dx,si
add dx,di
add bx,di
add bx,si
putdot bx=x, dx=y
sub dx,di
sub dx,di
putdot bx=x, dx=y
sub bx,si
sub bx,si
putdot bx=x, dx=y
add dx,di
add dx,di
putdot bx=x, dx=y
pop ax
test ax,ax
js slop:
mov dx,di
sub dx,si
shl dx,1
inc dx
add ax,dx
dec si
jmp loop
slop:
mov dx,di
shl dx,1
inc dx
add ax,dx
jmp loop
exit:
pop bx
pop ax
pop si
ret |
|
|
|
|
22.10.2007, 22:04
|
#4
|
Частый гость
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от EXIS
|
На ассемблере для IBM PC X86 это делалось так.
Если захочешь переведешь на асм язык контроллера будет все шустро работать. А так подожди минут 30 я тебе этот код на "человеческий язык переведу"
Код:
|
si= радиус
ax= Х начала
bx= У начала
fast_circle:
push si
push ax
push bx
mov di,-1
mov ax,1
sub ax,si
loop:
inc di
cmp di,si
ja exit
pop bx
pop dx
push dx
push bx
push ax
add bx,di
add dx,si
putdot bx=x, dx=y
sub dx,si
sub dx,si
putdot bx=x, dx=y
sub bx,di
sub bx,di
putdot bx=x, dx=y
add dx,si
sdd dx,si
putdot bx=x, dx=y
sub dx,si
add dx,di
add bx,di
add bx,si
putdot bx=x, dx=y
sub dx,di
sub dx,di
putdot bx=x, dx=y
sub bx,si
sub bx,si
putdot bx=x, dx=y
add dx,di
add dx,di
putdot bx=x, dx=y
pop ax
test ax,ax
js slop:
mov dx,di
sub dx,si
shl dx,1
inc dx
add ax,dx
dec si
jmp loop
slop:
mov dx,di
shl dx,1
inc dx
add ax,dx
jmp loop
exit:
pop bx
pop ax
pop si
ret |
|
Круто! Спасибки!
Я дописываю либу для AVR под CodeVision
Честно говоря, ромбик меня сильно напугал...
Такое ощущения, что где-то игнорируются приращения (не вычисляются), чтобы получился круг... никак не могу понять...
|
|
|
|
22.10.2007, 22:17
|
#5
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
библиотечку сможешь выложить?
|
|
|
|
22.10.2007, 22:39
|
#6
|
Прописка
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Прогу писал в вижуал студии 2005 на бейсике я думаю перевести на си или ассемблер МК (на будущее) тебе не составит труда.
Проанализировав алгорит подозреваю что в твоей программе нужно поменять
if (tswitch ‹ 0)
на
if (tswitch › 0)
толчно не знаю проверь.
Код:
|
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim radius = 20
Dim xstart = 60
Dim ystart = 50
Dim ax, bx, dx, si, di As Integer
di = -1
ax = -radius
cycle:
di = di + 1
If di › radius Then GoTo exitd
bx = ystart
dx = xstart
bx = bx + di
dx = dx + radius
e.Graphics.FillRectangle(Brushes.Black, bx, dx, 1, 1)
dx = dx - radius - radius
e.Graphics.FillRectangle(Brushes.Black, bx, dx, 1, 1)
bx = bx - di - di
e.Graphics.FillRectangle(Brushes.Black, bx, dx, 1, 1)
dx = dx + radius + radius
e.Graphics.FillRectangle(Brushes.Black, bx, dx, 1, 1)
dx = dx - radius + di
bx = bx + di + radius
e.Graphics.FillRectangle(Brushes.Black, bx, dx, 1, 1)
dx = dx - di - di
e.Graphics.FillRectangle(Brushes.Black, bx, dx, 1, 1)
bx = bx - radius - radius
e.Graphics.FillRectangle(Brushes.Black, bx, dx, 1, 1)
dx = dx + di + di
e.Graphics.FillRectangle(Brushes.Black, bx, dx, 1, 1)
If ax ‹ 0 Then GoTo slop
dx = di - radius
dx = dx * 2 + 1
ax = ax + dx
radius = radius - 1
GoTo cycle
slop:
dx = di
dx = dx * 2 + 1
ax = ax + dx
GoTo cycle
exitd:
End Sub |
-- Прилагается рисунок: --
|
|
|
|
22.10.2007, 22:42
|
#7
|
Частый гость
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
dimonbest получил,
EXIS, тебе скинуть либу?
пока просто не афиширую всем, т. к. она не совсем готова до конца
стукни плз в 1529510 (не пугайся, если в офлайне)
|
|
|
|
22.10.2007, 22:46
|
#8
|
Прописка
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Сообщение от Dammit
|
dimonbest получил,
EXIS, тебе скинуть либу?
пока просто не афиширую всем, т. к. она не совсем готова до конца
стукни плз в 1529510 (не пугайся, если в офлайне)
|
Да не не мне это dimonbest просит, мне бы кто помог ATmega8535 как 8 АЦП к ком порту запрораммировать.
https://kazus.ru/forum/topic_9001-20.html
|
|
|
|
22.10.2007, 23:40
|
#9
|
Частый гость
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
сейчас попробую!!!
EXIS, сенкс! Результат доложу
|
|
|
|
23.10.2007, 09:24
|
#10
|
Прохожий
Регистрация: 20.04.2007
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
В свое время много рисовали. Мне кажется если надо быстро - алгоритм Брезенхэма очень удачный целочисленный алгоритм ( http://democoder.ru/article/12 к примеру)
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:30.
|
|