在Python中创建b2PolygonShape时,我意识到代码中的一个bug似乎是由于顶点如何变化造成的
假设您想要创建一个顶点位于[(0, 0), (1, 0), (0, 1)]
的简单三角形。根据文档,您需要以CCW方式定义顶点,我从(0, 0)
开始就这样做了
In [57]: triangle = b2PolygonShape(vertices=[(0,0), (1,0), (0,1)])
In [58]: triangle
Out[58]: b2PolygonShape(vertices: [(1.0, 0.0), (0.0, 1.0), (0.0, 0.0)])
那么,当我设置顶点时,为什么顶点会发生变化呢
另一个例子:
In [62]: verts = [(0, 0), (1, 0), (1, -1), (0, -1)]
In [63]: square = b2PolygonShape(vertices=verts)
In [64]: square
Out[64]: b2PolygonShape(vertices: [(1.0, -1.0), (1.0, 0.0), (0.0, 0.0), (0.0, -1.0)])
这对我来说是个问题的原因:假设我们有一个正方形,我们想把它从原点旋转10度
In [70]: import math
In [71]: def deg2rad(degree):
...: return degree * math.pi / 180.
...:
In [74]: def rotate_poly(coords, center, angle):
...: rads = deg2rad(angle)
...: new_coords = []
...: for coord in coords:
...: new_coord = b2Vec2()
...: new_coord.x = math.cos(rads)*(coord.x - center.x) - math.sin(rads)*(coord.y - center.y) + center.x
...: new_coord.y = math.sin(rads)*(coord.x - center.x) + math.cos(rads)*(coord.y - center.y) + center.y
...: new_coords.append(new_coord)
...:
...: return new_coords
...:
In [81]: verts = [b2Vec2(coord[0], coord[1]) for coord in verts]
In [82]: verts
Out[82]: [b2Vec2(0,0), b2Vec2(1,0), b2Vec2(1,-1), b2Vec2(0,-1)]
现在查看旋转顶点时发生的情况:
In [83]: rotate_poly(verts, b2Vec2(0,0), 10)
Out[83]:
[b2Vec2(0,0),
b2Vec2(0.984808,0.173648),
b2Vec2(1.15846,-0.81116),
b2Vec2(0.173648,-0.984808)]
注意我的原点(0, 0)
如何保持在同一位置
现在看看当我将square
旋转10时会发生什么:
In [85]: square = b2PolygonShape(vertices=rotate_poly(verts, b2Vec2(0, 0), 10))
In [86]: square
Out[86]: b2PolygonShape(vertices: [(1.1584559679031372, -0.8111595511436462), (0.9848077297210693, 0.1736481785774231), (0.0, 0.0), (0.1736481785774231, -0.9848077297210693)])
注意我的原点(0, 0)
现在位于顶点列表的索引2处
现在看看当我将square
旋转-10时会发生什么:
In [87]: square = b2PolygonShape(vertices=rotate_poly(verts, b2Vec2(0, 0), -10))
In [88]: square
Out[88]: b2PolygonShape(vertices: [(0.9848077297210693, -0.1736481785774231), (0.0, 0.0), (-0.1736481785774231, -0.9848077297210693), (0.8111595511436462, -1.1584559679031372)])
注意我的原点(0, 0)
现在是如何位于索引1的
这似乎没有理由。我希望我添加顶点的顺序是它们保持的顺序。当我试图抓住我的原点时,这就成了问题,因为我必须在索引列表中搜索它。有什么理由会发生这种情况吗?关于顶点是如何设置的,有什么我不明白的吗
In [99]: Box2D.__version__
Out[99]: '2.3.2'
目前没有回答
相关问题 更多 >
编程相关推荐