Toon posts:

[BCB] Punt in polygon detecteren *

Pagina: 1
Acties:

Verwijderd

Topicstarter
In c++ builder heb ik een Tcanvas met daarop een polygon getekend. Als je met de muis op dat vlak klikt is het mogelijk een X en Y coördinaat terug te krijgen.

Om te bepalen of je binnen bijv. een rechthoekig vierkant geklikt hebt kun je gewoon met if/groterdan/kleinerdan bepalen of je binnen een bepaald vlak geklikt hebt. Maar hoe kan je dat het beste oplossen met een polygon..?(gezien je geen "rechte" zijden hebt)..? Het lijkt me namelijk nogal een klus om dat vlak met integreren te gaan beschrijven..

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Verwijderd schreef op 24 maart 2004 @ 10:25:
In c++ builder heb ik een Tcanvas met daarop een polygon getekend. Als je met de muis op dat vlak klikt is het mogelijk een X en Y coördinaat terug te krijgen.

Om te bepalen of je binnen bijv. een rechthoekig vierkant geklikt hebt kun je gewoon met if/groterdan/kleinerdan bepalen of je binnen een bepaald vlak geklikt hebt. Maar hoe kan je dat het beste oplossen met een polygon..?(gezien je geen "rechte" zijden hebt)..? Het lijkt me namelijk nogal een klus om dat vlak met integreren te gaan beschrijven..
Een polygon is gewoon een stel lijnen. Een simpel algoritme zal voor ieder van deze lijnen checken of dat punt aan de 'binnenkant' van de lijn zit. Er zijn vast nog wel algoritmes die sneller zijn, maar daarvoor moet je ff [google=point in polygon]

Edit: Ah, wacht, koffie... Dit simpele algoritme gaat natuurlijk alleen goed bij een convex polygon. Anders stabbing gebruiken http://www.alienryderflex.com/polygon/ (gevonden met google)

[ Voor 14% gewijzigd door SWfreak op 24-03-2004 11:00 ]


  • Icelus
  • Registratie: Januari 2004
  • Niet online
Je zou van de polygon een region kunnen maken (m.b.v. CreatePolygonRgn API) en vervolgens met de PtInRegion API functie kunnen testen of het punt er in ligt.

Developer Accused Of Unreadable Code Refuses To Comment


Verwijderd

Topicstarter
Cool..! Bedankt..! Ik heb het als volgt opgelost:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool __fastcall TfrmMouse::PointInPolygon(Windows::TPoint *Points, int X, int Y)
{
  int      j=0;
  boolean  oddNODES=FALSE ;

  for (int i=0; i<3; i++)
  {
    j++;
    if (j==4) j=0;
    if (Points[i].y<Y && Points[j].y>=Y
    ||  Points[j].y<Y && Points[i].y>=Y)
    {
      if (Points[i].x+(Y-Points[i].y)/(Points[j].y-Points[i].y)*(Points[j].x-Points[i].x)<X)
      {
        oddNODES=!oddNODES;
      }
    }
  }
  return oddNODES;
}

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Met Icelus' oplossing kan het een stuk korter, en kun je de region meteen gebruiken om te tekenen en/of te fillen :)

Professionele website nodig?