如何计算水平投影到斜线的点
How to calculate a point horizontaly projected to an angled line
我们正在使用 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)。本质上,图像中的所有 blue,我们都知道它的值。
问题是这样的:如何计算一个新的p4坐标,其中
- 我们知道 p3(x,y) 坐标
我们不知道 p4(x,y),除了:
p4.y 必须等于到p3.y
- p4 与 p1 和 p2
一致
如何使用 Unity C# 计算未知数 p4.x,以获得完整的 p4(x,y) 坐标?
可能有更简单的解决方案。基本数学解法如下:
- 如前所述计算 p1 和 p2 的线性函数 here。斜截式方程写为
y = mx + b
其中 m 是直线的斜率,b 是 y 截距。
- 将 P3 的 y 插入表格。
- 解决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
线性函数的形式为 y = mx + b,其中 m 是斜率,b 是垂直位移。如果 P3 是一个具有 xy 值的点,那么您可以采用斜率、偏移量和 y 并求解 x:
(y - b) / m = x
这更像是一个一般的数学问题,而不是一个特定于单位的问题;以后,我建议尝试堆栈交换数学网站。
这将解决您的问题,它也适用于 p1
、p2
、and/or 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
不同的法线。
我们正在使用 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)。本质上,图像中的所有 blue,我们都知道它的值。
问题是这样的:如何计算一个新的p4坐标,其中
- 我们知道 p3(x,y) 坐标
我们不知道 p4(x,y),除了:
p4.y 必须等于到p3.y
- p4 与 p1 和 p2 一致
如何使用 Unity C# 计算未知数 p4.x,以获得完整的 p4(x,y) 坐标?
可能有更简单的解决方案。基本数学解法如下:
- 如前所述计算 p1 和 p2 的线性函数 here。斜截式方程写为
y = mx + b
其中 m 是直线的斜率,b 是 y 截距。
- 将 P3 的 y 插入表格。
- 解决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
线性函数的形式为 y = mx + b,其中 m 是斜率,b 是垂直位移。如果 P3 是一个具有 xy 值的点,那么您可以采用斜率、偏移量和 y 并求解 x:
(y - b) / m = x
这更像是一个一般的数学问题,而不是一个特定于单位的问题;以后,我建议尝试堆栈交换数学网站。
这将解决您的问题,它也适用于 p1
、p2
、and/or 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
不同的法线。