PDA

View Full Version : تشخیص وجود یک نقطه روی polygon (چند ضلعی)



Delphi-Man
دوشنبه 09 شهریور 1388, 13:46 عصر
با سلام
کسی می تونه راهنمایی کنه؟ من با canvas.polygon یک چند ضلعی ساختم ولی دنبال یک تابعی می گردم که وجود یک point خاص در درون این polygon رو به من بگه.

hadisalahi2
دوشنبه 09 شهریور 1388, 17:00 عصر
با سلام
دوست عزیز مننمیدونم همچین تابعی در دلفی وجود داره یا نه ولی خوب خیلی راحت میتونی این کار رو دستی انجام بدی. البته اگه مختصات و اندازه چند ضلعی رو داشته باشی.

Felony
دوشنبه 09 شهریور 1388, 17:01 عصر
تابعی برای این کار وجود نداره ، شما به راحتی میتونید متد [Canvas.Pixel[x,y مختصات مورد نظر خودتون رو اسکن کنید و ...

اگر کارتون خیلی پیشرفته تره میتونید از روشهای پردازش تصویر پیچیده تر یا کامپوننتهای ImageEN استفاده کنید .

mbshareat
سه شنبه 31 شهریور 1388, 19:24 عصر
این برنامه رو که تصادفی تو اینترنت دیدم یه نگاه بندازین ولی به نظرم تنها راه قطعی استفاده از Pixels باشه .مثلا یه متغیر از نوع TBitmap تعریف کنید و PixelFormat اونو pf8bit قرار بدین و با قلم و قلموی یک رنگ چند ضلعی رو توش ترسیم کنین و بعد رنگ نقطه رو توی این بیت مپ بررسی کنین و آخرش هم بیت مپ رو free کنین!و اما برنامه:

mossaferin
چهارشنبه 01 مهر 1388, 11:15 صبح
سلام
اینجوری هم میشه



function PtInPoly
(const Points: Array of TPoint; X,Y: Integer):
Boolean;
var Count, K, J : Integer;
begin
Result := False;
Count := Length(Points) ;
J := Count-1;
for K := 0 to Count-1 do begin
if ((Points[K].Y <=Y) and (Y < Points[J].Y)) or
((Points[J].Y <=Y) and (Y < Points[K].Y)) then
begin
if (x < (Points[j].X - Points[K].X) *
(y - Points[K].Y) /
(Points[j].Y - Points[K].Y) + Points[K].X) then
Result := not Result;
end;
J := K;
end;
end;


موفق باشی

mbshareat
پنج شنبه 02 مهر 1388, 23:09 عصر
این برنامه هم می تونه پیکسلها رو لیست کنه هم می تونه تعیین کنه پیکسل داخل یا بر روی خط محیطی هست یانه [منو ببخشید که دیر برنامه رو نوشتم !:خجالت:]
راستش برنامه دوست عزیز آقای mossaferin (http://barnamenevis.org/forum/member.php?u=35201) رو هم با دستور زیر آزمایش کردم موفق نبود!:اشتباه:(فکر نکنم در چند ضلعی زیگزاگی بتوان از الگوریتم قرار داشتن بین نقاط چند ضلعی استفاده کرد!:متفکر:)
showmessage(BoolToStr(PtInPoly([Point(10,10),Point(20,10),Point(15,15)],20,10)));

mossaferin
شنبه 04 مهر 1388, 16:41 عصر
راستش برنامه دوست عزیز آقای mossaferin (http://barnamenevis.org/forum/member.php?u=35201) رو هم با دستور زیر آزمایش کردم موفق نبود!:اشتباه:

حق با شماست درست کار نمیکنه ، من خیلی محدود تستش کرده بودم ، شرمنده