• 计算点在线上的投影坐标


    如题

    计算点到线上的垂点,首先明确:
    该线段必须给出确切的起始点和终点, 而不是一个向量,因为一个向量并不能代表一个线段。
    所以参数列表如下:

    Vector3 VerticalPoint(Vector3 point, Vector3 lStart, Vector3 lEnd);
    
    • 1

    下图中蓝色标记的是未知量,黑色为已知量
    求点target的位置

    数学方法求解:

    求解过程

    • 因为pointLStartLEnd都已知,
      所以向量vector = LEnd- LStartguideLine = point - LStart 都已知
      首先由向量的点积公式可知
      v e c t o r ⋅ g u i d e L i n e = ∣ v e c t o r ∣ ∣ g u i d e L i n e ∣ c o s θ vector ·guideLine = |vector||guideLine|cosθ vectorguideLine=vector∣∣guideLinecosθ
    • 又因为需要的是点到线段上的垂点
      且由直角三角形的定义可知
      我们可以求得|target - LStart|长度,
      |guideLine| * cosθ
      由此即可得到目标点相对LStart的偏移量
    • 由向量性质可知
      向量归一化后其长度为一,所以我们可以将vector向量转化为单位向量
      因为|vector.normalize| == 1,所以当vector = vector.normalize ,则|vector| == 1
      此时我们的公式就化为了:
      v e c t o r . n o r m a l i z e ⋅ g u i d e L i n e = ∣ g u i d e L i n e ∣ c o s θ vector.normalize ·guideLine = |guideLine|cosθ vector.normalizeguideLine=guideLinecosθ
      接着:
      ∣ t a r g e t − L S t a r t ∣ = ∣ g u i d e L i n e ∣ c o s θ = v e c t o r . n o r m a l i z e ⋅ g u i d e L i n e = 偏移量 |target - LStart| = |guideLine|cosθ = vector.normalize · guideLine = 偏移量 targetLStart=guideLinecosθ=vector.normalizeguideLine=偏移量
      此时vector.normalizeguideLine 均可知
      所以 target = LStart + vector * 偏移量

    C#代码

    public static Vector3 VerticalPoint(Vector3 point, Vector3 lStart, Vector3 lEnd)
    {
        Vector3 guideLine = point - lStart;
        Vector3 vector = lEnd - lStart;
        //float magnitude = vector.magnitude;	
    	vector = vector.normalized;
    	float num2 = Vector3.Dot(vector, guideLine);
    	//有需要的话可以将值限制在范围之间,比如这里限制在 线段内部
        //float num2 = Mathf.Clamp(Vector3.Dot(vector, guideLine), 0f, magnitude);	
        return lStart + (vector * num2);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    《程序员职场工具库》如何优化你的工作 —— PDCA 循环
    延时盲注(CVE-2022-0948)
    ArcGIS Map Sdk for unity使用
    uniapp解决h5跨域问题
    文艺复兴科技
    基于多目标两阶段随机规划方法的电热联合系统调度
    【Linux】—— 在Linux上进行读写文件操作
    java计算机毕业设计河东街摊位管理系统MyBatis+系统+LW文档+源码+调试部署
    kibana监控
    js之原型链
  • 原文地址:https://blog.csdn.net/KamikazePilot/article/details/128068077