三维空间中点到线段的距离及投影点 C#

简单的集大家之长总结了已验证work的方法

 分三种情况

通过计算向量AP在向量AB上的投影判断属于哪种情况

public float DistPointSegment(Vector3 p, Vector3 s1, Vector3 s2, out Vector3 objP)
        {    
            Vector3 ab = s2 - s1;
            Vector3 ap = p - s1;

            float r = Vector3.Dot(ab, ap) / ab.LengthSquared;

            if (r <= 0)
            {
                objP = s1;
                return ap.Length;
            }

            if (r >= 1)
            {
                objP = s2;
                Vector3 bp = s2 - p;
                return bp.Length;
            }

            Vector3 projP = Vector3.Dot(ab, ap) / ab.Length * Vector3.Normalize(ab);
            objP = projP + s1;

            return Vector3.Cross(ab, ap).Length / ab.Length;
        }

参考:

点到线段的距离_keneyr的博客-CSDN博客_点到线段的距离

三维空间内点到直线的距离计算公式_仰望星空_LiDAR的博客-CSDN博客_三维空间点到直线的距离公式

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在C#计算三维空间中点线段垂足坐标的示例代码: ```csharp using System; public class Point { public double X { get; set; } public double Y { get; set; } public double Z { get; set; } } public class LineSegment { public Point A { get; set; } public Point B { get; set; } } public class Program { public static void Main() { // 创建P和线段AB的示例 Point P = new Point { X = 1, Y = 2, Z = 3 }; LineSegment AB = new LineSegment { A = new Point { X = 4, Y = 5, Z = 6 }, B = new Point { X = 7, Y = 8, Z = 9 } }; // 计算线段的垂足坐标 Point H = CalculatePerpendicularFoot(P, AB); Console.WriteLine($"垂足坐标:({H.X}, {H.Y}, {H.Z})"); } public static Point CalculatePerpendicularFoot(Point P, LineSegment AB) { // 计算线段AB的方向向量 double ABx = AB.B.X - AB.A.X; double ABy = AB.B.Y - AB.A.Y; double ABz = AB.B.Z - AB.A.Z; // 计算AP向量 double APx = P.X - AB.A.X; double APy = P.Y - AB.A.Y; double APz = P.Z - AB.A.Z; // 计算AP与AB的积 double dotProduct = APx * ABx + APy * ABy + APz * ABz; // 计算线段AB的长度的平方 double lengthSquared = ABx * ABx + ABy * ABy + ABz * ABz; // 计算垂足到A距离比例t double t = dotProduct / lengthSquared; // 计算垂足坐标H double Hx = AB.A.X + ABx * t; double Hy = AB.A.Y + ABy * t; double Hz = AB.A.Z + ABz * t; return new Point { X = Hx, Y = Hy, Z = Hz }; } } ``` 在这个示例,我们定义了`Point`类来表示三维空间,`LineSegment`类来表示线段。`CalculatePerpendicularFoot`方法用于计算线段的垂足坐标。在`Main`方法,我们创建了P和线段AB的示例,并调用`CalculatePerpendicularFoot`方法来计算垂足坐标H。最后,我们将H的坐标打印输出。 请根据实际需求修改示例线段的坐标,并确保引入必要的命名空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值