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

时间:2018-10-26 21:04:59

标签: c# unity3d linear-algebra

enter image description here

我们正在使用Unity C#。此图像是简化的2D情况,其中我们知道点 p1 p2 的坐标(x,y)。

使用这种美丽我们知道角度Theta

static float CalculateAngle(Vector3 p1, Vector3 p2)
{ return Quaternion.FromToRotation(Vector3.right, p1 - p2).eulerAngles.z; }

// The use of Vector3.right make zero degrees start at 3h00
// The values of z are irrelevant in this post, always zeroed.

现在出现一个新点 p3 ,想象一下屏幕触摸,所以我们知道它的坐标(x,y)。本质上,图像中的所有蓝色,我们都知道它的价值。

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

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

  • p4.y 必须等于与p3.y

  • p4与p1和p2 一致

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

3 个答案:

答案 0 :(得分:3)

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

  1. 按照here计算p1和p2的线性函数。斜率截距形式的方程写为
  

y = mx + b

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

  1. 将P3的y插入表格中。
  2. 解决x。

Unity的C#示例:

Vector3 p1 = new Vector3(1f, 2f);
Vector3 p2 = new Vector3(2f, 3f);
Vector3 p3 = new Vector3(1000f, 5f);
Vector3 p4 = Vector3.zero;

float m = ((p2.y - p1.y) / (p2.x - p1.x));
float b = p1.y - (m * p1.x);

// x = ( y - b ) / m
p4.x = (p3.y - b) / m;
p4.y = p3.y;

print(p4); // (4.0, 5.0, 0.0) as expected

答案 1 :(得分:0)

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

(y - b) / m = x 

这更像是普通的数学问题,而不是单位特定的问题;将来,我建议尝试使用堆栈交换数学站点。

答案 2 :(得分:0)

这将解决您的问题,并且也适用于深度不同的p1p2和/或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不同的法线。