![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Алгоритм?
Добрый) © (2008-12-30 14:39:00)Добрый день, подскажите пожалуйста как решить такую задачку:
Дана пятиконечная звезда с заданными координатами ее концов. Пользователь вводит координаты точки, и нужно узнать принадлежит ли точка звезде
Сергей М. (2008-12-30 14:50:00) [21]
> как решить такую задачку
"Конец" у звезды - это где ?
Это вершина ее луча что ли ?
Тогда никак.
Полигон однозначно определяется координатами всехего вершин, а не только "концов".
Пятиконечная зведа - невыпуклый полигон с 10-ю вершинами, из которых, если считать "концами" лучи, определены только 5.
DVM (2008-12-30 14:48:00) [22]CreatePolygonRgn() + PtInRegion()
Или так (сделано для вещественных чисел, но переделать под целые не проблема):
type
TDoublePoint = record
x: Double;
y: Double;
end;
PDoublePoint = ^TDoublePoint;
TDPointArray = array of TDoublePoint;
function PtInPolygon(const Pts: TDPointArray; P: TDoublePoint): Boolean;
var
Cnt, I, J: Integer;
begin
Result := False;
Cnt := Length(Pts);
J := Cnt-1;
for I := 0 to Cnt-1 do
begin
if ((Pts[I].y <= P.y) and (P.y < Pts[J].y)) or
((Pts[J].y <= P.y) and (P.y < Pts[I].y)) then
begin
if (P.x < (Pts[J].x - Pts[I].x) * (P.y - Pts[I].y) /
(Pts[J].y - Pts[I].y) + Pts[I].x) then
Result := not Result;
end;
J := I;
end;
end;
Palladin (2008-12-30 14:46:00) [23]точка пользователя x,y
находим самую верхнюю вершину полигона (звезды в твоем случае) xt,yt
считаем количество ребер пересекающихся с отрезком x,y,x,yt
если четное - точка не принадлежит полигону, иначе - принадлежит
Добрый) (2008-12-30 14:40:00) [24]P.S.
Желательно все это реализовать на C++, но если вы подскажите как это сделать на Delphi, то я переведу на сишку