所以你说你有point1 和point2,两者之间的距离为10f,其中point2 将围绕point1 旋转,并且你想知道在这种分离之间是否存在某个对象点与它们相交,如下图所示:
有一些教程可以在互联网上获得围绕另一个点旋转的数学知识,例如 this one,并且由于您无法指定 Vector2 的原点,因此预览中建议的代码的翻译版本指向 java 的链接应该类似于:
public Vector2 rotatePoint(Vector2 center, Vector2 point, float angle) {
angle = angle * MathUtils.degreesToRadians; // Convert to radians
float rotatedX = MathUtils.cos(angle) * (point.x - center.x)
- MathUtils.sin(angle) * (point.y - center.y) + center.x;
float rotatedY = MathUtils.sin(angle) * (point.x - center.x)
+ MathUtils.cos(angle) * (point.y - center.y) + center.y;
// rotated new position:
return new Vector2(rotatedX, rotatedY);
}
至于剩下的代码(对象之间的交集),我猜你在找RayCastCallback接口:
// initial position
Vector2 point1 = new Vector(0, 0);
// Max lenght of view
Vector2 point2 = new Vector(0, 10);
// Position of collision if occur
final Vector2 collisionPoint = new Vector();
@Override
public void render(float delta) {
//...
point2 = rotatePoint(point1, point2, 10); // rotate 10º
// to detect if object at position point1 is seeing something
world.rayCast(new RayCastCallback(){
@Override
public float reportRayFixture(Fixture fixture, Vector2 point,
Vector2 normal, float fraction) {
// what do the object saw? -> fixture
// where do the object saw it? -> point
collisionPoint.set(point);
return 0; // <- return 0 to stop raycasting
}
}, point1, point2);
//... rotation and other stuffs...
}
reportRayFixture的返回参数有这个文档:
为查询中找到的每个夹具调用。您可以通过返回一个浮点数来控制光线投射的进行方式: return -1:忽略此夹具并继续 return 0:终止光线投射 return fraction:将光线剪辑到这一点 return 1:不要剪辑射线并继续。传递给回调的 Vector2 实例将被重用于未来的调用,因此请复制它们!
** 已添加重点。
基本上它说你可以一个一个地检查所有的交叉点,但是如果你只关心第一个,立即返回 0。当您想知道一个对象是否被另一个对象阻挡时,这很有用。在这种情况下,我返回 0 并将 point 的值复制到 collisionPoint 以让您对这个值做任何您想做的事情。
一个很好的例子可以在this video找到。
希望你觉得这很有用。