0
半径Rに沿って点Aから点Bに円弧を描こうとしています。pygame、点Aから半径Bの円弧を描く
Player.__draw_fov()
では、現在どのように弧を描いているのかを見ることができます。しかし、それを描くのは、回転すると弧が90度を超えて乱されます。今度は、fovベクトルの角度をデフォルトベクトル(x、0)にするためにベクトル計算を実行するとき、常に値0 <= angle <= 180
を返します。したがって、これは180度から0度の上で動作します。しかし、底面180〜360度では機能しません。
今、私はプレーヤーの角度を記録するなど、さまざまなことを試みました。 90で始まる(上を向いている)(0は右に向いている)。プレイヤーが0より下か180より上を向いているときは、度をシフトします。しかし、何も動作していないようです。
class Player:
def __init__(self, distance, fov, color, start, pygame, screen):
self.distance = distance
self.fov = fov
self.color = color
self.pygame = pygame
self.screen = screen
self.left = False
self.right = False
self.angularSpeed = 5
self.speed = 5
self.angle = 90
self.origin = start
unit = 1/numpy.linalg.norm(numpy.array([0, -10]))
self.points = numpy.array([
numpy.array([-3, 3]) + start,
numpy.array([3, 3]) + start,
numpy.array([0, -10]) + start,
self.rotate([0, distance*unit*-10], self.fov/2) + start,
self.rotate([0, distance*unit*-10], -self.fov/2) + start
])
def update(self):
if self.left: self._left()
elif self.right: self._right()
self._draw_body()
self._draw_fov()
def _draw_fov(self):
P1 = self.points[3]
P2 = self.points[4]
self.pygame.draw.line(self.screen, self.color, self.origin, P1.tolist())
self.pygame.draw.line(self.screen, self.color, self.origin, P2.tolist())
O = numpy.array([10, 0])
A1 = self.vector_angle(P1-self.origin, O)
A2 = self.vector_angle(P2-self.origin, O)
if self.angle >= 135: A2 = -A2
if self.angle >= 225: A1 = -A1
if self.angle <= 45: A1 = -A1
if self.angle >= 315: A2 = -A2
O_corner = self.origin - numpy.array([self.distance, self.distance])
if (self.angle >= 135 and self.angle < 225) or (self.angle <= 45 and self.angle >= 0) or (self.angle >= 315 and self.angle < 360):
self.pygame.draw.arc(self.screen, self.color, (O_corner, (self.distance*2, self.distance*2)), math.radians(A1), math.radians(A2))
else:
self.pygame.draw.arc(self.screen, self.color, (O_corner, (self.distance*2, self.distance*2)), math.radians(A2-90), math.radians(A1+90))
def vector_angle(self, A, B):
dot = A[0]*B[0] + A[1]*B[1]
norm = numpy.linalg.norm(A) * numpy.linalg.norm(B)
return math.degrees(math.acos(dot/norm))
def _left(self):
self.angle += self.angularSpeed
if self.angle > 360: self.angle = self.angle - 360
for point in range(self.points.shape[0]):
self.points[point] = self.rotate(self.points[point], -self.angularSpeed, self.origin)
self.directionVector = self.rotate(self.directionVector, -self.angularSpeed)
def _right(self):
self.angle -= self.angularSpeed
if self.angle < 0: self.angle = 360 + self.angle
for point in range(self.points.shape[0]):
self.points[point] = self.rotate(self.points[point], self.angularSpeed, self.origin)
self.directionVector = self.rotate(self.directionVector, self.angularSpeed)
私はそれが変わると、より良い弧を描くようにアルゴリズムを改善EDIT
、あなたが回して正しいと思われます。 しかし、時間がたつにつれて、アークはプレーヤーが絶えず回転するにつれて間違って描き始める。これは私が見ることができない累積的な問題のようです。 self.angle、これを維持することにより360 + self.angle
はたぶん、あなたはラジアンを、I/O度試してみてください:次のように任意のFOVを補うために、私はそれらを修正しました –