private static bool _HitTestTriangleFansResult(DataPair pair, LazyArray <Point3F, PointF> pointsTransformed, RectF rectInWpf, bool isFullContain, ref bool flag1, ref bool flag2) { var stopCond = false; var pt1 = pointsTransformed[pair.Start]; for (int i = 2; i < pair.Count; i++) { var pt2 = pointsTransformed[i - 1 + pair.Start]; var pt3 = pointsTransformed[i + pair.Start]; var triangle = new Triangle(pt1, pt2, pt3); if (!isFullContain) { if (rectInWpf.Contains(triangle.P1) || rectInWpf.Contains(triangle.P2) || rectInWpf.Contains(triangle.P3) || triangle.IsPointInside(rectInWpf.TopLeft) || triangle.IsPointInside(rectInWpf.TopRight) || triangle.IsPointInside(rectInWpf.BottomLeft) || triangle.IsPointInside(rectInWpf.BottomRight)) { flag1 = true; stopCond = true; break; } } else { if (!triangle.IsCompletelyInside(rectInWpf)) { flag2 = false; stopCond = true; break; } } } return(stopCond); }
private static bool _HitTestTrianglesResult(IHitTestSource model, DataPair pair, LazyArray <Point3F, PointF> pointsTransformed, RectF rectInWpf, bool isFullContain, ref bool flag1, ref bool flag2) { var stopCond = false; var stride = model.Mode == GLPrimitiveMode.GL_TRIANGLES ? 3 : 1; for (int i = 0; i < pair.Count - 2; i += stride) { var pt1 = pointsTransformed[i + pair.Start]; var pt2 = pointsTransformed[i + 1 + pair.Start]; var pt3 = pointsTransformed[i + 2 + pair.Start]; var triangle = new Triangle(pt1, pt2, pt3); if (!isFullContain) { if (rectInWpf.Contains(triangle.P1) || rectInWpf.Contains(triangle.P2) || rectInWpf.Contains(triangle.P3) || triangle.IsPointInside(rectInWpf.TopLeft) || triangle.IsPointInside(rectInWpf.TopRight) || triangle.IsPointInside(rectInWpf.BottomLeft) || triangle.IsPointInside(rectInWpf.BottomRight)) { flag1 = true; stopCond = true; break; } } else { if (!triangle.IsCompletelyInside(rectInWpf)) { flag2 = false; stopCond = true; break; } } } return(stopCond); }
public void IsPointInsideDegenerateTriangle() { // collinear points var triangle = new Triangle(new Point(0, 0), new Point(2, 0), new Point(3, 0)); Assert.IsFalse(triangle.IsPointInside(new Point(1, 0)), "on edge"); Assert.IsFalse(triangle.IsPointInside(new Point(0, 3)), "outside"); }
public void IsPointInside() { var triangle = new Triangle(new Point(0, 0), new Point(2, 0), new Point(0, 3)); Assert.IsTrue(triangle.IsPointInside(new Point(1, 1)), "inside"); Assert.IsFalse(triangle.IsPointInside(new Point(2, 3)), "outside"); Assert.IsFalse(triangle.IsPointInside(new Point(1, 0)), "on edge"); Assert.IsFalse(triangle.IsPointInside(new Point(0, 0)), "on vertex"); }