Читайте также:
|
|
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
img1: TImage;
lst1: TListBox;
point_x: TEdit;
lbl1: TLabel;
point_y: TEdit;
lbl2: TLabel;
add: TButton;
btn1: TButton;
n_gen: TEdit;
gen: TButton;
lbl3: TLabel;
procedure addClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure genClick(Sender: TObject);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
tmypoint = record
x: Integer;
y: Integer;
end;
var
points: array [0..100000] of tmypoint;
cnt: Integer;
// проверка, является ли s числом
function is_digit(s: string):Boolean;
var i: integer;
f: boolean;
begin
f:= true;
if s = '' then f:= false;
for i:= 1 to length(s) do
if (Ord(s[i]) < Ord('0')) or (Ord(s[i]) > Ord('9'))
then
f:= false;
Result:= f;
end;
// рисует список точек
procedure update_list();
var i: integer;
canvas: tcanvas;
begin
Form1.lst1.Clear;
canvas:= Form1.img1.Canvas;
canvas.Brush.Color:=clWhite;
canvas.Rectangle(0, 0, Form1.img1.Width, Form1.img1.Height);
canvas.Brush.Color:=clBlack;
for i:= 0 to cnt-1 do
begin
Form1.lst1.Items.add(IntToStr(points[i].x)+ ', '+IntToStr(points[i].y));
canvas.Ellipse(points[i].x-2, Form1.img1.Height - points[i].y-2, points[i].x+2, Form1.img1.Height - points[i].y+2);
end;
end;
// добавляет точки в список
procedure add_point_int(x, y: integer);
begin
if (x > form1.img1.Width) or (y > Form1.img1.Height) or (x < 0) or (y < 0)
then
begin
ShowMessage('Неподходящие координаты');
Exit;
end;
points[cnt].x:= x;
points[cnt].y:= y;
Inc(cnt);
end;
// добавляет точки в список
procedure add_point_str(_x, _y: string);
var
x, y: Integer;
begin
if not is_digit(_x) or not is_digit(_y)
then
begin
ShowMessage('Неподходящие координаты');
Exit;
end;
x:= StrToInt(_x);
y:= StrToInt(_y);
add_point_int(x, y);
end;
procedure TForm1.addClick(Sender: TObject);
var
x, y: Integer;
begin
add_point_str(point_x.Text, point_y.text);
update_list;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
cnt:= 0;
update_list;
end;
procedure TForm1.genClick(Sender: TObject);
var
i: Integer;
begin
Randomize;
if not is_digit(n_gen.Text)
then
begin
ShowMessage('Неподходящие координаты');
Exit;
end;
for i:= 1 to StrToInt(n_gen.Text) do
add_point_int(Random(img1.Width), Random(img1.Height));
update_list;
end;
function distance(p1, p2: tmypoint): Double;
begin
Result:= (Sqrt(Sqr(p2.x - p1.x) + Sqr(p2.y - p1.y)));
end;
function is_bar(p1, p2, p3, p4: tmypoint): Boolean;
var d1, d2, d3, d4: double;
begin
d1:= distance(p1, p2);
d2:= distance(p2, p3);
d3:= distance(p3, p4);
d4:= distance(p4, p1);
Result:= (d1 = d2) and (d2 = d3) and (d3 = d4) and (d4 = d1) and (d1 <> 0);
end;
procedure drawbar(p1, p2, p3, p4: tmypoint);
begin
Form1.img1.Canvas.MoveTo(p1.x, Form1.img1.Height - p1.y);
Form1.img1.Canvas.LineTo(p2.x, Form1.img1.Height - p2.y);
Form1.img1.Canvas.LineTo(p3.x, Form1.img1.Height - p3.y);
Form1.img1.Canvas.LineTo(p4.x, Form1.img1.Height - p4.y);
Form1.img1.Canvas.LineTo(p1.x, Form1.img1.Height - p1.y);
end;
procedure gen_bars();
var
i1, i2, i3, i4, acnt: Integer;
begin
acnt:= 0;
for i1:= 0 to cnt-1 do
for i2:= i1+1 to cnt-1 do
for i3:= i2+1 to cnt-1 do
for i4:= i3+1 to cnt-1 do
if is_bar(points[i1], points[i2], points[i3], points[i4])
then
begin
drawbar(points[i1], points[i2], points[i3], points[i4]);
inc(acnt);
end;
ShowMessage(IntToStr(acnt)+' квадратов найдено');
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
gen_bars();
end;
end.
Дата добавления: 2015-01-29; просмотров: 18 | Поможем написать вашу работу | Нарушение авторских прав |