3.1 KiB
3.1 KiB
GeometryHelper 使用指南
文件位置
src/Utils/GeometryHelper.cs
用途
3D 几何计算工具类,提供距离、角度、向量等常用几何计算。禁止自己实现几何计算,必须复用此类。
核心方法
距离计算
// 两点间距离
Point3D a = new Point3D(0, 0, 0);
Point3D b = new Point3D(3, 4, 0);
double distance = GeometryHelper.Distance(a, b); // 5.0
// 2D距离(忽略Z坐标)
double distance2D = GeometryHelper.Distance2D(a, b);
// 距离的平方(性能优化,避免开方)
double distanceSq = GeometryHelper.DistanceSquared(a, b);
向量运算
// 向量减法(b - a)
Vector3D vector = GeometryHelper.Subtract(b, a);
// 向量长度
double length = GeometryHelper.VectorLength(vector);
// 单位向量
Vector3D normalized = GeometryHelper.Normalize(vector);
// 点积
double dot = GeometryHelper.DotProduct(v1, v2);
// 叉积
Vector3D cross = GeometryHelper.CrossProduct(v1, v2);
角度计算
// 向量夹角(弧度)
double angle = GeometryHelper.AngleBetween(v1, v2);
// 向量夹角(角度)
double angleDegrees = GeometryHelper.AngleBetweenDegrees(v1, v2);
// 三点形成的角度(以b为顶点)
double angle = GeometryHelper.AngleAtVertex(a, b, c);
点与线的关系
// 点到线段的最近点
Point3D closestPoint = GeometryHelper.ProjectPointOnLineSegment(
point, lineStart, lineEnd);
// 点到线段的距离
double distance = GeometryHelper.DistancePointToLineSegment(
point, lineStart, lineEnd);
// 点是否在线段上(含容差)
bool isOnLine = GeometryHelper.IsPointOnLineSegment(
point, lineStart, lineEnd, tolerance: 0.001);
使用示例
示例1:计算路径总长度
// ❌ 错误:自己实现距离计算
double dx = p2.X - p1.X;
double dy = p2.Y - p1.Y;
double dz = p2.Z - p1.Z;
double distance = Math.Sqrt(dx*dx + dy*dy + dz*dz);
// ✅ 正确:使用 GeometryHelper
double distance = GeometryHelper.Distance(p1, p2);
示例2:检查三点是否共线
public bool AreCollinear(Point3D a, Point3D b, Point3D c, double tolerance = 0.001)
{
// 计算叉积,如果为0则共线
Vector3D ab = GeometryHelper.Subtract(b, a);
Vector3D ac = GeometryHelper.Subtract(c, a);
Vector3D cross = GeometryHelper.CrossProduct(ab, ac);
return GeometryHelper.VectorLength(cross) < tolerance;
}
示例3:计算转弯角度
public double CalculateTurnAngle(Point3D prev, Point3D current, Point3D next)
{
// 入向量(从prev到current)
Vector3D v1 = GeometryHelper.Subtract(current, prev);
// 出向量(从current到next)
Vector3D v2 = GeometryHelper.Subtract(next, current);
// 计算夹角
double angle = GeometryHelper.AngleBetweenDegrees(v1, v2);
return angle; // 0-180度
}
性能提示
// 大量距离比较时,使用距离的平方避免开方
// ✅ 更快
double distSq = GeometryHelper.DistanceSquared(a, b);
if (distSq < threshold * threshold)
// ❌ 更慢(需要开方)
double dist = GeometryHelper.Distance(a, b);
if (dist < threshold)