Вниз
Скачать: CL | DM;

Помогите реализовать алгоритм   Найти похожие ветки 

← →
Xerx ©   (2005-02-26 13:40) [0]

Кто знает реализацию алгоритма проверки пренадлежности точки полигону при помощи СУММИРОВАНИЯ УГЛОВ? Именно этот алгоритм, никаких подсчетов пересечений линий со сторонами полигона и т.д.


← →
Fedia ©   (2005-02-26 14:14) [1]

Разве не алгоритм проецирования отрезков на ось в этом случае является самым быстрым? Вся суть его реализации сводится к операциям сравнения. Если нужен, то завтра попробую пример скинуть.


← →
Xerx ©   (2005-02-26 22:43) [2]

Fedia > Не знаю о таком алгоритме. Мненужен не САМЫЙ, САМЫЙ, САМЫЙ, а именно этот!!! Но если можешь - скинь, вдруг нечто похожее.


← →
XProger ©   (2005-02-27 01:39) [3]


//Положение точки p относительно прямой (p1, p2)
function Side(p, p1, p2: TPoint): boolean;
var
a, b: TPoint;
begin
a.X := p2.X - p1.X;
a.Y := p2.Y - p1.Y;

b.X := p.X - p1.X;
b.Y := p.Y - p1.Y;

Result := (a.X * b.Y - a.Y * b.X) >= 0;
end;

cur := Point(X, Y);
if Side(cur, p[1], p[2]) and //обход по часовой стрелке
  Side(cur, p[2], p[3]) and
  Side(cur, p[3], p[1]) then
Caption := "В яблочко!!!"   //соответственно =)
else
Caption := "Неа!";          //Не попал =)


Что-то в этому духе... без проблем можно под 3d переписать.


← →
XProger ©   (2005-02-27 01:40) [4]


if Side(cur, p[1], p[2]) = //обход по/против часовой стрелки
 Side(cur, p[2], p[3]) =
 Side(cur, p[3], p[1]) then

Так правильнее будет ;)


← →
Fedia ©   (2005-02-28 00:17) [5]

>Xerx ©   (26.02.05 22:43) [2]
>а именно этот!!!
>вдруг нечто похожее.
Нет, совершенно не похожее. Об углах там речи нет вообще.


← →
марсианин ©   (2005-02-28 00:45) [6]

[4] XProger ©   (27.02.05 01:40)
ну как? работает? последняя версия вроде должна.. в чем проблема-то?

только
> без проблем можно под 3d переписать.
это врядли..


← →
Xerx ©   (2005-03-01 11:32) [7]

Отвечаю сам(нашел), может кому интересно.
Из точки вычисляются вектора ко всем вершинам полигона(произвольного). Суммируются центральные углы. Если сума равна 360гр, то точка внутри, если нет, то точка вне полигона.


← →
MrAngel   (2005-03-01 13:05) [8]

Не знаю - по методам углов это или нет - но работает как надо.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormPaint(Sender: TObject);
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
 private
   PG: array of TPoint;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
 SetLength(PG,6);
 PG[0].X := 50;
 PG[0].Y := 70;
 PG[1].X := 60;
 PG[1].Y := 160;
 PG[2].X := 160;
 PG[2].Y := 170;
 PG[3].X := {150}40;
 PG[3].Y := 110;
 PG[4].X := 170;
 PG[4].Y := 40;
 PG[5].X := 50;
 PG[5].Y := 70;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 Canvas.Polygon(PG);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
 i: Integer;
 Result : Boolean;
begin

 Result := False;

 for i := 0 to Length(PG) - 2 do
 begin
   if (Y > PG[i].Y) <> (Y <= PG[i+1].Y) then Continue;
   if (X - PG[i].X) <  (Y - PG[i].Y)*(PG[i+1].X - PG[i].X)/(PG[i+1].Y - PG[i].Y)
      then Result := not Result;
 end;

 if Result then Caption := "TRUE" else Caption := "FALSE";
end;

end.


← →
XProger ©   (2005-03-02 00:22) [9]

марсианин, всё работает. А чтобы проверить принадлежность в 3д достаточно написать уравнение плоскости для этого треугольника и проверить принадлежит ли точка этой плоскости. И всего-то, а этот 3д треугольник можно спроецировать на одну из координатных плоскостей (переход к 2д координатам).

Xerx, ты там наверное ещё и арксинусы/арккосинусы считаешь? ;)


← →
марсианин ©   (2005-03-02 20:00) [10]

[9] XProger ©
черт я тебя с Xerx перепутал:) думал чей-то он сам на свой ворпос ответил :)

я думал имеется ввиду принадлежит ли точка 3Д многограннику.. там по другому

я для проверки использовую метод подсчетов пересечений линий со сторонами полигона. он работает не только для выпуклых многоугольников


← →
Xerx ©   (2005-03-29 13:46) [11]

> марсианин
Я сам и ответил (ранише).
Метод подсчета кол-ва точек пересечения хорош, да мне нужно было реализовать определенный метод забив на скорость, ets.
> XProger
А арккосинусы можно и не считать. Можно быстрее..



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.028 c
11-1101977494
mdw
2004-12-02 11:51
2005.07.11
Обновление TKOLmdvXLGrid и TKOLmdvDBF


14-1118238463
peace
2005-06-08 17:47
2005.07.11
Злюки Модеры


4-1115726480
GrayFace
2005-05-10 16:01
2005.07.11
Как получить права отладчика?


4-1115993273
Skier
2005-05-13 18:07
2005.07.11
Сообщения от скроллеров...


1-1118719734
ORMADA
2005-06-14 07:28
2005.07.11
Настройки компилятора




   Наверх