private void RenderLine(Vector3 start, Vector3 end, Plane plane, Color color, ICamera camera, I2DRenderer im) { var line = new Line(start, end); var cls = line.ClassifyAgainstPlane(plane); if (cls == PlaneClassification.Back) { return; } if (cls == PlaneClassification.Spanning) { var isect = plane.GetIntersectionPoint(line, true); var first = plane.OnPlane(line.Start) > 0 ? line.Start : line.End; if (!isect.HasValue) { return; } line = new Line(first, isect.Value); } var st = camera.WorldToScreen(line.Start); var en = camera.WorldToScreen(line.End); im.AddLine(st.ToVector2(), en.ToVector2(), color, 2); }
/// <summary> /// Determines if this line is behind, in front, or spanning a plane. /// </summary> /// <param name="p">The plane to test against</param> /// <returns>A PlaneClassification value.</returns> public PlaneClassification ClassifyAgainstPlane(Plane p) { var start = p.OnPlane(Start); var end = p.OnPlane(End); if (start == 0 && end == 0) { return(PlaneClassification.OnPlane); } if (start <= 0 && end <= 0) { return(PlaneClassification.Back); } if (start >= 0 && end >= 0) { return(PlaneClassification.Front); } return(PlaneClassification.Spanning); }
private void AddLine(CircleType type, Vector3 start, Vector3 end, Plane test, CachedLines cache) { var line = new Line(start, end); var cls = line.ClassifyAgainstPlane(test); if (cls == PlaneClassification.Back) { return; } if (cls == PlaneClassification.Spanning) { var isect = test.GetIntersectionPoint(line, true); var first = test.OnPlane(line.Start) > 0 ? line.Start : line.End; if (isect.HasValue) { line = new Line(first, isect.Value); } } cache.Cache[type].Add(new Line(cache.Viewport.Camera.WorldToScreen(line.Start), cache.Viewport.Camera.WorldToScreen(line.End))); }
/// <summary> /// Determines if this polygon is behind, in front, or spanning a plane. /// </summary> /// <param name="p">The plane to test against</param> /// <returns>A PlaneClassification value.</returns> public PlaneClassification ClassifyAgainstPlane(Plane p) { var count = Vertices.Count; var front = 0; var back = 0; var onplane = 0; foreach (var t in Vertices) { var test = p.OnPlane(t); // Vertices on the plane are both in front and behind the plane in this context if (test <= 0) { back++; } if (test >= 0) { front++; } if (test == 0) { onplane++; } } if (onplane == count) { return(PlaneClassification.OnPlane); } if (front == count) { return(PlaneClassification.Front); } if (back == count) { return(PlaneClassification.Back); } return(PlaneClassification.Spanning); }