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) | использование алгоритма Брезенхема
|
Прикольный алгоритм, кстати...
|
|