индексы вершин box2d b2PolygonShape меняются случайным образом - PullRequest
0 голосов
/ 09 июля 2019

При создании b2PolygonShape в Python я понял, что ошибка в моем коде, по-видимому, связана с тем, как меняются вершины.

Допустим, вы хотите создать простой треугольник с вершинами в [(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 градусов в зависимости от начала координат (0, 0).

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'
...