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

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

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

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

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

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

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

 
Опции темы
Непрочитано 23.10.2007, 10:48  
yegorkin
Частый гость
 
Регистрация: 12.02.2007
Сообщений: 40
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
yegorkin на пути к лучшему
По умолчанию

Сообщение от Dammit
Честно говоря, ромбик меня сильно напугал...
Такое ощущения, что где-то игнорируются приращения (не вычисляются), чтобы получился круг... никак не могу понять...
Погрешность вычислений - вообще вещь нехорошая. Но реализовать тип double на МК для рисования на экране - тоже лишнее.
yegorkin вне форума  
Непрочитано 23.10.2007, 14:40  
nocturnus
Прописка
 
Регистрация: 09.08.2006
Адрес: Днепр
Сообщений: 59
Сказал спасибо: 21
Сказали Спасибо 34 раз(а) в 14 сообщении(ях)
nocturnus на пути к лучшему
По умолчанию

Вот еще вариант. Надо только определить функцию вывода пиксела и линии(для заливки окружности).
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);
}
nocturnus вне форума  
Непрочитано 23.10.2007, 17:05  
Dammit
Частый гость
 
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Dammit на пути к лучшему
По умолчанию

Все равно выводит подобный ромбик!
Это катастрофа какая-то!!!
Я использовал вначале компилятор CodeVisionAVR 1.24.8d, подумал глюк компилятора...
Перешел на 1.25.7a - то же самое!
Ромбик и все тут...
Из моей первой реализации
tswitch как вроде бы игнорируется, такое ощущение, что он всегда › 0 и во всем цикле віполняется код ветвление, где y--! Хотя так не должно! Вначале ведь tswitch‹0.
Проверил вручную. Вместо "tswitch = 3 - 2 * radius;" подставил в что положительное, что отрицательное большые левые числа - результат одинаков! Выводится ромб! Как такое может быть?
Dammit вне форума  
Непрочитано 23.10.2007, 17:07  
Dammit
Частый гость
 
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Dammit на пути к лучшему
По умолчанию

В последней реализации игнорируется if(P‹0)...
Самое зло... это только с алгоритмом черчения круга такое... везде далее никогда подобного не замечал...
Dammit вне форума  
Непрочитано 23.10.2007, 18:59  
Dammit
Частый гость
 
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Dammit на пути к лучшему
По умолчанию

УРА ТОВАРИЩИ!!! МЕТОД ТЫКА ПРОКОНАЛ!

Теперь и круги выводим! Скриншот прилагается!
Может мне кто-то объяснит, почему переменную 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++; 
  }
}

ЧТО ЭТО ЗА ХРЕНОТЕНЬ ТАКАЯ ПОЛУЧАЕТСЯ?
Спасибо всем, алгоритмы всех работают!

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

Dammit вне форума  
Непрочитано 23.10.2007, 19:13  
yegorkin
Частый гость
 
Регистрация: 12.02.2007
Сообщений: 40
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
yegorkin на пути к лучшему
По умолчанию

Сообщение от 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;

-- Прилагается рисунок: --
yegorkin вне форума  
Непрочитано 24.10.2007, 12:33  
nocturnus
Прописка
 
Регистрация: 09.08.2006
Адрес: Днепр
Сообщений: 59
Сказал спасибо: 21
Сказали Спасибо 34 раз(а) в 14 сообщении(ях)
nocturnus на пути к лучшему
По умолчанию

Очень может быть, что где-то в проекте есть уже локальная переменная d, только обьявлена как беззнаковая, и компилятор на этом тупит. Да и кстати, а AVR C int - знаковое или беззнаковое? Может надо просто добавить signed int?
nocturnus вне форума  
Непрочитано 24.10.2007, 17:57  
Dammit
Частый гость
 
Регистрация: 04.12.2006
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Dammit на пути к лучшему
По умолчанию

Неа, ни то ни другое не конает, пробовал менять - пофигу...
Наверное, какой-то глюк компилятора СodeVision... но по идее такого не должно быть...
Пробовал переписывать функцию и в "lib", и "h", и "c" - пофигу, одно и то же...
Может протеус глючит с его моделями контролеров?
Как-то не думаю...
И нигде не объявлено никакой другой переменной d, signed тоже не работает, только такое...
Dammit вне форума  
Непрочитано 24.10.2007, 19:04  
yegorkin
Частый гость
 
Регистрация: 12.02.2007
Сообщений: 40
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
yegorkin на пути к лучшему
По умолчанию

Сообщение от crazy_blu
очень удачный целочисленный алгоритм (http://democoder.ru/article/12 к примеру)
Взял фрагмент кода с 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;
yegorkin вне форума  
Непрочитано 25.10.2007, 10:12  
EKuzmich
Прописка
 
Регистрация: 07.08.2005
Сообщений: 178
Сказал спасибо: 16
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
EKuzmich на пути к лучшему
По умолчанию

А как на счет элепса или отрисовки указанного сегмента, то есть от такого то угла до такого?
EKuzmich вне форума  
 

Закладки
Опции темы

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

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, время: 16:03.


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