UNPKG

@xtor/cga.js

Version:

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

62 lines (57 loc) 1.81 kB
import { Vector3 } from "../../math/Vector3"; import { Line } from "./Line"; import { pointsCollinear } from "../../alg/collinear"; import { Point } from "./Point"; export class Circle { /** * 圆圈 * @param {Vector3} center 中心点 * @param {Vector3} normal 法线 * @param {Number} radius 半径 */ constructor(center, normal, radius) { this.center = center || new Vector3(); this.normal = normal.normalize(); this.radius = radius || 0; } area() { return Math.PI * this.radius * this.radius; } } /** * 圆圈生成方法 * @param {Vector3} center 中心点 * @param {Vector3} normal 法线 * @param {Number} radius 半径 * @returns {Circle} circle 返回一个圆 */ export function circle(center, normal, radius) { return new Circle(center, normal, radius); } /** * 三点计算圆 --low --debugging * @param {Point} p0 点1 * @param {Point} p1 点2 * @param {Point} p2 点3 * @returns {Circle} circle 返回一个圆 */ export function calcCircleFromThreePoint(p0, p1, p2) { if (pointsCollinear(p1, p2, p3)) { alert("calcCircleFromThreePoint:三点共线或者距离太近") } var d1 = p1.clone().sub(p0) var d2 = p2.clone().sub(p0) var d1center = p1.clone().add(p0).multiplyScalar(0.5) var d2center = p2.clone().add(p0).multiplyScalar(0.5) var normal = d1.clone().cross(d2).normalize(); d1.applyAxisAngle(normal, Math.PI / 2); d2.applyAxisAngle(normal, Math.PI / 2); var line1 = new Line(d1center, d1center.clone().add(d1)); var line2 = new Line(d2center, d2center.clone().add(d2)); var center = line1.distanceLine(line2).closestPoint[0]; var radius = d1.distanceTo(center) return circle(center, radius); } // vertical // horizontal