cgas
Version:
Xtor Compute Geometry Algorithm Libary 计算几何算法库
44 lines (41 loc) • 1.34 kB
text/typescript
import { Vec3 } from '../math/Vec3';
import { Point } from '../struct/3d/Point';
import { Line } from '../struct/3d/Line';
import { vectorCompare } from './sort';
import { Plane } from '../struct/3d/Plane';
import { clone } from '../utils/array';
import { Vec2 } from '../math/Vec2';
/**
* 识别平面
* @param points 点集
*/
export function recognitionPlane(points: Vec3[] | Point[] | any) {
points.sort(vectorCompare);
var line = new Line(points[0].clone(), points[Math.floor(points.length / 2 + 0.5)].clone());
var maxDistance = -Infinity;
var ipos = -1;
for (let i = 1; i < points.length - 1; i++) {
const pt: Vec3 | Point = points[i];
var distance: number = pt.distanceLine(line).distance!;
if (distance > maxDistance) {
maxDistance = distance;
ipos = i;
}
}
var plane = new Plane();
plane.setFromThreePoint(points[0], points.get(-1), points[ipos]);
return plane;
}
/**
* 识别多边形顺逆时针 格林求和
* @param points
*/
export function recognitionCCW(points: Vec2[] | Vec3[]) {
let 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;
}