UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

128 lines (122 loc) 3.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Shape = void 0; var _Path = require("./Path.js"); var _MathUtils = require("../../math/MathUtils.js"); /** * Defines an arbitrary 2d shape plane using paths with optional holes. It * can be used with {@link ExtrudeGeometry}, {@link ShapeGeometry}, to get * points, or to get triangulated faces. * * ```js * const heartShape = new THREE.Shape(); * * heartShape.moveTo( 25, 25 ); * heartShape.bezierCurveTo( 25, 25, 20, 0, 0, 0 ); * heartShape.bezierCurveTo( - 30, 0, - 30, 35, - 30, 35 ); * heartShape.bezierCurveTo( - 30, 55, - 10, 77, 25, 95 ); * heartShape.bezierCurveTo( 60, 77, 80, 55, 80, 35 ); * heartShape.bezierCurveTo( 80, 35, 80, 0, 50, 0 ); * heartShape.bezierCurveTo( 35, 0, 25, 25, 25, 25 ); * * const extrudeSettings = { * depth: 8, * bevelEnabled: true, * bevelSegments: 2, * steps: 2, * bevelSize: 1, * bevelThickness: 1 * }; * * const geometry = new THREE.ExtrudeGeometry( heartShape, extrudeSettings ); * const mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial() ); * ``` * * @augments Path */ class Shape extends _Path.Path { /** * Constructs a new shape. * * @param {Array<Vector2>} [points] - An array of 2D points defining the shape. */ constructor(points) { super(points); /** * The UUID of the shape. * * @type {string} * @readonly */ this.uuid = (0, _MathUtils.generateUUID)(); this.type = 'Shape'; /** * Defines the holes in the shape. Hole definitions must use the * opposite winding order (CW/CCW) than the outer shape. * * @type {Array<Path>} * @readonly */ this.holes = []; } /** * Returns an array representing each contour of the holes * as a list of 2D points. * * @param {number} divisions - The fineness of the result. * @return {Array<Array<Vector2>>} The holes as a series of 2D points. */ getPointsHoles(divisions) { const holesPts = []; for (let i = 0, l = this.holes.length; i < l; i++) { holesPts[i] = this.holes[i].getPoints(divisions); } return holesPts; } // get points of shape and holes (keypoints based on segments parameter) /** * Returns an object that holds contour data for the shape and its holes as * arrays of 2D points. * * @param {number} divisions - The fineness of the result. * @return {{shape:Array<Vector2>,holes:Array<Array<Vector2>>}} An object with contour data. */ extractPoints(divisions) { return { shape: this.getPoints(divisions), holes: this.getPointsHoles(divisions) }; } copy(source) { super.copy(source); this.holes = []; for (let i = 0, l = source.holes.length; i < l; i++) { const hole = source.holes[i]; this.holes.push(hole.clone()); } return this; } toJSON() { const data = super.toJSON(); data.uuid = this.uuid; data.holes = []; for (let i = 0, l = this.holes.length; i < l; i++) { const hole = this.holes[i]; data.holes.push(hole.toJSON()); } return data; } fromJSON(json) { super.fromJSON(json); this.uuid = json.uuid; this.holes = []; for (let i = 0, l = json.holes.length; i < l; i++) { const hole = json.holes[i]; this.holes.push(new _Path.Path().fromJSON(hole)); } return this; } } exports.Shape = Shape;