Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Proteus, KiCAD и другие ECAD Разработчик так или иначе сталкивается с системами автоматизированного проектирования. Данный раздел - по САПР.

Закрытая тема
Опции темы
Непрочитано 22.10.2007, 20:22   #1
Dammit
Частый гость
 
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Dammit на пути к лучшему
По умолчанию Реализация на С++ рисования окружности

Вообщем, написал библиотеку для 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++;
}
}

Реализация стандартна!
Но выводит РОМБ!

Ребят, в чем дело-то? Почему ромб вместо круга?
Спасибо огромное!!!

Скриншот протеуса прилагается....

-- Прилагается рисунок: --

Dammit вне форума  
Непрочитано 22.10.2007, 20:25   #2
Dammit
Частый гость
 
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Dammit на пути к лучшему
По умолчанию

Пожалуйста, подскажите, кто знает нормальный быстрый рабочий алгоритм вывода окружности (параметрический с синусами и косинусами просьба не предлагать) ? Или как подправить выше алгоритм?
Спасибо огромное
Dammit вне форума  
Непрочитано 22.10.2007, 21:56   #3
EXIS
Прописка
 
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
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
EXIS вне форума  
Непрочитано 22.10.2007, 22:04   #4
Dammit
Частый гость
 
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Dammit на пути к лучшему
По умолчанию

Сообщение от 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
Честно говоря, ромбик меня сильно напугал...
Такое ощущения, что где-то игнорируются приращения (не вычисляются), чтобы получился круг... никак не могу понять...
Dammit вне форума  
Непрочитано 22.10.2007, 22:17   #5
dimonbest
Гражданин KAZUS.RU
 
Аватар для dimonbest
 
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
dimonbest на пути к лучшему
По умолчанию

библиотечку сможешь выложить?
dimonbest вне форума  
Непрочитано 22.10.2007, 22:39   #6
EXIS
Прописка
 
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
EXIS на пути к лучшему
По умолчанию

Прогу писал в вижуал студии 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

-- Прилагается рисунок: --

EXIS вне форума  
Непрочитано 22.10.2007, 22:42   #7
Dammit
Частый гость
 
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Dammit на пути к лучшему
По умолчанию

dimonbest получил,
EXIS, тебе скинуть либу?
пока просто не афиширую всем, т. к. она не совсем готова до конца
стукни плз в 1529510 (не пугайся, если в офлайне)
Dammit вне форума  
Непрочитано 22.10.2007, 22:46   #8
EXIS
Прописка
 
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
EXIS на пути к лучшему
По умолчанию

Сообщение от Dammit
dimonbest получил,
EXIS, тебе скинуть либу?
пока просто не афиширую всем, т. к. она не совсем готова до конца
стукни плз в 1529510 (не пугайся, если в офлайне)
Да не не мне это dimonbest просит, мне бы кто помог ATmega8535 как 8 АЦП к ком порту запрораммировать.

https://kazus.ru/forum/topic_9001-20.html
EXIS вне форума  
Непрочитано 22.10.2007, 23:40   #9
Dammit
Частый гость
 
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Dammit на пути к лучшему
По умолчанию

сейчас попробую!!!
EXIS, сенкс! Результат доложу
Dammit вне форума  
Непрочитано 23.10.2007, 09:24   #10
crazy_blu
Прохожий
 
Регистрация: 20.04.2007
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
crazy_blu на пути к лучшему
По умолчанию

В свое время много рисовали. Мне кажется если надо быстро - алгоритм Брезенхэма очень удачный целочисленный алгоритм (http://democoder.ru/article/12 к примеру)
crazy_blu вне форума  
Закрытая тема

Закладки

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pulsonix для разводки плат,рисования схем,моделирования LEAS Proteus, KiCAD и другие ECAD 25 27.06.2017 02:19
Программа для рисования графиков на экране компьютера Don_Ambrosio Делимся опытом 4 04.11.2008 18:52
Урок рисования xerox2 Микроконтроллеры, АЦП, память и т.д 0 21.10.2008 19:17
Реализация RS485 And_N Поиск схем. Делимся схемами 11 23.03.2008 18:41
Станок для рисования плат. Sa1m0n Делимся опытом 8 22.08.2005 09:40


Часовой пояс GMT +4, время: 13:30.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot