Advertisement
Guest User

Untitled

a guest
Nov 12th, 2015
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.62 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. class Point {
  4.   public float X;
  5.   public float Y;
  6.   public Point(float x, float y) {
  7.     this.X = x;
  8.     this.Y = y;
  9.   }
  10.  
  11.   public float getDistance(Point p) {
  12.     return sqrt((float)((p.X-X)*(p.X-X)+(p.Y-Y)*(p.Y-Y)));
  13.   }
  14. }
  15.  
  16. class Edge {
  17.   public Point Start,End;
  18.   public Edge(Point start, Point end) {
  19.     this.Start = start;
  20.     this.End = end;
  21.   }
  22.  
  23.   public boolean isEqualTo(Edge e) {
  24.     return (Start.getDistance(e.Start)<epsilon && End.getDistance(e.End)<epsilon)
  25.                || (Start.getDistance(e.End)<epsilon && End.getDistance(e.Start)<epsilon);
  26.   }
  27. }
  28.  
  29. class Triangle {
  30.   public Edge[] edges;
  31.   public Triangle(Point a, Point b, Point c) {
  32.     edges = new Edge[3];
  33.     edges[0] = new Edge(a, b);
  34.     edges[1] = new Edge(b,c);
  35.     edges[2] = new Edge(a,c);
  36.   }
  37.  
  38.   public boolean hasCommonVertices(Triangle t) {
  39.     for(Edge e1:t.edges) {
  40.      for(Edge e2:edges) {
  41.        if(e1.Start.getDistance(e2.Start)<epsilon || e1.End.getDistance(e2.End)<epsilon ||
  42.              e1.Start.getDistance(e2.End)<epsilon || e1.End.getDistance(e2.Start)<epsilon)
  43.          return true;
  44.      }
  45.     }
  46.     return false;
  47.   }
  48.  
  49.   public Point getCircumcircleCenter() {
  50.     Point a = edges[0].Start;
  51.     Point b = edges[0].End;
  52.     Point c = edges[1].End;
  53.     float d = 2.0 * (a.X * (b.Y - c.Y) + b.X * (c.Y - a.Y) + c.X * (a.Y - b.Y));
  54.     float ux = ((a.X * a.X + a.Y * a.Y) * (b.Y - c.Y) + (b.X * b.X + b.Y * b.Y) * (c.Y - a.Y) + (c.X * c.X + c.Y * c.Y) * (a.Y - b.Y)) / d;
  55.     float uy = ((a.X * a.X + a.Y * a.Y) * (c.X - b.X) + (b.X * b.X + b.Y * b.Y) * (a.X - c.X) + (c.X * c.X + c.Y * c.Y) * (b.X - a.X)) / d;
  56.     return new Point(ux, uy);
  57.   }
  58.  
  59.   public float getRadius() {
  60.     return this.getCircumcircleCenter().getDistance(edges[0].Start);
  61.   }
  62. }
  63.  
  64. void correctTriangulation(Point p) {
  65.   if(triangles.size() < 1) return;
  66.   List<Triangle> incorrectTriangles = new ArrayList<Triangle>();
  67.   for(Triangle t:triangles) {
  68.     float radius = t.getRadius();
  69.     float distance = t.getCircumcircleCenter().getDistance(p);
  70.     if(distance<radius) {
  71.       incorrectTriangles.add(t);
  72.     }
  73.   }
  74.   for(Triangle t:incorrectTriangles) {
  75.     triangles.remove(t);
  76.   }
  77.   List<Edge> hull = new ArrayList<Edge>();
  78.   boolean contains;
  79.   for(Triangle t:incorrectTriangles) {
  80.     for(Edge e:t.edges) {
  81.       contains = false;
  82.       for(Edge hullEdge:hull) {
  83.         if(hullEdge.isEqualTo(e)) {
  84.           contains = true;
  85.           hull.remove(e);
  86.           hull.remove(hullEdge);
  87.           break;
  88.         }
  89.       }
  90.       if(!contains) {
  91.         hull.add(e);
  92.       }
  93.     }
  94.   }
  95.   for(Edge e:hull) {
  96.     triangles.add(new Triangle(e.Start, e.End, p));
  97.   }
  98. }
  99.  
  100. void drawTriangles() {
  101.   for(Triangle t:triangles) {
  102.     if(!t.hasCommonVertices(bigOne)) {
  103.       for(Edge e:t.edges) {
  104.         line(e.Start.X, e.Start.Y, e.End.X, e.End.Y);
  105.       }
  106.     }
  107.   }
  108. }
  109.  
  110. boolean wasReleased = true;
  111. float epsilon = 0.000001;
  112. Triangle bigOne = new Triangle(new Point(10000, 0), new Point(-10000, 10000), new Point(-10000, -10000));
  113. List<Triangle> triangles = new ArrayList<Triangle>();
  114. List<Point> points = new ArrayList<Point>();
  115.  
  116. void setup() {
  117.   size(640, 360);
  118.   noSmooth();
  119.   fill(126);
  120.   background(102);
  121.   triangles.add(bigOne);
  122. }
  123.  
  124. void draw() {
  125.   if (mousePressed && wasReleased) {
  126.     background(102);
  127.     wasReleased = false;
  128.     Point p = new Point(mouseX, mouseY);
  129.     points.add(p);
  130.     correctTriangulation(p);
  131.     stroke(255);
  132.   }
  133.   for(Point p1:points) {
  134.     point((int)p1.X, (int)p1.Y);
  135.   }
  136.   drawTriangles();
  137. }
  138.  
  139. void mouseReleased() {
  140.   wasReleased = true;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement