ShapeUtils.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /**
  2. * @author zz85 / http://www.lab4games.net/zz85/blog
  3. */
  4. import { Earcut } from './Earcut.js';
  5. var ShapeUtils = {
  6. // calculate area of the contour polygon
  7. area: function ( contour ) {
  8. var n = contour.length;
  9. var a = 0.0;
  10. for ( var p = n - 1, q = 0; q < n; p = q ++ ) {
  11. a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;
  12. }
  13. return a * 0.5;
  14. },
  15. isClockWise: function ( pts ) {
  16. return ShapeUtils.area( pts ) < 0;
  17. },
  18. triangulateShape: function ( contour, holes ) {
  19. var vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]
  20. var holeIndices = []; // array of hole indices
  21. var faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]
  22. removeDupEndPts( contour );
  23. addContour( vertices, contour );
  24. //
  25. var holeIndex = contour.length;
  26. holes.forEach( removeDupEndPts );
  27. for ( var i = 0; i < holes.length; i ++ ) {
  28. holeIndices.push( holeIndex );
  29. holeIndex += holes[ i ].length;
  30. addContour( vertices, holes[ i ] );
  31. }
  32. //
  33. var triangles = Earcut.triangulate( vertices, holeIndices );
  34. //
  35. for ( var i = 0; i < triangles.length; i += 3 ) {
  36. faces.push( triangles.slice( i, i + 3 ) );
  37. }
  38. return faces;
  39. }
  40. };
  41. function removeDupEndPts( points ) {
  42. var l = points.length;
  43. if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {
  44. points.pop();
  45. }
  46. }
  47. function addContour( vertices, contour ) {
  48. for ( var i = 0; i < contour.length; i ++ ) {
  49. vertices.push( contour[ i ].x );
  50. vertices.push( contour[ i ].y );
  51. }
  52. }
  53. export { ShapeUtils };