Guest User

Untitled

a guest
Nov 20th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.04 KB | None | 0 0
  1. using System;
  2. using System.Drawing;
  3. using OpenMOBA;
  4. using OpenMOBA.DevTool.Debugging;
  5. using OpenMOBA.Geometry;
  6.  
  7. namespace QuadSegmentIntersection {
  8. public class Program {
  9. // assumes p is ccw ordered
  10. public static bool SegmentInConvexPolygon(IntLineSegment2 s, IntVector2[] p) {
  11. var (p1, p2) = s;
  12. foreach (var (a, b) in p.Zip(p.RotateLeft())) {
  13. var clock = GeometryOperations.Clockness(p[0], p[1], p[2]);
  14. if (clock != Clockness.CounterClockwise) throw new BadInputException("p not ccw");
  15. if (GeometryOperations.Clockness(a, b, p1) == Clockness.Clockwise && GeometryOperations.Clockness(a, b, p2) == Clockness.Clockwise) return false;
  16. }
  17. return true;
  18. }
  19.  
  20. public static void Main(string[] args) {
  21. var bounds = new Size(1280, 720);
  22. var random = new Random(1);
  23.  
  24. IntVector2 RandomPoint() {
  25. return new IntVector2(random.Next(0, bounds.Width), random.Next(0, bounds.Height));
  26. }
  27.  
  28. IntLineSegment2 RandomSegment() {
  29. var b = RandomPoint();
  30. var o = new IntVector2(random.Next(-100, 100), random.Next(-100, 100));
  31. return new IntLineSegment2(b, b + o);
  32. }
  33.  
  34. var segments = Util.Generate(200, RandomSegment);
  35. var quad = Util.Generate(4, RandomPoint);
  36. var hull = GeometryOperations.ConvexHull(quad);
  37.  
  38. var host = DebugMultiCanvasHost.CreateAndShowCanvas(bounds, new Point(50, 50), new OrthographicXYProjector());
  39. var canvas = host.CreateAndAddCanvas(0);
  40. canvas.BatchDraw(() => {
  41. // foreach (var (x, y) in quad.Zip(quad.RotateLeft())) canvas.DrawLine(x, y, StrokeStyle.BlackHairLineSolid);
  42. foreach (var (x, y) in hull.Zip(hull.RotateLeft())) DebugCanvas2DExtensions.DrawLine(canvas, (IntVector2)x, y, StrokeStyle.BlackHairLineSolid);
  43. foreach (var s in segments) canvas.DrawLine(s.First, s.Second, SegmentInConvexPolygon(s, hull) ? StrokeStyle.LimeHairLineDashed5 : StrokeStyle.RedHairLineDashed5);
  44. });
  45. }
  46. }
  47. }
Add Comment
Please, Sign In to add comment