我们正在使用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 坐标,其中
我们不知道 p4(x,y),除了:
p4.y 必须等于与p3.y
如何使用Unity C#计算未知的p4.x,以具有完整的p4(x,y)坐标?
答案 0 :(得分:3)
可能有更简单的解决方案。基本的数学解决方案如下:
y = mx + b
其中m是直线的斜率,b是y轴截距。
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)
这将解决您的问题,并且也适用于深度不同的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
不同的法线。