10 / 10 / 2
Регистрация: 22.10.2010
Сообщений: 110
|
|
1
|
алгоритм Брезенхема и несимметричный ЦДА
09.10.2012, 18:14. Показов 3176. Ответов 0
помогите с программой на тему: "Генерация изображений отрезков на прямоугольном растре"
есть программа, которая рисует: (наибольшую пятиконечную) ЗВЕЗДУ и ПЯТИУГОЛЬНИК помещенный в эту звезду...> код программы:
Delphi | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| unit Unit1;
interface // Открытый интерфейс модуля.
uses Windows,Messages,SysUtils,Variants,Classes,Graphics,
Controls,Forms,Dialogs,Math,StdCtrls; // Список подключаемых модулей.
type TForm1 = class(TForm) // Объявление класса формы.
// Объявление процедур.
procedure FormPaint(Sender: TObject);// Для рисовании "формы".
procedure FormResize(Sender: TObject);// Для изменения размеров окна.
end;
var Form1: TForm1;
implementation // Выполняет Interface этого модуля.
{$R *.dfm} // Включение определений формы.
//==============================================================================
// Реализация процедуры изменение размеров окна.
procedure TForm1.FormResize(Sender: TObject);
begin
Invalidate; // Вынуждает перерисовываться элемент управления.
end;
//==============================================================================
// Реализация процедуры работы с рисованием "формы".
procedure TForm1.FormPaint(Sender: TObject);
var
mas_px: array of TPoint;
i, r,r_1, x_0,y_0: Integer;
ugol, ugol_1: Real;
begin
x_0:=ClientWidth div 2;
y_0:=ClientHeight div 2;
SetLength(mas_px, 5);
//========================
// Пятиконечная звезда.
ugol:=90; r:=Min(x_0,y_0)-20;
for i:=0 to 4 do
begin
ugol:=ugol+(360/5); // Формирование звезды.
mas_px[i].X:=Round(x_0+r*cos((180*pi/180)+(ugol*pi/180)+2*pi*i/5));
mas_px[i].Y:=Round(y_0+r*sin((180*pi/180)+(ugol*pi/180)+2*pi*i/5));
end;
Canvas.Pen.Width:=20; // Выбор толщины линии пера.
Canvas.Pen.Color:=clRed; // Выбор цвета пера.
Canvas.Polygon(mas_px);
//========================
// Пятиугольник.
ugol_1:=-90; r_1:= 4*r div 10;
for i:=0 to 4 do
begin
mas_px[i].X:=Round(x_0+r_1*cos((180*pi/180)+(ugol_1*pi/180)+2*pi*i/5));
mas_px[i].Y:=Round(y_0+r_1*sin((180*pi/180)+(ugol_1*pi/180)+2*pi*i/5));
end;
Canvas.Pen.Width:=10; // Выбор толщины линии пера.
Canvas.Pen.Color:=clBlue; // Выбор цвета пера.
Canvas.Polygon(mas_px);
end; |
|
----------------------
и есть алгоритм Брезенхема:
Delphi | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| // Реализация алгоритма Брезенхема.
procedure TForm1.Bresenham(x1,y1, x2,y2: Real; pixel: Integer);
var
dx, dy, e, q: Real;
i, sx, sy: Integer;
c: Boolean;
begin
dx:=Abs(x1-x2);
dy:=Abs(y1-y2);
sx:=Sign(x2-x1);
sy:=Sign(y2-y1);
c:=false;
if dy>dx then
begin
q:=dx; dx:=dy; dy:=q;
c:=true;
end;
e:=2*dy-dx;
for i:=0 to Round(dx) do
begin
Canvas.Rectangle(Round(x1)*(pixel-1), Round(y1)*(pixel-1), Round(x1+2)*(pixel-1), Round(y1+2)*(pixel-1));
if e>=0 then
begin
if c then x1:=x1+sx else y1:=y1+sy;
e:=e-2*dx;
end;
if c then y1:=y1+sy else x1:=x1+sx;
e:=e+2*dy;
end;
end; |
|
------
и алгоритм ЦДА:
Delphi | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| //Реализация алгоритма ЦДА.
procedure TForm1.CDA(x1, y1, x2, y2: Real; pixel: Integer);
var
d, dx, dy: Real;
begin
if (x1 > x2) then
begin
d:=x1; x1:=x2; x2:=d;
d:=y1; y1:=y2; y2:=d;
end;
dx:=x2-x1;
dy:=y2-y1;
Canvas.Rectangle(Round(x1)*(pixel-1), Round(y1)*(pixel-1), Round(x1+1)*(pixel-1), Round(y1+1)*(pixel-1));
if (Abs(dx) < Abs(dy)) then
begin
if dy = 0 then d:=0 else d:=dx/Abs(dy);
while (y1<>y2) do
begin
if (dy < 0) then y1:=y1-1 else y1:=y1+1;
x1:=x1+d;
Canvas.Rectangle(Round(x1)*(pixel-1), Round(y1)*(pixel-1), Round(x1+1)*(pixel-1), Round(y1+1)*(pixel-1));
end;
end
else
begin
if dx = 0 then d:=0 else d:=dy/Abs(dx);
while (x1<>x2) do
begin
if (dx < 0) then x1:=x1-1 else x1:=x1+1;
y1:=y1+d;
Canvas.Rectangle(Round(x1)*(pixel-1), Round(y1)*(pixel-1), Round(x1+1)*(pixel-1), Round(y1+1)*(pixel-1));
end;
end;
end; |
|
----------------
!!помогите это как то совместить, что бы работало и рисовало линии по данным алгоритмам (на прямоугольном растре).,.., [и данный рисунок получался именно на основе этих алгоритмов]
0
|