UNPKG

@xtor/cga.js

Version:

Xtor Compute Geometry Algorithm Libary 计算几何算法库

52 lines (51 loc) 1.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.recognitionPolygonNormal = exports.recognitionCCW = exports.recognitionPlane = void 0; var Line_1 = require("../struct/3d/Line"); var sort_1 = require("./sort"); var Plane_1 = require("../struct/3d/Plane"); /** * 计算共面点集所在的平面 前提是所有的点都在一个平面上 * @param {Array<Vec3>} points */ function recognitionPlane(points) { points.sort(sort_1.vectorCompare); var line = new Line_1.Line(points[0], points.get(-1)); var maxDistance = -Infinity; var ipos = -1; for (var i = 1; i < points.length - 1; i++) { var pt = points[i]; var distance = line.distancePoint(pt).distance; if (distance > maxDistance) { maxDistance = distance; ipos = i; } } var plane = new Plane_1.Plane(); plane.setFromThreePoint(points[0], points.get(-1), points[ipos]); return plane; } exports.recognitionPlane = recognitionPlane; /** * 识别多边形顺逆时针 格林求和 投影到XY平面 * @param points */ function recognitionCCW(points) { var d = 0; for (var i = 0; i < points.length - 1; i++) { var p = points[i]; var p1 = points[i + 1]; d += -0.5 * (p1.y + p.y) * (p1.x + p.x); } return d > 0; } exports.recognitionCCW = recognitionCCW; /** * robust 识别出点集或者多边形的法线 * @param {Polygon|Array<Point|Vector3>} points * @returns {Vector3} 法线 */ function recognitionPolygonNormal(points) { return recognitionPlane(points).normal; } exports.recognitionPolygonNormal = recognitionPolygonNormal;