C# 如何计算水平投影到斜线的点

C# 如何计算水平投影到斜线的点,c#,unity3d,linear-algebra,C#,Unity3d,Linear Algebra,我们正在使用Unity C。该图像是一个简化的2D场景,其中我们知道点p1和p2的坐标(x,y) 我们知道角度θ,利用这个美 静态浮点计算角度(向量3 p1、向量3 p2) {返回四元数.FromToRotation(Vector3.right,p1-p2).eulerAngles.z;} //使用Vector3.right使零度从3点开始 //z的值在这篇文章中是不相关的,总是归零。 现在出现一个新的点p3,想象一下触摸屏,我们知道它的坐标(x,y)。本质上,图像中的一切都是蓝色的,我们知道

我们正在使用Unity C。该图像是一个简化的2D场景,其中我们知道点p1p2的坐标(x,y)

我们知道角度θ,利用这个美

静态浮点计算角度(向量3 p1、向量3 p2)
{返回四元数.FromToRotation(Vector3.right,p1-p2).eulerAngles.z;}
//使用Vector3.right使零度从3点开始
//z的值在这篇文章中是不相关的,总是归零。
现在出现一个新的点p3,想象一下触摸屏,我们知道它的坐标(x,y)。本质上,图像中的一切都是蓝色的,我们知道它的价值

问题是:如何计算新的p4坐标,其中

  • 我们知道p3(x,y)坐标
  • 我们不知道p4(x,y),除了:

  • p4.y必须等于p3.y

  • p4与p1和p2一致

如何计算未知的p4.x,以获得完整的p4(x,y)坐标,使用Unity C#?

可能有更简单的解决方案。基本数学解如下所示:

  • 如前所述,计算p1和p2的线性函数。斜率截距形式的方程式如下所示:
  • y=mx+b

    其中m是直线的斜率,b是y截距

  • 在表单中插入P3的y
  • 解x
  • 统一的C#示例:


    线性函数的形式为y=mx+b,其中m为斜率,b为垂直位移。如果P3是具有xy值的点,则可以采用坡度、偏移和y并求解x:

    (y - b) / m = x 
    

    这是一个普通的数学问题,而不是一个具体的问题;将来,我建议尝试使用stack exchange数学站点。

    这将解决您的问题,它也适用于不同深度的
    p1
    p2
    和/或
    p3

    Y=p3.Y
    处创建一个平面,然后从p1->p2进行光线投射以找到其相交的位置

    Plane plane = new Plane(Vector3.up, p3);
    float enter;
    Ray ray = new Ray(p1, p2-p1);
    
    bool doesIntersect = plane.Raycast(ray, out enter);
    if (doesIntersect) {
        Vector3 p4 = ray.GetPoint(enter); 
        DoStuff(p4.x); 
    }
    

    如果需要沿非水平方向投影,则需要使用不同于
    Vector3.up
    的法线

    它总是会是一个二维场景&水平投影吗?啊,错过了这个评论,是的二维场景,只使用向量3(x,y,z)浮点值,z是不相关的,实际上在计算前后都被强制为零。投影总是水平的,x轴,从左右两边来。嘿,费边,我澄清了我的帖子,我现在正在测试你的想法,得到一些极端的x值。。。待我得出结论后再答复你。谢谢。如果使用您的示例值,对于简单的45º角,p1(1,2)、p2(2,3)和恶意p3(100,5),则p4应该是(4,5),而不是(6,5),正如您在本场景中所说的那样。用这个值运行代码确实会返回(6,5),但正确的坐标是(4,5)。所有值都被视为浮点数。有点不对劲。我很想看到这样一个性感的数学公式在运行中是的。@Marco António:谢谢你的反馈,我明天会看一看发现了代码中的小故障,现在运行得很好!你写了一行“float n=m*p1.x-p1.y”;但实际上是“float b=p1.y-(m*p1.x);”。我将编辑您的代码,并将其标记为已解决。谢谢费边,干得好,谢谢!抱歉没有更彻底地测试它。:-)
    Plane plane = new Plane(Vector3.up, p3);
    float enter;
    Ray ray = new Ray(p1, p2-p1);
    
    bool doesIntersect = plane.Raycast(ray, out enter);
    if (doesIntersect) {
        Vector3 p4 = ray.GetPoint(enter); 
        DoStuff(p4.x); 
    }