Оптимальное моделирование:
x1, y1 x2, y2
x0, y0
x3, y3
R2 (MIN) = ((x1-x0)2 +( y1-y0)2 (x2-x0)2 +( y2-y0)2 (x3-x0)2 +( y3-y0)2) - min
unit Unit1;
interface
usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
var
Form1: TForm1;
dx,dy:real; //масштаб реки K_Der,D_Reki,N_R,D_Reki1,N_R1,R,i,num,mmx,rast,j,mmn,x,y,xv,yv,xn,yn:integer;
St:array[1..800,1..2] of integer; //длина реки
Pl:array[1..100,1..2] of integer; //количество деревень
Rw:array[1..2,1..2] of integer; //река
implementation
uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.Hide;
form2.show;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
xv:=strtoint(inputbox('vvod ','1-ая координата левого верхнего угла поля(0-10)',''));
yv:=strtoint(inputbox('vvod ','2-ая координата левого верхнего угла поля(0-10)',''));
xn:=strtoint(inputbox('vvod ','1-ая координата правого нижнего угла поля(580-650)',''));
yn:=strtoint(inputbox('vvod ','2-ая координата правого нижнего угла поля(500-580)',''));
K_Der:=strtoint(inputbox('vvod ','количество деревень(1-70)',''));
D_Reki:=strtoint(inputbox('vvod ','длина реки(300-550)',''));
N_R:=strtoint(inputbox('vvod ','начало реки(10-200)',''));
{D_Reki1:=strtoint(inputbox('vvod ','длина реки(300-550)',''));
N_R1:=strtoint(inputbox('vvod ','начало реки(10-200)',''));}
R:=strtoint(inputbox('vvod ','длина разбиения(10-20)',''));
randomize;
for i:=1 to K_Der do begin //определение координат деревень
Pl[i,1]:=random(570)+10;
Pl[i,2]:=random(480)+10;
end;
Rw[1,1]:=N_R; //координаты реки
Rw[1,2]:=D_Reki;
Rw[2,1]:=random(480)+10;
Rw[2,2]:=random(480)+10;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
form1.Canvas.Brush.Color:=clolive; //вывод поля
form1.Canvas.Rectangle(xv,yv,xn,yn);
dx:=D_Reki/(D_Reki-1); //определение масштаба по реке
dy:=(Rw[2,2]-Rw[2,1])/(D_Reki-1);
form1.Canvas.Pen.Color:=clblue;
form1.Canvas.MoveTo(Rw[1,1],Rw[2,1]-3); //вывод реки на экран
form1.Canvas.LineTo(Rw[1,2],Rw[2,2]-3);
form1.Canvas.MoveTo(Rw[1,1],Rw[2,1]+3);
form1.Canvas.LineTo(Rw[1,2],Rw[2,2]+3);
for j:=1 to D_Reki do begin //определение расстояния до деревень
mmx:=0;
for i:=1 to K_Der do begin
rast:=round(sqrt(sqr(10+ dx*(j-1)-Pl[i,1])+sqr(Rw[2,1]+dy*(j-1)-Pl[i,2])));
if mmx<rast then begin
mmx:=rast; //максимальное из расстояний до деревень
St[j,1]:=rast;
end;end;
end;
for i:=1 to K_Der do begin
form1.Canvas.Brush.Color:=clyellow; //вывод деревень с их нумерацией
form1.Canvas.Pen.Color:=clred;
form1.Canvas.TextOut(Pl[i,1]-14,Pl[i,2]-14,inttostr(i));
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
{mmn:=1000;
for i:=1 to (D_Reki-N_R) do begin}
while i<=(D_Reki-N_R) do begin
mmn:=1000;i:=i+R; //определение искомого места на реке
if St[i,1]<mmn then begin
mmn:=St[i,1];
num:=i+R;
end;end;
for j:=1 to K_Der do begin //вывод расстояний от искомого места до деревень
rast:=round(sqrt(sqr(10+ dx*(num-1)-Pl[j,1])+sqr(Rw[2,1]+dy*(num-1)-Pl[j,2])));
form1.Canvas.Brush.Color:=clsilver;
form1.Canvas.Pen.Color:=clred;
form1.Canvas.TextOut(Pl[j,1]-3,Pl[j,2]-3,inttostr(rast));
end;
form1.Canvas.Pen.Color:=clfuchsia; //вывод искомого места
form1.Canvas.brush.Color:=clfuchsia;
form1.Canvas.Ellipse(round(dx*(num-R)+2),round(Rw[2,1]+dy*(num-R)-8),round(18+dx*(num-R)),round(Rw[2,1]+dy*(num-R)+8));
for i:=1 to K_Der do begin //линии от искомого места до деревень
form1.Canvas.Pen.Color:=clnavy;
form1.Canvas.brush.Color:=clnavy;
form1.Canvas.MoveTo(round(dx*(num-1)+7),round(Rw[2,1]+dy*(num-1)-5));
form1.Canvas.LineTo(Pl[i,1]-5,Pl[i,2]-5);end;
end;end.