public bool CheckCollision(Plane2D p) { float dir = (float)Vector.Multiply(Direction, p.Normal); float dis = p.DistanceTo(Origin); if (dis == 0) { return(true); } if (dir >= 0) { return(false); } float actualLength = -(dis / dir); if (actualLength > Length) { return(false); } else { return(true); } }
public void RemovePolygon(Vector pos) { foreach (Polygon p in polygons) { bool isSelected = true; foreach (Edge ed in p.edges) { Plane2D temp = new Plane2D(ed.start, ed.end); if (temp.CheckCollision(pos) == true) { isSelected = false; break; } } if (isSelected == true) { polygons.Remove(p); return; } } }
/// <summary> /// Checks that the polygon being made is valid. /// </summary> private void ValidatePoly() { if (tempNodes.Count >= 2) { // Checks if the polygon will overlap another. List <Vector> tempArray = new List <Vector>(tempNodes); if (nodeSelect != originNode) { tempArray.Add(nodeSelect); } Vector checkPoint = new Vector((tempArray.ElementAt(0).X + tempArray.ElementAt(1).X + tempArray.ElementAt(2).X) / 3, (tempArray.ElementAt(0).Y + tempArray.ElementAt(1).Y + tempArray.ElementAt(2).Y) / 3); Plane2D plane = new Plane2D(tempArray.ElementAt(0), tempArray.ElementAt(1)); if (plane.CheckCollision(checkPoint) == true) { tempArray.Reverse(); } List <Plane2D> tempPlanes = new List <Plane2D>(); for (int i = 0; i < tempArray.Count; ++i) { if (i == tempArray.Count - 1) { tempPlanes.Add(new Plane2D(tempArray[i], tempArray[0])); } else { tempPlanes.Add(new Plane2D(tempArray[i], tempArray[i + 1])); } } List <Vector> vSet = new List <Vector>(); foreach (Polygon p in polygons) { foreach (Edge ed in p.edges) { vSet.Add(ed.start); } } foreach (Vector v in vSet) { bool isValid = false; foreach (Plane2D pl in tempPlanes) { if (tempArray.Any(vec => vec == v) == true || pl.CheckCollision(v) == true) { isValid = true; } } if (isValid == false) { nodeSelect = tempNodes.ElementAt(tempNodes.Count - 1); MessageBox.Show("The polygon will overlap with another.", "Invalid edge"); return; } } } if (tempNodes.Count < 3) { tempNodes.Add(nodeSelect); return; } int tailNode = tempNodes.Count - 1; if (tempNodes.Count == 3) { Vector checkPoint = new Vector((tempNodes.ElementAt(0).X + tempNodes.ElementAt(1).X + tempNodes.ElementAt(2).X) / 3, (tempNodes.ElementAt(0).Y + tempNodes.ElementAt(1).Y + tempNodes.ElementAt(2).Y) / 3); Plane2D plane = new Plane2D(tempNodes.ElementAt(0), tempNodes.ElementAt(1)); if (plane.CheckCollision(checkPoint) == true) { polyPositive = false; } else { polyPositive = true; } } // Checks if Polygon is convex by comparing with the other temp nodes. Plane2D checkPlane; if (nodeSelect != originNode) { if (polyPositive == true) { checkPlane = new Plane2D(tempNodes.ElementAt(tailNode), nodeSelect); } else { checkPlane = new Plane2D(nodeSelect, tempNodes.ElementAt(tailNode)); } for (int i = 0; i < tailNode - 1; ++i) { if (checkPlane.CheckCollision(tempNodes.ElementAt(i)) == true) { nodeSelect = tempNodes.ElementAt(tailNode); MessageBox.Show("Polygon needs to be convex.", "Invalid edge"); return; } } } else { if (polyPositive == true) { checkPlane = new Plane2D(tempNodes.ElementAt(tailNode), nodeSelect); } else { checkPlane = new Plane2D(nodeSelect, tempNodes.ElementAt(tailNode)); } for (int i = 1; i < tailNode; ++i) { if (checkPlane.CheckCollision(tempNodes.ElementAt(i)) == true) { tempNodes.RemoveAt(tailNode); nodeSelect = tempNodes.ElementAt(tailNode - 1); MessageBox.Show("Polygon needs to be convex.", "Invalid edge"); return; } } } // Adds selected node if it passes all the validation checks. if (nodeSelect != originNode) { tempNodes.Add(nodeSelect); } // Removes uneeded nodes that were inlined with the current node. Vector cur = tempNodes.ElementAt(tailNode) - tempNodes.ElementAt(tailNode - 1); Vector prev = tempNodes.ElementAt(tailNode - 1) - tempNodes.ElementAt(tailNode - 2); float crossProduct = (float)(prev.X * cur.Y - prev.Y * cur.X); if (crossProduct == 0) { tempNodes.RemoveAt(tailNode - 1); } // One last check to see if the polygon already exists. Then stores the polygon once it is complete. if (tempNodes.Count >= 3 && nodeSelect == originNode) { foreach (Polygon p in polygons) { int edgeCount = p.edges.Count; for (int i = 0; i < p.edges.Count; ++i) { foreach (Vector v in tempNodes) { if (v == p.edges.ElementAt(i).start) { edgeCount--; if (edgeCount == 0) { originNode = new Vector(double.NaN, double.NaN); nodeSelect = new Vector(double.NaN, double.NaN); tempNodes.Clear(); polyPositive = true; MessageBox.Show("Polygon is a duplicate and/or overlaps another.", "Invalid Polygon"); return; } } } } } var nodeArray = tempNodes.ToArray(); if (polyPositive == false) { Array.Reverse(nodeArray); } polygons.Add(new Polygon(nodeArray)); originNode = new Vector(double.NaN, double.NaN); nodeSelect = new Vector(double.NaN, double.NaN); tempNodes.Clear(); polyPositive = true; } }