本章介绍 WebCAD 中的几何计算方法,包括距离、角度、交点等常用计算。
import { Point2D, distance } from 'vjcad';
const p1 = new Point2D(0, 0);
const p2 = new Point2D(100, 100);
// 两点间距离
const dist = distance(p1, p2); // ~141.42
function distance(p1: Point2D, p2: Point2D): number {
const dx = p2.x - p1.x;
const dy = p2.y - p1.y;
return Math.sqrt(dx * dx + dy * dy);
}
function pointToLineDistance(
point: Point2D,
lineStart: Point2D,
lineEnd: Point2D
): number {
const A = point.x - lineStart.x;
const B = point.y - lineStart.y;
const C = lineEnd.x - lineStart.x;
const D = lineEnd.y - lineStart.y;
const dot = A * C + B * D;
const lenSq = C * C + D * D;
let param = -1;
if (lenSq !== 0) param = dot / lenSq;
let xx, yy;
if (param < 0) {
xx = lineStart.x;
yy = lineStart.y;
} else if (param > 1) {
xx = lineEnd.x;
yy = lineEnd.y;
} else {
xx = lineStart.x + param * C;
yy = lineStart.y + param * D;
}
const dx = point.x - xx;
const dy = point.y - yy;
return Math.sqrt(dx * dx + dy * dy);
}
import { getAngleBetweenPoints, normalizeAngle } from 'vjcad';
const p1 = new Point2D(0, 0);
const p2 = new Point2D(100, 100);
// 两点角度(返回弧度)
const angle = getAngleBetweenPoints(p1, p2); // ~0.785 (45度)
// 角度标准化到 [0, 2π)
const normalized = normalizeAngle(angle);
// 弧度转角度
const degrees = radians * 180 / Math.PI;
// 角度转弧度
const radians = degrees * Math.PI / 180;
import { getMidPoint } from 'vjcad';
const p1 = new Point2D(0, 0);
const p2 = new Point2D(100, 100);
const mid = getMidPoint(p1, p2); // Point2D(50, 50)
import { polarToCartesian } from 'vjcad';
// 从极坐标创建点
const center = new Point2D(0, 0);
const angle = Math.PI / 4; // 45度
const distance = 100;
const endPoint = polarToCartesian(center, angle, distance);
// endPoint ≈ Point2D(70.71, 70.71)
GeometryCalculator 是一个静态工具类,提供了大量几何计算方法,尤其是交点计算。
使用叉积判断点在直线的哪一侧:
import { GeometryCalculator, Point2D } from 'vjcad';
const lineStart = new Point2D(0, 0);
const lineEnd = new Point2D(100, 0); // 水平线
const testPoint = new Point2D(50, 50);
// 返回值:-1=左侧, 0=线上, 1=右侧
const side = GeometryCalculator.witchSidePointToLine(lineStart, lineEnd, testPoint);
// side = 1(点在直线右侧/上方)
将角度调整到 [0, 2π) 范围内:
const angle1 = GeometryCalculator.adjustAngle(-Math.PI / 2); // 3π/2
const angle2 = GeometryCalculator.adjustAngle(3 * Math.PI); // π
// 判断两个数值在指定容差内是否相等
const isEqual = GeometryCalculator.eq(1.0001, 1.0002, 0.001); // true
// 判断值相对于两个边界的位置
const position = GeometryCalculator.pos(50, 0, 100);
// 返回: "center" | "Left" | "Right" | "EqualLeft" | "EqualRight"
GeometryCalculator 提供了超过 100 个交点计算静态方法,支持各种几何实体组合。
交点计算方法遵循 {实体A}To{实体B} 的命名规则:
| 后缀 | 说明 |
|---|
Line | 线段(有限长度) |
LineExt | 线段延伸(无限延伸) |
Arc | 圆弧(有角度范围) |
ArcExt | 圆弧延伸(完整圆) |
Circle | 圆 |
Ray | 射线(单向无限) |
RayExt | 射线延伸 |
Xline | 构造线(双向无限) |
Pline | 多段线 |
PlineExt | 多段线延伸 |
Hatch | 填充图案 |
import { GeometryCalculator, LineEnt, Point2D } from 'vjcad';
const line1 = new LineEnt(new Point2D(0, 0), new Point2D(100, 100));
const line2 = new LineEnt(new Point2D(0, 100), new Point2D(100, 0));
// 线段与线段
const intersections = GeometryCalculator.LineToLine(line1, line2);
// 返回 Point2D[],这里是 [Point2D(50, 50)]
// 线段延伸与线段
GeometryCalculator.LineExtToLine(line1, line2);
// 两条线段延伸(无限直线)
GeometryCalculator.LineExtToLineExt(line1, line2);
// 线段与线段延伸
GeometryCalculator.LineToLineExt(line1, line2);
import { GeometryCalculator, LineEnt, ArcEnt, Point2D } from 'vjcad';
const line = new LineEnt(new Point2D(0, 50), new Point2D(100, 50));
const arc = new ArcEnt(new Point2D(50, 50), 30, 0, Math.PI);
// 线段与圆弧
const intersections = GeometryCalculator.LineToArc(line, arc);
// 线段延伸与圆弧
GeometryCalculator.LineExtToArc(line, arc);
// 线段与圆弧延伸(完整圆)
GeometryCalculator.LineToArcExt(line, arc);
// 线段延伸与圆弧延伸
GeometryCalculator.LineExtToArcExt(line, arc);
import { GeometryCalculator, LineEnt, CircleEnt, Point2D } from 'vjcad';
const line = new LineEnt(new Point2D(0, 50), new Point2D(100, 50));
const circle = new CircleEnt(new Point2D(50, 50), 30);
// 线段与圆
const intersections = GeometryCalculator.LineToCircle(line, circle);
// 线段延伸与圆
GeometryCalculator.LineExtToCircle(line, circle);
// 圆与线段
GeometryCalculator.CircleToLine(circle, line);
// 圆与线段延伸
GeometryCalculator.CircleToLineExt(circle, line);
import { GeometryCalculator, ArcEnt, CircleEnt, Point2D } from 'vjcad';
const arc1 = new ArcEnt(new Point2D(0, 0), 50, 0, Math.PI / 2);
const arc2 = new ArcEnt(new Point2D(50, 0), 50, Math.PI / 2, Math.PI);
const circle = new CircleEnt(new Point2D(25, 25), 30);
// 圆弧与圆弧
GeometryCalculator.ArcToArc(arc1, arc2);
// 圆弧与圆
GeometryCalculator.ArcToCircle(arc1, circle);
// 圆弧延伸与圆弧
GeometryCalculator.ArcExtToArc(arc1, arc2);
// 圆弧延伸与圆弧延伸(两个完整圆)
GeometryCalculator.ArcExtToArcExt(arc1, arc2);
// 圆弧延伸与圆
GeometryCalculator.ArcExtToCircle(arc1, circle);
import { GeometryCalculator, CircleEnt, Point2D } from 'vjcad';
const circle1 = new CircleEnt(new Point2D(0, 0), 50);
const circle2 = new CircleEnt(new Point2D(60, 0), 50);
// 圆与圆(最多 2 个交点)
const intersections = GeometryCalculator.CircleToCircle(circle1, circle2);
import { GeometryCalculator, RayEnt, LineEnt, ArcEnt, CircleEnt, Point2D } from 'vjcad';
const ray = new RayEnt(new Point2D(0, 0), Math.PI / 4); // 45度射线
const line = new LineEnt(new Point2D(50, 0), new Point2D(50, 100));
// 射线与直线
GeometryCalculator.RayToLine(ray, line);
// 射线与圆
GeometryCalculator.RayToCircle(ray, circle);
// 射线与圆弧
GeometryCalculator.RayToArc(ray, arc);
// 射线与射线
GeometryCalculator.RayToRay(ray1, ray2);
// 射线延伸相关
GeometryCalculator.RayExtToLine(ray, line);
GeometryCalculator.RayExtToCircle(ray, circle);
GeometryCalculator.RayToRayExt(ray1, ray2);
import { GeometryCalculator, XLineEnt, LineEnt, Point2D } from 'vjcad';
const xline = new XLineEnt(new Point2D(0, 50), Math.PI / 4);
const line = new LineEnt(new Point2D(0, 0), new Point2D(100, 100));
// 构造线与直线
GeometryCalculator.XlineToLine(xline, line);
// 构造线与圆
GeometryCalculator.XlineToCircle(xline, circle);
// 构造线与圆弧
GeometryCalculator.XlineToArc(xline, arc);
// 构造线与射线
GeometryCalculator.XlineToRay(xline, ray);
// 构造线与构造线
GeometryCalculator.XlineToXline(xline1, xline2);
import { GeometryCalculator, PolylineEnt, LineEnt, CircleEnt, Point2D } from 'vjcad';
const pline = new PolylineEnt();
// ... 设置多段线顶点
// 直线与多段线
GeometryCalculator.LineToPline(line, pline);
// 直线延伸与多段线
GeometryCalculator.LineExtToPline(line, pline);
// 圆与多段线
GeometryCalculator.CircleToPline(circle, pline);
// 圆弧与多段线
GeometryCalculator.ArcToPline(arc, pline);
// 多段线与多段线
GeometryCalculator.PlineToPline(pline1, pline2);
// 多段线延伸相关
GeometryCalculator.PlineExtToLine(pline, line);
GeometryCalculator.PlineToPlineExt(pline1, pline2);
import { GeometryCalculator, HatchEnt, LineEnt, RayEnt, Point2D } from 'vjcad';
// 直线与填充
GeometryCalculator.LineToHatch(line, hatch);
// 直线延伸与填充
GeometryCalculator.LineExtToHatch(line, hatch);
// 射线与填充
GeometryCalculator.RayToHatch(ray, hatch);
// 填充与直线(参数顺序相反)
GeometryCalculator.HatchToLine(hatch, line);
GeometryCalculator.HatchToRay(hatch, ray);
| 方法 | 说明 |
|---|
LineToLine | 线段与线段 |
LineToLineExt | 线段与线段延伸 |
LineToArc | 线段与圆弧 |
LineToArcExt | 线段与圆弧延伸 |
LineToCircle | 线段与圆 |
LineToRay | 线段与射线 |
LineToRayExt | 线段与射线延伸 |
LineToXline | 线段与构造线 |
LineToPline | 线段与多段线 |
LineToPlineExt | 线段与多段线延伸 |
LineToHatch | 线段与填充 |
| 方法 | 说明 |
|---|
LineExtToLine | 线段延伸与线段 |
LineExtToLineExt | 线段延伸与线段延伸 |
LineExtToArc | 线段延伸与圆弧 |
LineExtToArcExt | 线段延伸与圆弧延伸 |
LineExtToCircle | 线段延伸与圆 |
LineExtToRay | 线段延伸与射线 |
LineExtToRayExt | 线段延伸与射线延伸 |
LineExtToXline | 线段延伸与构造线 |
LineExtToPline | 线段延伸与多段线 |
LineExtToPlineExt | 线段延伸与多段线延伸 |
LineExtToHatch | 线段延伸与填充 |
| 方法 | 说明 |
|---|
ArcToArc | 圆弧与圆弧 |
ArcToArcExt | 圆弧与圆弧延伸 |
ArcToCircle | 圆弧与圆 |
ArcToLine | 圆弧与线段 |
ArcToLineExt | 圆弧与线段延伸 |
ArcToRay | 圆弧与射线 |
ArcToRayExt | 圆弧与射线延伸 |
ArcToXline | 圆弧与构造线 |
ArcToPline | 圆弧与多段线 |
ArcToPlineExt | 圆弧与多段线延伸 |
| 方法 | 说明 |
|---|
ArcExtToArc | 圆弧延伸与圆弧 |
ArcExtToArcExt | 圆弧延伸与圆弧延伸 |
ArcExtToCircle | 圆弧延伸与圆 |
ArcExtToLine | 圆弧延伸与线段 |
ArcExtToLineExt | 圆弧延伸与线段延伸 |
ArcExtToRay | 圆弧延伸与射线 |
ArcExtToRayExt | 圆弧延伸与射线延伸 |
ArcExtToXline | 圆弧延伸与构造线 |
ArcExtToPline | 圆弧延伸与多段线 |
ArcExtToPlineExt | 圆弧延伸与多段线延伸 |
| 方法 | 说明 |
|---|
CircleToCircle | 圆与圆 |
CircleToArc | 圆与圆弧 |
CircleToArcExt | 圆与圆弧延伸 |
CircleToLine | 圆与线段 |
CircleToLineExt | 圆与线段延伸 |
CircleToRay | 圆与射线 |
CircleToRayExt | 圆与射线延伸 |
CircleToXline | 圆与构造线 |
CircleToPline | 圆与多段线 |
CircleToPlineExt | 圆与多段线延伸 |
| 方法 | 说明 |
|---|
RayToRay | 射线与射线 |
RayToRayExt | 射线与射线延伸 |
RayToLine | 射线与线段 |
RayToLineExt | 射线与线段延伸 |
RayToArc | 射线与圆弧 |
RayToArcExt | 射线与圆弧延伸 |
RayToCircle | 射线与圆 |
RayToXline | 射线与构造线 |
RayToPline | 射线与多段线 |
RayToPlineExt | 射线与多段线延伸 |
RayToHatch | 射线与填充 |
| 方法 | 说明 |
|---|
XlineToXline | 构造线与构造线 |
XlineToLine | 构造线与线段 |
XlineToLineExt | 构造线与线段延伸 |
XlineToArc | 构造线与圆弧 |
XlineToArcExt | 构造线与圆弧延伸 |
XlineToCircle | 构造线与圆 |
XlineToRay | 构造线与射线 |
XlineToRayExt | 构造线与射线延伸 |
XlineToPline | 构造线与多段线 |
| 方法 | 说明 |
|---|
PlineToPline | 多段线与多段线 |
PlineToPlineExt | 多段线与多段线延伸 |
PlineToLine | 多段线与线段 |
PlineToLineExt | 多段线与线段延伸 |
PlineToArc | 多段线与圆弧 |
PlineToArcExt | 多段线与圆弧延伸 |
PlineToCircle | 多段线与圆 |
PlineToRay | 多段线与射线 |
PlineToRayExt | 多段线与射线延伸 |
PlineToXline | 多段线与构造线 |
- 交点计算函数 - IntersectionCalculator 详解
- 面积计算 - 多边形面积算法
- 边界检测 - BoundaryDetector 使用