Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2007, 20:01   #11
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Да, но как узнать, находиться ли отрезок справа/слеваот точки?
Роман Радер вне форума Ответить с цитированием
Старый 11.02.2007, 20:56   #12
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Это не важно. Проверили справа - если нет, то слева - если и там нет, то вверх и вниз.
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 12.02.2007, 00:46   #13
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Да, но как узнать, находиться ли отрезок справа/слеваот точки?
Проще было спросить у своего соседа-первоклассника...
Если находится слева, то абсцисса точки меньше абсциссы места пересечения луча и отрезка и наоборот.
На всякий случай: абсцисса - это координата по горизонтали, а ордината - по вертикали.
Надо бы вам отдохнуть - похоже на переутомление.
mihali4 вне форума Ответить с цитированием
Старый 12.02.2007, 14:48   #14
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
Сообщение

Понял, отдохну...
А проверку я пытался делать...
Вот даже написал функцию проверки, но неправильно, потому что не всегда правильно работает...
Код:
function PInPoly(sx, sy:integer;parr:array of TPoint):boolean;
function GetXFromLine(y,x1,y1,x2,y2:integer): real;
var i:integer;
begin
 i:=y2-y1;
 if i=0 then
  i:=1;
 result:=x1+((x2-x1)*(y-y1))/(y2-y1);
end;
var
  i: Integer; n:integer; k:real;
  arr:array of TPoint;
begin
  n:=0;
  setlength(arr,length(parr)+1);
  for i:=1 to length(arr) do
  begin
    arr[i-1]:=parr[i-1];
  end;
  arr[Length(arr)-1]:=parr[0];
  for i:=1 to length(arr) do
  begin
    k:=GetXFromLine(sy,arr[i-1].X,arr[i-1].Y,
       arr[i].X,arr[i].Y);
    if (k+1<=0.001) then begin
      k:=sx;
    end;
      if (k>=sx)
        and
       ((arr[i].Y<=sy)and(sy<=arr[i-1].Y)) then
         n:=n+1;
  end;
  result:=odd(n);
end;
Если найдёте ошибку, сообщите, пожалуйста!
Роман Радер вне форума Ответить с цитированием
Старый 12.02.2007, 17:08   #15
Time
Пользователь
 
Регистрация: 09.02.2007
Сообщений: 32
По умолчанию

Вот мой вариант программы:
Цитата:
Код программы:
program Vremya_12_02_07;
uses crt;
var xk:array[1..102] of real;
yk:array[1..102] of real;
kol,i:integer;
x,y:real;
flag:boolean;
begin
clrscr;
textcolor(15);
writeln('Vvedite koordinaty iskomoi tochki: ');
textcolor(14); write('x = '); textcolor(15); readln(x);
textcolor(14);write('y = '); textcolor(15); readln(y);
repeat
write('Vvedite kolichestvo uglov poligona (bol`she 2 i men`she 100): ');
readln(kol);
until (kol > 2) and (kol < 100);
writeln('Vvedite koodinaty uglov poligona: ');
for i := 1 to kol do
begin
textcolor(14);write('x',i,' = '); textcolor(15);readln(xk[i]);
textcolor(14);write('y',i,' = '); textcolor(15);readln(yk[i]);
end;
xk[kol+1] := xk[1]; yk[kol+1] := yk[1];
xk[kol+2] := xk[2]; yk[kol+2] := yk[2];
for i := 1 to kol do begin
if ((xk[i+2]*(yk[i+1]-yk[i]) + yk[i+2]*(xk[i]-xk[i+1])-xk[i]*yk[i+1]+xk[i+1]*yk[i] > 0) and
(x*(yk[i+1]-yk[i]) + y*(xk[i]-xk[i+1])-xk[i]*yk[i+1]+xk[i+1]*yk[i] < 0)) or
((xk[i+2]*(yk[i+1]-yk[i]) + yk[i+2]*(xk[i]-xk[i+1])-xk[i]*yk[i+1]+xk[i+1]*yk[i] < 0) and
(x*(yk[i+1]-yk[i]) + y*(xk[i]-xk[i+1])-xk[i]*yk[i+1]+xk[i+1]*yk[i] > 0)) then
begin textcolor(12); writeln('Vasha tochka vne poligona!'); readkey ; exit; end;
if (x*(yk[i+1]-yk[i]) + y*(xk[i]-xk[i+1])-xk[i]*yk[i+1]+xk[i+1]*yk[i] = 0) then
begin textcolor(14); writeln('Vasha tochka legit na graniche u poligona'); readkey; exit; end;
end;
textcolor(15);
Writeln('Vasha tochka vnutri poligona!');
readkey
end.
У неё очень быстрый и лёгкий алгоритм. Правдо он будет работать, только для выпуклых полигонов (многоугольников). Для любых кривых и хрен знает каких он не прокатит, но это и не нужно для решения этой задачи. Она работает следующим образом:
Пусть дана точка (у которой надо определить место нахождения), количество углов в полигоне и два массива с координатами этих углов (соответственно по x и по y), причём точки в массиве обезательно распологаются друг за другом (т.е. координаты каждой следующей и предыдущей точки обозначают нам соседние углы в полигоне). Тогда определить расположение искомой точки можно следующим образом.
Перебираем все координаты наших углов по порядку. По двум соседним углам определяем уравнение прямой проходящей через эти углы. В общем виде через координаты уравнение прямой через точки (x1,y1) и (x2,y2) оно выглядит так: x(y2-y1)+y(x1-x2)-x1y2+x2y1=0 (я его вывел сам, можите проверить). Подставляем в левую часть этого уравнения любой другой угол полигона (кроме двух взятых) и так же подставляем нашу искомую точку в это уравнение. Полученые два результата должны быть обезательно одного знака чтобы точка лежала внутри полигона. Если при подстановки искомой точки в уравнение прямой мы получим 0, то эта точка лежит на границе полигона. Если хотя бы для одной прямой (как бы стенки полигона) не выполняется одно из выше описанных условий, то точка уже сразу лежит вне полигона.
Аналитическая геометрия раскрывает свои тайны!
Time have not meaning, mind - this is main...
Time вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не найдена точка входа. Черничный Общие вопросы Delphi 17 23.07.2008 11:54
Определить попала ли точка в область? Iogan Gamba Puti Общие вопросы Delphi 7 13.05.2008 00:15
Принадлежит ли точка (x,y) круговому кольцу... Sota Паскаль, Turbo Pascal, PascalABC.NET 2 24.03.2008 17:03
Дана точка A с координ. X и Y, определить... Cullen Паскаль, Turbo Pascal, PascalABC.NET 5 30.01.2008 00:22
Пренадлежит-ли точка функции? Conso Помощь студентам 4 29.01.2008 15:28