Proteus, KiCAD и другие ECAD Разработчик так или иначе сталкивается с системами автоматизированного проектирования. Данный раздел - по САПР. |
23.10.2007, 10:48
|
|
Частый гость
Регистрация: 12.02.2007
Сообщений: 40
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Сообщение от Dammit
|
Честно говоря, ромбик меня сильно напугал...
Такое ощущения, что где-то игнорируются приращения (не вычисляются), чтобы получился круг... никак не могу понять...
|
Погрешность вычислений - вообще вещь нехорошая. Но реализовать тип double на МК для рисования на экране - тоже лишнее.
|
|
|
|
23.10.2007, 14:40
|
|
Прописка
Регистрация: 09.08.2006
Адрес: Днепр
Сообщений: 59
Сказал спасибо: 21
Сказали Спасибо 34 раз(а) в 14 сообщении(ях)
|
Вот еще вариант. Надо только определить функцию вывода пиксела и линии(для заливки окружности).
int8 - byte
int1 - boolean
Код:
|
void glcd_circle(int8 x, int8 y, int8 radius, int1 fill, int1 color)
{
signed int8 a, b, P;
a = 0;
b = radius;
P = 1 - radius;
do
{
if(fill)
{
glcd_line(x-a, y+b, x+a, y+b, color);
glcd_line(x-a, y-b, x+a, y-b, color);
glcd_line(x-b, y+a, x+b, y+a, color);
glcd_line(x-b, y-a, x+b, y-a, color);
}
else
{
glcd_pixel(a+x, b+y, color);
glcd_pixel(b+x, a+y, color);
glcd_pixel(x-a, b+y, color);
glcd_pixel(x-b, a+y, color);
glcd_pixel(b+x, y-a, color);
glcd_pixel(a+x, y-b, color);
glcd_pixel(x-a, y-b, color);
glcd_pixel(x-b, y-a, color);
}
if(P ‹ 0)
P += 3 + 2 * a++;
else
P += 5 + 2 * (a++ - b--);
} while(a ‹= b);
} |
|
|
|
|
23.10.2007, 17:05
|
|
Частый гость
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Все равно выводит подобный ромбик!
Это катастрофа какая-то!!!
Я использовал вначале компилятор CodeVisionAVR 1.24.8d, подумал глюк компилятора...
Перешел на 1.25.7a - то же самое!
Ромбик и все тут...
Из моей первой реализации
tswitch как вроде бы игнорируется, такое ощущение, что он всегда › 0 и во всем цикле віполняется код ветвление, где y--! Хотя так не должно! Вначале ведь tswitch‹0.
Проверил вручную. Вместо "tswitch = 3 - 2 * radius;" подставил в что положительное, что отрицательное большые левые числа - результат одинаков! Выводится ромб! Как такое может быть?
|
|
|
|
23.10.2007, 17:07
|
|
Частый гость
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
В последней реализации игнорируется if(P‹0)...
Самое зло... это только с алгоритмом черчения круга такое... везде далее никогда подобного не замечал...
|
|
|
|
23.10.2007, 18:59
|
|
Частый гость
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
УРА ТОВАРИЩИ!!! МЕТОД ТЫКА ПРОКОНАЛ!
Теперь и круги выводим! Скриншот прилагается!
Может мне кто-то объяснит, почему переменную d нужно вынести из функции рисования круга и сделать глобальной и написать вот такие директивы? (regalloc-) (regalloc+):
Код:
|
#pragma regalloc-
int d;
#pragma regalloc+
void glcd_circle(unsigned char x, unsigned char y, unsigned char radius)
{
int dx=0, dy;
dy=radius;
d=3-((int)radius‹‹1);
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(x+dy,y+dx);
glcd_putpixel(x-dy,y+dx);
glcd_putpixel(x+dy,y-dx);
glcd_putpixel(x-dy,y-dx);
if (d ‹ 0)
d += ((dx‹‹2) + 6);
else
{
d += (((dx - dy)‹‹2) + 10);
dy--;
}
dx++;
}
}
ЧТО ЭТО ЗА ХРЕНОТЕНЬ ТАКАЯ ПОЛУЧАЕТСЯ?
Спасибо всем, алгоритмы всех работают! |
-- Прилагается рисунок: --
|
|
|
|
23.10.2007, 19:13
|
|
Частый гость
Регистрация: 12.02.2007
Сообщений: 40
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Сообщение от Dammit
|
Может мне кто-то объяснит, почему переменную d нужно вынести из функции рисования круга и сделать глобальной и написать вот такие директивы?
|
а по-моему просто надо заменить сравнение d›0 на d‹0
сам проверял так:
Код:
|
procedure circle32(const Xc,Yc,radius,c:Integer);
var x,y,d:Integer;
begin
d:=3-(radius shl 1);
x:=0;
y:=radius;
while x‹y do
begin
putpixel(Xc+x,Yc+y,c);
putpixel(Xc+x,Yc-y,c);
putpixel(Xc-x,Yc+y,c);
putpixel(Xc-x,Yc-y,c);
putpixel(Xc+y,Yc+x,c);
putpixel(Xc+y,Yc-x,c);
putpixel(Xc-y,Yc+x,c);
putpixel(Xc-y,Yc-x,c);
if d‹0 then
d:=d+(x shl 2)+6
else
begin
d:=d+((x-y)shl 2)+10;
Dec(y);
end;
Inc(x);
end;
end; |
-- Прилагается рисунок: --
|
|
|
|
24.10.2007, 12:33
|
|
Прописка
Регистрация: 09.08.2006
Адрес: Днепр
Сообщений: 59
Сказал спасибо: 21
Сказали Спасибо 34 раз(а) в 14 сообщении(ях)
|
Очень может быть, что где-то в проекте есть уже локальная переменная d, только обьявлена как беззнаковая, и компилятор на этом тупит. Да и кстати, а AVR C int - знаковое или беззнаковое? Может надо просто добавить signed int?
|
|
|
|
24.10.2007, 17:57
|
|
Частый гость
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Неа, ни то ни другое не конает, пробовал менять - пофигу...
Наверное, какой-то глюк компилятора СodeVision... но по идее такого не должно быть...
Пробовал переписывать функцию и в "lib", и "h", и "c" - пофигу, одно и то же...
Может протеус глючит с его моделями контролеров?
Как-то не думаю...
И нигде не объявлено никакой другой переменной d, signed тоже не работает, только такое...
|
|
|
|
24.10.2007, 19:04
|
|
Частый гость
Регистрация: 12.02.2007
Сообщений: 40
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Взял фрагмент кода с http://democoder.ru/article/12 , запустил, получил ромбик, поменял d›0 на d‹0 - заработало правильно.
Код:
|
procedure circle32(const Xc,Yc,radius,c:Integer);
var x,y,d:Integer;
begin
d:=3-(radius shl 1);
x:=0;
y:=radius;
while x‹y do
begin
putpixel(Xc+x,Yc+y,c);
putpixel(Xc+x,Yc-y,c);
putpixel(Xc-x,Yc+y,c);
putpixel(Xc-x,Yc-y,c);
putpixel(Xc+y,Yc+x,c);
putpixel(Xc+y,Yc-x,c);
putpixel(Xc-y,Yc+x,c);
putpixel(Xc-y,Yc-x,c);
if d‹0 then
d:=d+(x shl 2)+6
else
begin
d:=d+((x-y)shl 2)+10;
Dec(y);
end;
Inc(x);
end;
end; |
|
|
|
|
25.10.2007, 10:12
|
|
Прописка
Регистрация: 07.08.2005
Сообщений: 178
Сказал спасибо: 16
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
А как на счет элепса или отрисовки указанного сегмента, то есть от такого то угла до такого?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:03.
|
|