aidoqa
Опытный участник
- Сообщения
- 1,016
- Реакции
- 108
Здравствуйте) кто хорошо владеет каким нибудь языком програмирования?
Задание.Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя.
Решение
в гуугле есть не сколько программ но они почемуто у меня не работаютв чем причина?(
на дельфи
и на с++ из этой темы тоже не идут(
Задание.Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя.
Решение
в гуугле есть не сколько программ но они почемуто у меня не работаютв чем причина?(
на дельфи
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
StackPix = record
x: integer;
y: integer;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure FormPaint(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
arrStack: array of StackPix;
implementation
uses Math;
{$R *.dfm}
procedure pushStack(pxl: StackPix);
begin
SetLength(arrStack, Length(arrStack)+1);
arrStack[High(arrStack)]:=pxl;
end;
function popStack():StackPix;
begin
if High(arrStack)>=0 then
begin
popStack:=arrStack[High(arrStack)];
SetLength(arrStack, High(arrStack));
end
end;
procedure www(npxl:StackPix; Xmax:integer);
var
fl: boolean;
pc: TColor;
i: integer;
begin
while npxl.x <= Xmax do
begin
fl:=false;
pc:=Form1.canvas.Pixels[npxl.x,npxl.y];
while ((pc <> clBlack) and (pc <> clred) and (npxl.x < Xmax)) do
begin
if fl=false then fl:=true;
npxl.x:=npxl.x+1;
pc:=Form1.canvas.Pixels[npxl.x,npxl.y];
end;
if fl=true then
begin
if (npxl.x=Xmax) and (pc <> clBlack) and (pc <> clGreen) then
pushStack(npxl)
else
begin
npxl.x:=npxl.x-1;
pushStack(npxl);
end;
// fl:=false;
end;
i:=npxl.x;
pc:=Form1.canvas.Pixels[npxl.x,npxl.y];
while (((pc=clBlack) or (pc=clGreen)) and (npxl.x<Xmax)) do
begin
npxl.x:=npxl.x+1;
pc:=Form1.canvas.Pixels[npxl.x,npxl.y];
end;
if npxl.x=i then npxl.x:=npxl.x+1;
end;
end;
procedure nearby(pxl: StackPix);
var
pc: TColor;
begin
pc:=Form1.canvas.Pixels[pxl.x,pxl.y];
if (pc <> clBlack) and (pc <> clRed) then pushStack(pxl);
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
canvas.Pen.Color:=clBlack;
canvas.MoveTo(100,115);
canvas.LineTo(180,115);
canvas.LineTo(280,115);
canvas.LineTo(280,270);
canvas.LineTo(230,270);
canvas.LineTo(70,270);
canvas.LineTo(20,270);
canvas.LineTo(20,115);
canvas.LineTo(200,115);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
pxl: StackPix;
npxl: StackPix;
i:integer;
color: TColor;
begin
Button1.Enabled:=false;
pxl.x:=270;
pxl.y:=118;
pushStack(pxl);
while High(arrStack)>-1 do
begin
case i of
0: color:=clblack;
1: color:=clblack;
2: color:=clblack;
3: color:=clblack;
4: color:=clblack;
5: color:=clblack;
end;
pxl:=popStack;
i:=RandomRange(0,5);
canvas.Pixels[pxl.x,pxl.y]:=color;
npxl.x:=pxl.x-1;
npxl.y:=pxl.y;
nearby(npxl);
npxl.x:=pxl.x+1;
npxl.y:=pxl.y;
nearby(npxl);
npxl.x:=pxl.x;
npxl.y:=pxl.y-1;
nearby(npxl);
npxl.x:=pxl.x;
npxl.y:=pxl.y+1;
nearby(npxl);
end;
Button1.Enabled:=true;
end;
end.