public void TestCyrusBeck() { Console.WriteLine($"========== Cyrus-Beck Algorithm ==========="); Geometry2D.SegmentIntersection segmentIntersection1 = Geometry2D.ClippingLineSegmentToEdge( new LineSegment(new Vector2(0, 0), new Vector2(10, 10)), new LineSegment(new Vector2(10, 0), new Vector2(0, 10))); Console.WriteLine($"<시작점이 바깥에 있는 경우> State:{segmentIntersection1.State} Clip:{segmentIntersection1.Clip}"); Geometry2D.SegmentIntersection segmentIntersection2 = Geometry2D.ClippingLineSegmentToEdge( new LineSegment(new Vector2(0, 0), new Vector2(10, 10)), new LineSegment(new Vector2(0, 10), new Vector2(10, 0))); Console.WriteLine($"<시작점이 안쪽에 있는 경우> State:{segmentIntersection2.State} Clip:{segmentIntersection2.Clip}"); Console.WriteLine($"==========================================="); }
static void Main(string[] args) { Console.WriteLine($"======== CCW ========"); double positive = Geometry2D.CCW(new Vector2(0, 0.5), new Vector2(0, 0), new Vector2(1, 1)); Console.WriteLine($"CCW Cross +: {positive}"); double negative = Geometry2D.CCW(new Vector2(0.5, 0), new Vector2(0, 0), new Vector2(1, 1)); Console.WriteLine($"CCW Cross -: {negative}"); double parallel = Geometry2D.CCW(new Vector2(0.5, 0.5), new Vector2(0, 0), new Vector2(1, 1)); Console.WriteLine($"CCW Cross 0: {parallel}"); Console.WriteLine($"====================="); Console.WriteLine($"======== Line Intersection ========"); Line a = new Line(new Vector2(0, 0), new Vector2(10, 10) - new Vector2(0, 0)); Line b = new Line(new Vector2(10, 0), new Vector2(0, 10) - new Vector2(1, 0)); Geometry2D.Intersection intersection = Geometry2D.GetLineIntersection(a, b); Console.WriteLine($"Is Parallel:{intersection.IsParallel}, Point:{intersection.IntersectPoint}"); Console.WriteLine($"==================================="); Console.WriteLine($"========== Cyrus-Beck Algorithm ==========="); Geometry2D.SegmentIntersection segmentIntersection1 = Geometry2D.ClippingLineSegmentToEdge( new LineSegment(new Vector2(0, 0), new Vector2(10, 10)), new LineSegment(new Vector2(10, 0), new Vector2(0, 10))); Console.WriteLine($"<시작점이 바깥에 있는 경우> State:{segmentIntersection1.State} Clip:{segmentIntersection1.Clip}"); Geometry2D.SegmentIntersection segmentIntersection2 = Geometry2D.ClippingLineSegmentToEdge( new LineSegment(new Vector2(0, 0), new Vector2(10, 10)), new LineSegment(new Vector2(0, 10), new Vector2(10, 0))); Console.WriteLine($"<시작점이 안쪽에 있는 경우> State:{segmentIntersection2.State} Clip:{segmentIntersection2.Clip}"); Console.WriteLine($"==========================================="); Console.WriteLine($"========== 도형의 넓이 구하기 ==========="); double boxArea = Geometry2D.Area(new[] { new Vector2(0, 0), new Vector2(10, 0), new Vector2(10, 10), new Vector2(0, 10) }); Console.WriteLine($"사각형의 넓이(가로:{10},세로:{10}) , {boxArea}"); double triArea = Geometry2D.Area(new[] { new Vector2(0, 0), new Vector2(10, 0), new Vector2(5, 10) }); Console.WriteLine($"삼각형의 넓이(가로:{10},세로:{10}) , {triArea}"); Console.WriteLine($"==========================================="); Clipper2D clipper2d = new Clipper2D(); List <Vector2> clipWindow = new List <Vector2>() { new Vector2(0, 0), new Vector2(10, 0), new Vector2(10, 10), new Vector2(0, 10) }; List <Vector2> subjectPolygon = new List <Vector2>() { //new Vector2(5, 5), //new Vector2(20, 20), //new Vector2(5, 20) new Vector2(5, 5), new Vector2(20, 5), new Vector2(20, 20), new Vector2(5, 20) }; List <Vector2> clipResult = new List <Vector2>(100); clipper2d.Clip(clipWindow, subjectPolygon, clipResult); int i = 0; foreach (Vector2 vector2 in clipResult) { Console.WriteLine($"{i}: {vector2}"); i++; } }