Алгоритм Брезенхема для рисования прямой
Код:
X= x1;
Y= y1;
Px= x2 - x1;
Py= y2 - y1;
E= 2*Py - Px;
i= Px;
PutPixel(X, Y);
while (i= i- 1 і 0) {
if (E і 0) {
X= X + 1;
Y= Y + 1;
E= E + 2*(Py - Px);
} else
X= X + 1;
E= E + 2*Py;
PutPixel(X, Y);
}
Алгоритм Брезенхэма для рисования окружностей для С++
Код:
void drawCircle(int x0, int y0, int radius) {
int x = 0;
int y = radius;
int delta = 2 - 2 * radius;
int error = 0;
while(y >= 0) {
setPixel(x0 + x, y0 + y);
setPixel(x0 + x, y0 - y);
setPixel(x0 - x, y0 + y);
setPixel(x0 - x, y0 - y);
error = 2 * (delta + y) - 1;
if(delta < 0 && error <= 0) {
++x;
delta += 2 * x + 1;
continue;
}
error = 2 * (delta - x) - 1;
if(delta > 0 && error > 0) {
--y;
delta += 1 - 2 * y;
continue;
}
++x;
delta += 2 * (x - y);
--y;
}
}
Рисование Линий на Object Pascal
Код:
Procedure Swap(var x,y:Integer);
var t:Integer;
begin
t:=x;x:=y;y:=t;
end;
Procedure Line(Canvas: TCanvas; x1,y1,x2,y2:integer);
var dx,dy,i,sx,sy,check,e,x,y:integer;
begin
dx:=abs(x1-x2);
dy:=abs(y1-y2);
sx:=Sign(x2-x1);
sy:=Sign(y2-y1);
x:=x1;
y:=y1;
check:=0;
if dy>dx then begin
Swap(dx,dy);
check:=1;
end;
e:= 2*dy - dx;
for i:=0 to dx do begin
Canvas.Pixels[x,y]:=clBlack;
if e>=0 then begin
if check=1 then inc(x,sx) else inc(y,sy);
dec(e,2*dx);
end;
if check=1 then inc(y,sy) else inc(x,sx);
inc(e,2*dy);
end;
end;
Алгоритм Коэна — Сазерленда на языке С
Код:
#define LEFT 1
#define RIGHT 2
#define BOT 4
#define TOP 8
struct point {
double x, y;
};
struct rect {
double x_min, y_min, x_max, y_max;
};
#define vcode(r, p) \
((((p)->x < (r)->x_min) ? LEFT : 0) + /* +1 если точка левее прямоугольника */ \
(((p)->x > (r)->x_max) ? RIGHT : 0) + /* +2 если точка правее прямоугольника */\
(((p)->y < (r)->y_min) ? BOT : 0) + /* +4 если точка ниже прямоугольника */ \
(((p)->y > (r)->y_max) ? TOP : 0)) /* +8 если точка выше прямоугольника */
int cohen_sutherland (const struct rect *r, struct point *a, struct point *b)
{
int code_a, code_b, code;
struct point *c;
code_a = vcode(r, a);
code_b = vcode(r, b);
while (code_a | code_b) {
if (code_a & code_b)
return -1;
if (code_a) {
code = code_a;
c = a;
} else {
code = code_b;
c = b;
}
if (code & LEFT) {
c->y += (a->y - b->y) * (r->x_min - c->x) / (a->x - b->x);
c->x = r->x_min;
} else if (code & RIGHT) {
c->y += (a->y - b->y) * (r->x_max - c->x) / (a->x - b->x);
c->x = r->x_max;
}
else if (code & BOT) {
c->x += (a->x - b->x) * (r->y_min - c->y) / (a->y - b->y);
c->y = r->y_min;
} else if (code & TOP) {
c->x += (a->x - b->x) * (r->y_max - c->y) / (a->y - b->y);
c->y = r->y_max;
}
if (code == code_a)
code_a = vcode(r,a);
else
code_b = vcode(r,b);
}
return 0;
}
Алгоритм ЦДА
Код:
procedure lineBres(x1,y1, x2, y2 : integer);
var
x, y,xend, yend, dx, dy : integer;
k, xf, yf : float; {тип float - один из вещественныхтипов}
begin
dx := abs(x2-x1); dy := abs(y2-y1);
if dx > dy then begin {почти горизонтальна}
k := (y2 - y1)/(x2 - x1);
if x1 < x2 then begin
yf := y1; x := x1; xend := x2;
end
else begin
x := x2; xend := x1; yf := y2;
end;
repeat
putpixel(x, round(yf),cc){ставим точку цветом СС}
inc(x); inc(yf, k);
until x > xend;
end
else if dy = 0 then putpixel(x1, y1, cc)
else ... { аналогично}
Заранее благодарен!