C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как нарисовать круг без дыр
S&S
Отправлено: 16.11.2005, 15:15


Ученик-кочегар

Группа: Участник
Сообщений: 4



Как нарисовать круг без дыр, я пробовал с использование алгоритма Брезенхема
CODE

void __fastcall TForm1::drawcircl(int xc, int yc, int r)
{

   int x,y,d;
   x = 0;
   y = r;
   d = 3-2*r;
   while(y>=x)
   {

      PaintBox1->Canvas->Pixels[x+xc][y+yc]=clRed;
      PaintBox1->Canvas->Pixels[x+xc][-y+yc]=clRed;
      PaintBox1->Canvas->Pixels[-x+xc][y+yc]=clRed;
      PaintBox1->Canvas->Pixels[-x+xc][-y+yc]=clRed;
      PaintBox1->Canvas->Pixels[y+xc][x+yc]=clRed;
      PaintBox1->Canvas->Pixels[y+xc][-x+yc]=clRed;
      PaintBox1->Canvas->Pixels[-y+xc][x+yc]=clRed;
      PaintBox1->Canvas->Pixels[-y+xc][-x+yc]=clRed;
      if( d<0 )
      d = d+4*x+6;
      else
       {
           d = d+4*(x-y)+10;
           y = y-1;
       }
       x = x+1;
   }
}

результат чуть лучше чем через sin и cos но дыры присутствуют.
И еще может кто знает как реализовать заполнение окружности по часовой стрелки т.е то как это происходит у компонента CGauge при свойстве Kind==gkPie



Присоединить изображение

Присоединить изображение

Guest
Отправлено: 16.11.2005, 15:30


Не зарегистрирован







Я когда то делал так. Для одной четверти (I) рассчитывал для данного растра координату пересечения растровой линии Y с окружностью — X1, координата во II четверти — X2 = центр — X1 и проводил две линии из X2 в X1 (для верхней и нижней полуполскости).
Konstantine
Отправлено: 16.11.2005, 16:25


Мастер участка

Группа: Модератор
Сообщений: 545



попробуй считать не в int а хотя-бы во float
если всё равно будут — заполняй с шагом радиуса 0.5
Asher
Отправлено: 16.11.2005, 16:35


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
А нельзя просто через Canvas->Ellipse нарисовать?
Canvas->FloodFill еще посмотреть можно
или это учебное задание такое?
QUOTE
И еще может кто знает как реализовать заполнение окружности по часовой стрелки т.е то как это происходит у компонента CGauge при свойстве Kind==gkPie

Canvas->Pie

Отредактировано Asher — 16/11/2005, 17:37
S&S
Отправлено: 16.11.2005, 20:06


Ученик-кочегар

Группа: Участник
Сообщений: 4



QUOTE

попробуй считать не в int а хотя-бы во float
если всё равно будут — заполняй с шагом радиуса 0.5

при шаге 0.5 алгоритм глючит .
А вот Canvas->Ellipse и Canvas->Pie то что надо, спасибо Asher
Guest
Отправлено: 17.11.2005, 15:26


Не зарегистрирован







Вообще если потребуется чтото нарисовать по точкам (график функции например) то рисуйте линиями от одной до другой точки , ни каких дыр не будет.

PS, иногда надо читать справку , а то все наверно подумали что это задание такое, нарисовать круг в ручную.
BreakPointMAN
Отправлено: 18.11.2005, 22:46


Станционный диспетчер

Группа: Участник
Сообщений: 86



QUOTE (Guest @ 17/11/2005, 15:26)
Вообще если потребуется чтото нарисовать по точкам (график функции например) то рисуйте линиями от одной до другой точки , ни каких дыр не будет.

Это в том случае, если заведомо известно, что функция непрерывна на участке отрисовки. А если нет?
BreakPointMAN
Отправлено: 18.11.2005, 23:06


Станционный диспетчер

Группа: Участник
Сообщений: 86



QUOTE (S&S @ 16/11/2005, 15:15)
использование алгоритма Брезенхема

Прикольный алгоритм, кстати... biggrin.gif

Вернуться в Вопросы программирования в C++Builder