Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Алгоритм?


Страницы:   1 2

Добрый) ©   (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, то я переведу на сишку


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо