ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
9 мая
84877 Топик полностью
Max_QNX (29.03.2007 19:43, просмотров: 1) ответил LordN на вобщем кое-что нашел, но там сделано по другому
я не делал линию, потому что она мне была не нужна. :) я делал круг. смысл алгоритма Брезенхема говорит о том, что рисуем ли мы линию или круг, неважно, при смещении (допустим!) по координате Х от одной точки к другой на 1 дискрет (пиксел) вторая координата НЕ ИЗМЕНИТСЯ больше чем на 1 пиксел. Вот это вообщем квинт-эссенция. нарисуй перед собой воображаемые точки, надо провести линию из левого нижнего в правый верхний угол. смещаешься на 1 пиксел вправо - и надо определить, У координата осталась прежней или увеличилась на 1. Других вариантов нет. Если из левого верхнего угла в правый нижний, то У может либо не измениться либо уменьшиться на 1 пиксел. Ну и тому подобное для остальных квадрантов смотря куда мы движемся (вверх по У или вниз) и справа налево или слева направо. Это для линий. Для окружностей рассматривается 8 зон по 45 градусов. в пределах которых изменение второй координаты - монотонно. исходник ниже <c> void bres_circle (unsigned int xc, unsigned int yc, unsigned int r, unsigned char * image, unsigned int x_size, unsigned int y_size, unsigned short fill) { int x,y,d; y=r; x=0; d=3-2*y; while (x<=y) { if ((xc+x)<x_size&&(yc+y)<y_size) { *(image+(xc+x)+(yc+y)*x_size)=fill; } if ((xc+x)<x_size&&yc>y) { *(image+(xc+x)+(yc-y)*x_size)=fill; } if ((xc>x)&&(yc>y)) { *(image+(xc-x)+(yc-y)*x_size)=fill; } if ((xc>x)&&(yc+y)<y_size) { *(image+(xc-x)+(yc+y)*x_size)=fill; } if ((xc+y)<x_size&&(yc+x)<y_size) { *(image+(xc+y)+(yc+x)*x_size)=fill; } if ((xc+y)<x_size&&(yc>x)) { *(image+(xc+y)+(yc-x)*x_size)=fill; } if ((xc>y)&&(yc>x)) { *(image+(xc-y)+(yc-x)*x_size)=fill; } if ((xc>y)&&(yc+x)<y_size) { *(image+(xc-y)+(yc+x)*x_size)=fill; } if (d<0) { d=d+4*x+6; } else { y--; d+=4*(x-y)+10; } x++; } return; } </c>