Advertisement
Guest User

Delaunay.ts

a guest
Jan 5th, 2015
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /// <reference path="defs/easeljs.d.ts" />
  2.  
  3. module djankey {
  4.     export class Delaunay extends createjs.Shape {
  5.         public EPSILON:number = Number.MIN_VALUE;
  6.         public SUPER_TRIANGLE_RADIUS:number = 1000000000;
  7.         private indices:Array<number>;
  8.         private circles:Array<number>;
  9.         private g:createjs.Graphics;
  10.  
  11.         constructor() {
  12.             super();
  13.         }
  14.  
  15.         public compute = (points:Array<createjs.Point>):Array<number> => {
  16.             var nv:number = points.length;
  17.             if (nv < 3) return null;
  18.  
  19.             var d:number = this.SUPER_TRIANGLE_RADIUS;
  20.             points.push(new createjs.Point( 0, -d ), new createjs.Point( d, d ), new createjs.Point( -d, d ));
  21.  
  22.             this.indices = [ points.length-3, points.length-2, points.length-1 ];
  23.             this.circles = [ 0, 0, d ];
  24.  
  25.             var edgeIds:Array<number> = [];
  26.             var i:number, j:number, k:number, id0:number, id1:number, id2:number;
  27.             for ( i = 0; i < nv; i++)
  28.             {
  29.                 for ( j = 0; j < this.indices.length; j+=3 )
  30.                 {
  31.                     if (this.circles[ j + 2 ] > this.EPSILON && this.circleContains(j, points[ i ]))
  32.                     {
  33.                         id0 = this.indices[ j ];
  34.                         id1 = this.indices[ j + 1 ];
  35.                         id2 = this.indices[ j + 2 ];
  36.                         edgeIds.push( id0, id1, id1, id2, id2, id0 );
  37.                         this.indices.splice( j, 3 );
  38.                         this.circles.splice( j, 3 );
  39.                         j -= 3;
  40.                     }
  41.                 }
  42.                 for ( j = 0; j < edgeIds.length; j+=2 )
  43.                 {
  44.                     for ( k = j + 2; k < edgeIds.length; k+=2 )
  45.                     {
  46.                         if( (edgeIds[ j ] == edgeIds[ k ] && edgeIds[ j + 1 ] == edgeIds[ k + 1 ]   )
  47.                             ||  (edgeIds[ j + 1 ] == edgeIds[ k ] && edgeIds[ j ] == edgeIds[ k + 1 ]   )   )
  48.                         {
  49.                             edgeIds.splice( k, 2 );
  50.                             edgeIds.splice( j, 2 );
  51.                             j -= 2;
  52.                             k -= 2;
  53.                             if ( j < 0 ) break;
  54.                             if ( k < 0 ) break;
  55.                         }
  56.                     }
  57.                 }
  58.                 for ( j = 0; j < edgeIds.length; j+=2 )
  59.                 {
  60.                     this.indices.push( edgeIds[ j ], edgeIds[ j + 1 ], i );
  61.                     this.computeCircle( points, edgeIds[ j ], edgeIds[ j + 1 ], i );
  62.                 }
  63.                 edgeIds.length = 0;
  64.  
  65.             }
  66.             id0 = points.length - 3;
  67.             id1 = points.length - 2;
  68.             id2 = points.length - 1;
  69.             for ( i = 0; i < this.indices.length; i+= 3 )
  70.             {
  71.                 if ( this.indices[ i ] == id0 || this.indices[ i ] == id1 || this.indices[ i ] == id2
  72.                     ||   this.indices[ i + 1 ] == id0 || this.indices[ i + 1 ] == id1 || this.indices[ i + 1 ] == id2
  73.                     ||   this.indices[ i + 2 ] == id0 || this.indices[ i + 2 ] == id1 || this.indices[ i + 2 ] == id2 )
  74.                 {
  75.                     this.indices.splice( i, 3 );
  76.                     i-=3;
  77.                     continue;
  78.                 }
  79.             }
  80.             points.pop();
  81.             points.pop();
  82.             points.pop();
  83.             return this.indices;
  84.         }
  85.  
  86.         circleContains = ( circleId:number, p:createjs.Point ):boolean => {
  87.             var dx:number = this.circles[ circleId ] - p.x;
  88.             var dy:number = this.circles[ circleId + 1 ] - p.y;
  89.             return this.circles[ circleId + 2 ] > dx * dx + dy * dy;
  90.         }
  91.  
  92.         computeCircle = ( points:Array<createjs.Point>, id0:number, id1:number, id2:number ):void => {
  93.             var p0:createjs.Point = points[ id0 ];
  94.             var p1:createjs.Point = points[ id1 ];
  95.             var p2:createjs.Point = points[ id2 ];
  96.             var A:number = p1.x - p0.x;
  97.             var B:number = p1.y - p0.y;
  98.             var C:number = p2.x - p0.x;
  99.             var D:number = p2.y - p0.y;
  100.             var E:number = A * (p0.x + p1.x) + B * (p0.y + p1.y);
  101.             var F:number = C * (p0.x + p2.x) + D * (p0.y + p2.y);
  102.             var G:number = 2.0 * (A * (p2.y - p1.y) - B * (p2.x - p1.x));
  103.             var x:number = (D * E - B * F) / G;
  104.             this.circles.push( x );
  105.             var y:number = (A * F - C * E) / G;
  106.             this.circles.push( y );
  107.             x -= p0.x;
  108.             y -= p0.y;
  109.             this.circles.push( x * x + y * y );
  110.         }
  111.  
  112.         public render = ( graphics:createjs.Graphics, points:Array<createjs.Point>, indices:Array<number> = [] ):void => {
  113.             var id0:number, id1:number, id2:number;
  114.             for ( var i:number = 0; i < indices.length; i+=3 )
  115.             {
  116.                 id0 = indices[ i ];
  117.                 id1 = indices[ i + 1 ];
  118.                 id2 = indices[ i + 2 ];
  119.                 graphics.moveTo( points[ id0 ].x, points[ id0 ].y );
  120.                 graphics.lineTo( points[ id1 ].x, points[ id1 ].y );
  121.                 graphics.lineTo( points[ id2 ].x, points[ id2 ].y );
  122.                 graphics.lineTo( points[ id0 ].x, points[ id0 ].y );
  123.             }
  124.         }
  125.     }
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement