Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.47 KB | None | 0 0
  1. class Triangle_Mesh{
  2. constructor(triangles){
  3. this.triangles = triangles;
  4. this.edges = this.get_edges();
  5. this.vertices = this.get_vertices();
  6. }
  7.  
  8. get_edges(){
  9. var edges = [], tempEdge, edgesIncludesTempEdge;
  10. // Loop through all triangles
  11. for (var i = 0; i < this.triangles.length; i++){
  12. // Loopa igenom alla kanter i varje triangel
  13. for (var j = 0; j < 3; j++){
  14. tempEdge = this.triangles[i].edges[j];
  15. edgesIncludesTempEdge = false;
  16. for (var k = 0; k < edges.length; k++){
  17. edgesIncludesTempEdge = edgesIncludesTempEdge
  18. || edges[k].is_equal_to(tempEdge);
  19. }
  20. if (!edgesIncludesTempEdge){
  21. edges.push(tempEdge);
  22. }
  23. }
  24. }
  25. return edges;
  26. }
  27.  
  28. get_vertices(){
  29. var vertices = [];
  30. var tempVertex;
  31. // Loop through all triangles
  32. for (var i = 0; i < this.triangles.length; i++){
  33. // Loop through all vertices in all edges
  34. for (var j = 0; j < 3; j++){
  35. tempVertex = this.triangles[i].vertices[j];
  36. if (!vertices.includes(tempVertex)){
  37. vertices.push(tempVertex);
  38. }
  39. if (!vertices.includes(tempVertex)){
  40. vertices.push(tempVertex);
  41. }
  42. }
  43. }
  44. return vertices;
  45. }
  46. }
  47.  
  48. class Polygon{
  49. constructor(edges){
  50. this.edges = edges;
  51. this.vertices = this.get_vertices();
  52. }
  53.  
  54. get_vertices(){
  55. var vertices = [];
  56. // Loopa igenom alla kanter
  57. for (var i = 0; i < this.edges.length; i++){
  58. if (!vertices.includes(this.edges[i].vertex1)){
  59. vertices.push(this.edges[i].vertex1);
  60. }
  61. if (!vertices.includes(this.edges[i].vertex2)){
  62. vertices.push(this.edges[i].vertex2);
  63. }
  64. }
  65. return vertices;
  66. }
  67.  
  68. get_vertices_in(list){
  69. var returnList = [];
  70. for (var i = 0; i < list.length; i++){
  71. if (this.vertices.includes(list[i])){
  72. returnList.push(list[i]);
  73. }
  74. }
  75. return returnList;
  76. }
  77. }
  78.  
  79. class Triangle extends Polygon{
  80. constructor(edges, vertices){
  81. super(edges, vertices);
  82. this.vertices = this.get_vertices();
  83. this.a = this.vertices[0];
  84. this.b = this.vertices[1];
  85. this.c = this.vertices[2];
  86. this.sortedClockwise = this.clockwise();
  87. }
  88.  
  89. clockwise() {
  90. return (this.b.x - this.a.x)*(this.c.y - this.a.y) -
  91. (this.c.x - this.a.x)*(this.b.y - this.a.y) > 0;
  92. }
  93.  
  94. circumcircle_contains(node) {
  95. var ax_ = this.a.x - node.x;
  96. var ay_ = this.a.y - node.y;
  97. var bx_ = this.b.x - node.x;
  98. var by_ = this.b.y - node.y;
  99. var cx_ = this.c.x - node.x;
  100. var cy_ = this.c.y - node.y;
  101.  
  102. var determinant =
  103. (ax_*ax_ + ay_*ay_) * (bx_*cy_ - cx_*by_) -
  104. (bx_*bx_ + by_*by_) * (ax_*cy_ - cx_*ay_) +
  105. (cx_*cx_ + cy_*cy_) * (ax_*by_ - bx_*ay_);
  106. return (this.sortedClockwise) ?
  107. determinant > 0 : determinant < 0;
  108. }
  109. }
  110.  
  111. class Edge{
  112. constructor(vertex1, vertex2){
  113. this.vertex1 = vertex1;
  114. this.vertex2 = vertex2;
  115. }
  116.  
  117. is_equal_to(edge){
  118. var same = this.vertex1 == edge.vertex1 &&
  119. this.vertex2 == edge.vertex2;
  120. var sameButFlipped = this.vertex1 == edge.vertex2 &&
  121. this.vertex2 == edge.vertex1;
  122. return same || sameButFlipped;
  123. }
  124.  
  125. get_length(){
  126. return dist(this.vertex1.x, this.vertex2.x,
  127. this.vertex1.y, this.vertex2.y);
  128. }
  129. }
  130.  
  131. class Node{
  132. constructor(x, y){
  133. this.x = x;
  134. this.y = y;
  135. this.relativeNeighbors = [];
  136. this.delaunayNeighbors = [];
  137. this.urquhartNeighbors = [];
  138. }
  139.  
  140. isRightOfEdge(edge){
  141. var determinant =
  142. (edge.vertex2.x - edge.vertex1.x) * (this.y - edge.vertex1.y)
  143. - (edge.vertex2.y - edge.vertex1.y) * (this.x - edge.vertex1.x);
  144. return determinant > 0;
  145. }
  146. }
  147.  
  148.  
  149. // This is the function where the problem lies
  150. function get_delaunay_triangulation(nodeList){
  151. var triangulation = [];
  152. var badTriangles = [];
  153. var nextNode;
  154. var polygonHole = [];
  155.  
  156. var sTVertex1 = new Node(0, 0);
  157. var sTVertex2 = new Node(2 * c.width + 1, 0);
  158. var sTVertex3 = new Node(0, 2 * c.height + 1);
  159. var sTEdge1 = new Edge(sTVertex1, sTVertex2);
  160. var sTEdge2 = new Edge(sTVertex2, sTVertex3);
  161. var sTEdge3 = new Edge(sTVertex3, sTVertex1);
  162. var superTriangle = new Triangle([sTEdge1, sTEdge2, sTEdge3]);
  163. triangulation.push(superTriangle);
  164.  
  165. for (var i = 0; i < nodeList.length; i++){
  166. nextNode = nodeList[i]; // Punkten som läggs till
  167.  
  168. badTriangles = []; // Återställer badTriangles för varje ny punkt
  169. for (var j = 0; j < triangulation.length; j++){
  170. var maybeBadTriangle = triangulation[j];
  171. var verticesInST = maybeBadTriangle.get_vertices_in(
  172. superTriangle.vertices);
  173. if (verticesInST.length == 0){
  174. if (maybeBadTriangle.circumcircle_contains(nextNode)){
  175. badTriangles.push(maybeBadTriangle);
  176. }
  177. } else if (verticesInST.length == 1) {
  178. var otherVertices = [...maybeBadTriangle.vertices];
  179. otherVertices.splice(
  180. otherVertices.indexOf(verticesInST[0]), 1);
  181. var tempEdge = new Edge(otherVertices[0], otherVertices[1]);
  182. if (verticesInST[0].isRightOfEdge(tempEdge) ==
  183. nextNode.isRightOfEdge(tempEdge)){
  184. badTriangles.push(maybeBadTriangle);
  185. }
  186. } else if (verticesInST.length == 2) {
  187. var otherVertices = [...maybeBadTriangle.vertices];
  188. var otherVertex;
  189. for (var k = 0; k < 3; k++){
  190. if (!superTriangle.vertices.includes(otherVertices[k])){
  191. otherVertex = otherVertices[k];
  192. break;
  193. }
  194. }
  195. var tempEdge = new Edge(otherVertex, new Node(
  196. otherVertex.x + verticesInST[1].x - verticesInST[0].x,
  197. otherVertex.y + verticesInST[1].y - verticesInST[0].y)
  198. );
  199. if (nextNode.isRightOfEdge(tempEdge) ==
  200. verticesInST[0].isRightOfEdge(tempEdge)){
  201. badTriangles.push(maybeBadTriangle);
  202. }
  203. } else {
  204. badTriangles.push(maybeBadTriangle);
  205. }
  206. }
  207.  
  208. polygonHole = [];
  209. for (var j = 0; j < badTriangles.length; j++){
  210. // Kollar varje kant i triangeln
  211. for (var k = 0; k < 3; k++){
  212. var testEdge = badTriangles[j].edges[k];
  213. var testEdgeIsUnique = true;
  214. for (var l = 0; l < badTriangles.length; l++){
  215. for (var m = 0; m < 3; m++){
  216. if (testEdge.is_equal_to(badTriangles[l].edges[m]) &&
  217. l != j){
  218. testEdgeIsUnique = false;
  219. break;
  220. }
  221. }
  222. if (!testEdgeIsUnique){ break; }
  223. }
  224. if (testEdgeIsUnique){
  225. polygonHole.push(testEdge);
  226. }
  227. }
  228. }
  229. for (var j = 0; j < badTriangles.length; j++){
  230. var index = triangulation.indexOf(badTriangles[j]);
  231. if (index != -1){
  232. triangulation.splice(index, 1);
  233. }
  234. }
  235. var polygonEdge;
  236. for (var j = 0; j < polygonHole.length; j++){
  237. polygonEdge = polygonHole[j];
  238. triangulation.push(
  239. new Triangle([
  240. polygonEdge,
  241. new Edge(polygonEdge.vertex1, nextNode),
  242. new Edge(polygonEdge.vertex2, nextNode)
  243. ])
  244. );
  245. }
  246. }
  247. var i = 0;
  248. while (i < triangulation.length){
  249. testVertices = triangulation[i].vertices;
  250. if (testVertices.includes(sTVertex1) ||
  251. testVertices.includes(sTVertex2) ||
  252. testVertices.includes(sTVertex3)){
  253. triangulation.splice(i, 1);
  254. } else {
  255. i++;
  256. }
  257. }
  258.  
  259. return new Triangle_Mesh(triangulation);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement