Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Drawing;
- using OpenMOBA;
- using OpenMOBA.DevTool.Debugging;
- using OpenMOBA.Geometry;
- namespace QuadSegmentIntersection {
- public class Program {
- // assumes p is ccw ordered
- public static bool SegmentInConvexPolygon(IntLineSegment2 s, IntVector2[] p) {
- var (p1, p2) = s;
- foreach (var (a, b) in p.Zip(p.RotateLeft())) {
- var clock = GeometryOperations.Clockness(p[0], p[1], p[2]);
- if (clock != Clockness.CounterClockwise) throw new BadInputException("p not ccw");
- if (GeometryOperations.Clockness(a, b, p1) == Clockness.Clockwise && GeometryOperations.Clockness(a, b, p2) == Clockness.Clockwise) return false;
- }
- return true;
- }
- public static void Main(string[] args) {
- var bounds = new Size(1280, 720);
- var random = new Random(1);
- IntVector2 RandomPoint() {
- return new IntVector2(random.Next(0, bounds.Width), random.Next(0, bounds.Height));
- }
- IntLineSegment2 RandomSegment() {
- var b = RandomPoint();
- var o = new IntVector2(random.Next(-100, 100), random.Next(-100, 100));
- return new IntLineSegment2(b, b + o);
- }
- var segments = Util.Generate(200, RandomSegment);
- var quad = Util.Generate(4, RandomPoint);
- var hull = GeometryOperations.ConvexHull(quad);
- var host = DebugMultiCanvasHost.CreateAndShowCanvas(bounds, new Point(50, 50), new OrthographicXYProjector());
- var canvas = host.CreateAndAddCanvas(0);
- canvas.BatchDraw(() => {
- // foreach (var (x, y) in quad.Zip(quad.RotateLeft())) canvas.DrawLine(x, y, StrokeStyle.BlackHairLineSolid);
- foreach (var (x, y) in hull.Zip(hull.RotateLeft())) DebugCanvas2DExtensions.DrawLine(canvas, (IntVector2)x, y, StrokeStyle.BlackHairLineSolid);
- foreach (var s in segments) canvas.DrawLine(s.First, s.Second, SegmentInConvexPolygon(s, hull) ? StrokeStyle.LimeHairLineDashed5 : StrokeStyle.RedHairLineDashed5);
- });
- }
- }
- }
Add Comment
Please, Sign In to add comment