首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算与作为二维线段的倾斜或倾斜墙碰撞后移动球的角度

问计算与作为二维线段的倾斜或倾斜墙碰撞后移动球的角度
EN

Stack Overflow用户
提问于 2010-12-24 08:15:13
回答 2查看 5.5K关注 0票数 1

如果你在一个2D多边形中有一个“球”,比如由4条线段组成的边界墙,那么在与不规则倾斜的墙碰撞后,如何计算球的角度?

我知道如何让球反弹,如果墙是水平的,垂直的,或以45度角。我还设置了我的代码来检测与墙的碰撞。

我读过关于点积和normals的文章,但我想不出如何在Java / Android中实现它们。我完全被难住了,感觉就像我已经在Google中查找了10页深的东西10次。我已经筋疲力尽了,我希望有人能帮上忙。

EN

回答 2

Stack Overflow用户

发布于 2010-12-24 08:47:33

提前道歉:我不知道正确的Android类型。我假设你有一个具有'x‘和'y’属性的向量类型。

如果墙是水平的,并且电流速度是“矢量”,那么它就像这样简单:

代码语言:javascript
复制
vector.y = -vector.y;

你就不会去管x分量了。所以你需要做一些类似的,但更通用的事情。

您可以通过将直线法线(垂直于直线的向量)的概念替换为y轴(垂直于水平方向)的硬编码来实现。

由于法线与直线正交,因此可以通过将直线旋转90度来找到它。在2d中,矢量(a,b)可以通过将其转换为(-b,a)来旋转90度。因此,如果你有一行从(x1,y1)到(x2,y2),那么你可以用:

代码语言:javascript
复制
vectorAlongLine.x = x2 - x1;
vectorAlongLine.y = y2 - y1;

normal.x = -vectorAlongLine.y;
normal.y = vectorAlongLine.x;

您实际上并不关心原始行的长度(当您不想要它的时候,它会影响以后的计算),所以您想让normal的长度为1,而不管它当前的长度。您可以通过将其除以当前长度来实现此目的。因此,例如

代码语言:javascript
复制
lengthOfNormal = Math.sqrt(normal.x*normal.x + normal.y*normal.y);
normal.x /= lengthOfNormal;
normal.y /= lengthOfNormal;

使用毕达哥拉斯定理来得到长度。

对于水平线,在y轴上翻转与(i)计算出矢量沿y轴延伸的范围相同;以及(ii)减去该量两次-一次得到该方向上的速度为0,再次使其成为原始速度的负值。也就是说,它与以下内容相同:

代码语言:javascript
复制
distanceAlongNormal = vector.y;
vector.y -= 2.0 * distanceAlongNormal;

在一般情况下,点积用于计算向量沿法线延伸的距离。因此,它的作用与取vector.y对水平线的作用相同。这就是你可能需要做一点信念飞跃的地方。这是点积的一个性质,你可以通过检查一个直角三角形来说服自己。但是现在,如果你有一条水平线,你会得到法线(0,1)。因为点积应该是:

代码语言:javascript
复制
vector.x * normal.x + vector.y * normal.y

你会计算出:

代码语言:javascript
复制
distanceAlongNormal = vector.x * 0.0 + vector.y * 1.0;

这显然和只取y分量是一样的。

在计算出法线上的距离后,你实际上想要减去这个量乘以法线的2倍。这里唯一的额外步骤是乘以法线,得到要减去的2d数量。这是因为你要按正常的顺序减去。因此,基于前面正常计算的完整代码是:

代码语言:javascript
复制
distanceAlongNormal = vector.x * normal.x + vector.y * normal.y;
vector.x -= 2.0 * distanceAlongNormal * normal.x;
vector.y -= 2.0 * distanceAlongNormal * normal.y;

如果没有将长度设为1,则需要除以此处的长度,因为点积将按该值缩放distanceAlongNormal值。

票数 7
EN

Stack Overflow用户

发布于 2010-12-24 10:48:20

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4523434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档