C# 如何计算水平投影到斜线的点
我们正在使用Unity C。该图像是一个简化的2D场景,其中我们知道点p1和p2的坐标(x,y) 我们知道角度θ,利用这个美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)。本质上,图像中的一切都是蓝色的,我们知道
静态浮点计算角度(向量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#?可能有更简单的解决方案。基本数学解如下所示:
线性函数的形式为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);
}