private List <MyEdge> RemoveCollinearEdges() { List <MyEdge> ClearEdges = new List <MyEdge>(); MyEdge tmpEdge = null; MyEdge edge = null; bool AreCollinear = false; for (int i = 0; i < Edges.Count; i++) { if (AreCollinear == true) { edge = tmpEdge; } else { edge = Edges[i]; } var nextEdge = Edges[(i + 1) % Edges.Count]; if (MyPoint.CheckIfCollinear(edge.first, edge.second, nextEdge.second) == true) { tmpEdge = new MyEdge(edge.first, nextEdge.second); AreCollinear = true; if (i == Edges.Count - 1) { var finalEdge = new MyEdge(tmpEdge.first, ClearEdges.First().second); ClearEdges.Add(finalEdge); ClearEdges.RemoveAt(0); } } else { ClearEdges.Add(edge); AreCollinear = false; } } return(ClearEdges); }
public bool IsPointInside(Point p) { //testing RemoveCollinearEdges //var edgeFirst = Edges[0]; //var edgeThird = Edges[2]; //var myEdge1 = new MyEdge(edgeFirst.second, new MyPoint(edgeFirst.second.X + 50, edgeFirst.second.Y)); //var myEdge2 = new MyEdge(new MyPoint(edgeFirst.second.X + 50, edgeFirst.second.Y), new MyPoint(edgeFirst.second.X + 100, edgeFirst.second.Y)); //edgeThird.first = myEdge2.second; //Edges.RemoveAt(1); //Edges.Insert(1, myEdge2); //Edges.Insert(1, myEdge1); List <MyEdge> ClearEdges = RemoveCollinearEdges(); MyEdge Ray = new MyEdge(new MyPoint(p.X, p.Y), new MyPoint(p.X + canvas.ActualWidth, p.Y)); int intersectCounter = 0; for (int i = 0; i < ClearEdges.Count; i++) { var previousEdge = ClearEdges[(i - 1 + ClearEdges.Count) % ClearEdges.Count]; var edge = ClearEdges[i]; var nextEdge = ClearEdges[(i + 1) % ClearEdges.Count]; if (MyEdge.DoIntersect(edge, Ray) == true) { var firstCollinear = MyPoint.CheckIfCollinear(Ray.first, edge.first, Ray.second); var secondCollinear = MyPoint.CheckIfCollinear(Ray.first, edge.second, Ray.second); if (firstCollinear == true && secondCollinear == true) { //if previosEdge.first i nextEdge.second leza //po przeciwnych stronach polprostej Ray to intersectCounter++ if ((previousEdge.first.Y > Ray.first.Y && nextEdge.second.Y < Ray.first.Y) || (previousEdge.first.Y < Ray.first.Y && nextEdge.second.Y > Ray.first.Y)) { intersectCounter++; } } else if (firstCollinear == true) { //if previousEdge.first i edge.second leza //po przeciwnych stronach polprostej Ray to intersectCounter++ i i++ if ((previousEdge.first.Y > Ray.first.Y && edge.second.Y < Ray.first.Y) || (previousEdge.first.Y < Ray.first.Y && edge.second.Y > Ray.first.Y)) { intersectCounter++; i++; } } else if (secondCollinear == true) { //if edge.first i nextEdge.second leza //po przeciwnych stronach polprostej Ray to intersectCounter++ i i++ if ((edge.first.Y > Ray.first.Y && nextEdge.second.Y < Ray.first.Y) || (edge.first.Y < Ray.first.Y && nextEdge.second.Y > Ray.first.Y)) { intersectCounter++; i++; } } else { intersectCounter++; } } } return(intersectCounter % 2 == 1); }