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.
	
			