Problem 3 i 4: Pripadnost tačke kružnici ili pravilnom poligonu
Implementacija problema pripadnosti tačke u kružnici je vrlo prosta i zahtjeva samo provjeru da li je dužina centra kružnice do posmatrane tačke manja ili jednaka radijusu kružnice. Implementacija se može napisati na sljedeci način:
/// <summary> /// provjerava da i se tačka nalazi u kružnici /// </summary> /// <param name="a">koordinate tačke </param> /// <param name="o1">koordinate centra kružnice</param> /// <param name="radius">radijus kružnica</param> /// <returns></returns> bool isInCircle(Point a, Point o1, float radius) { float length = (float)Math.Sqrt((a.x - o1.x) * (a.x - o1.x) + (a.y - o1.y) * (a.y - o1.y)); if (radius >= length) return true; else return false; }
Implementacija problema tačke u pravilnom poligonu je malo komplikovanija, a bazira se na činjenici da u koliko je tačka unutar poligona, tada tačka mora biti sa desne strane svih njegovih stranica, u koliko se stranica obilaze u smjeru kretanja kazaljke na satu. Implementacija izgleda kao na sljedećem listingu:
/// <summary> /// vraća true ako se tačka A nalazi u poligonu /// </summary> /// <param name="a"></param> /// <param name="o1">centar poligona</param> /// <param name="polyedges">tačke tjemena poligona poredane u smjeru kretanja kazaljke na satu.</param> /// <returns></returns> bool isInPolygon(Point a, Point o1, Point[]polyedges) { for (int i = 0; i < polyedges.Length; i++) { int j = i++; if (j == polyedges.Length) j = 0; if (isOnRightSide(a, polyedges[i], polyedges[j])==-1) return false; } return true; }
Iz zadnjeg listinga vidimo da smo koristili metodu isOnRightSide iz prethodnog posta.