Показать сообщение отдельно
  #8  
Старый 30.03.2010, 10:30
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 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;
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием