UNPKG

1.58 kBJavaScriptView Raw
1/**
2 * @author zz85 / http://www.lab4games.net/zz85/blog
3 */
4
5import { Earcut } from './Earcut.js';
6
7var ShapeUtils = {
8
9 // calculate area of the contour polygon
10
11 area: function ( contour ) {
12
13 var n = contour.length;
14 var a = 0.0;
15
16 for ( var p = n - 1, q = 0; q < n; p = q ++ ) {
17
18 a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;
19
20 }
21
22 return a * 0.5;
23
24 },
25
26 isClockWise: function ( pts ) {
27
28 return ShapeUtils.area( pts ) < 0;
29
30 },
31
32 triangulateShape: function ( contour, holes ) {
33
34 var vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]
35 var holeIndices = []; // array of hole indices
36 var faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]
37
38 removeDupEndPts( contour );
39 addContour( vertices, contour );
40
41 //
42
43 var holeIndex = contour.length;
44
45 holes.forEach( removeDupEndPts );
46
47 for ( var i = 0; i < holes.length; i ++ ) {
48
49 holeIndices.push( holeIndex );
50 holeIndex += holes[ i ].length;
51 addContour( vertices, holes[ i ] );
52
53 }
54
55 //
56
57 var triangles = Earcut.triangulate( vertices, holeIndices );
58
59 //
60
61 for ( var i = 0; i < triangles.length; i += 3 ) {
62
63 faces.push( triangles.slice( i, i + 3 ) );
64
65 }
66
67 return faces;
68
69 }
70
71};
72
73function removeDupEndPts( points ) {
74
75 var l = points.length;
76
77 if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {
78
79 points.pop();
80
81 }
82
83}
84
85function addContour( vertices, contour ) {
86
87 for ( var i = 0; i < contour.length; i ++ ) {
88
89 vertices.push( contour[ i ].x );
90 vertices.push( contour[ i ].y );
91
92 }
93
94}
95
96export { ShapeUtils };