
30.03.2010, 10:30
|
 |
Продвинутый
|
|
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
|
|
Практически готовый код
Позволил себе чуть подправить код...
Данный код рисует точки и треугольники и вычисляет точки внутри него...но есть небольшое исключение которое нужно обрабатывать...точка может быть и самой верхней и самой левой к примеру...
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
x, y, n, i: integer;
a: array[1..30] of TPoint;
m1: array[1..3] of TPoint;
begin
randomize;//Генератор
Memo1.Clear;//Очистить мемо
Image1.Picture := nil;//очистить имедж
n := StrToInt(Edit3.Text);//количество точек
//Установки канвас
image1.Canvas.Pen.Width:=5;
image1.Canvas.Pen.Color:=clGreen;
image1.Canvas.Font.Size:=7;
//Расчмтать точки
for i:= 1 to n do//до количества точек делать
begin
x := Random(Image1.Width);//координата X
y := Random(Image1.Height);//Координата Y
memo1.Lines.Add(' №'+inttostr(i)+' ('+inttostr(x)+' : '+ //вывод на экран
inttostr(y)+')');
image1.Canvas.Ellipse(x-1, y-1, x+1, y+1);//рисовать точки
image1.Canvas.TextOut(x+2, y, '№'+inttostr(i));//рисовать текст
a[i].X:=x;//заполнить массив
a[i].Y:=y;
end;
//Установки канвас
image1.Canvas.Pen.Width:=1;
image1.Canvas.Pen.Color:=clblack;
//расчитать треугольник
m1[1].Y:= a[1].y;//самая высшая
m1[2].X:= a[1].X;//самая левая
m1[3].X:= a[1].X;//самая правая
for i:=1 to n do
begin
if (a[i].Y > m1[1].Y) then
begin
m1[1].Y := a[i].Y;
m1[1].X := a[i].X;
end;
if (a[i].X > m1[2].X) then
begin
m1[2].X := a[i].X;
m1[2].Y := a[i].Y;
end;
if (a[i].X < m1[3].X) then
begin
m1[3].X := a[i].X;
m1[3].Y := a[i].Y;
end;
end;
//вывестин на экран треугольник
image1.Canvas.MoveTo(m1[1].X, m1[1].Y);
image1.Canvas.LineTo(m1[2].X, m1[2].Y);
image1.Canvas.LineTo(m1[3].X, m1[3].Y);
image1.Canvas.LineTo(m1[1].X, m1[1].Y);
//Проверка точек
for i := 1 to n do
if PointInTriangle(a[i], m1[1], m1[2], m1[3]) = true
then
memo1.Lines.Add (IntToStr(i));
end;
//Принадлежит точка треугольнику или нет
//Самый простой способ такой: соединяешь точку с вершинами треугольника,
//считаешь площадь малеьких треугольников, если сумма площадей равна площади
//большего трегольника, то точка внутри, иначе снаружи.
//Способ был предложен тут forum.vingrad.ru
Function PointInTriangle(p, a, b, c : TPoint): boolean;
var
Square, Square1, Square2, Square3 : real;
begin
Square := abs(((a.X-c.X)*(b.Y-c.Y))-((b.X-c.X)*(a.Y-c.Y)));
Square1 := abs(((p.X-b.X)*(a.Y-b.Y))-((a.X-b.X)*(p.Y-b.Y)));
Square2 := abs(((p.X-c.X)*(a.Y-c.Y))-((a.X-c.X)*(p.Y-c.Y)));
Square3 := abs(((p.X-c.X)*(b.Y-c.Y))-((b.X-c.X)*(p.Y-c.Y)));
if Square = (Square1 + Square2 + Square3) then
Result:= true
else
Result:= false;
end;
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
|