2017-10-27 35 views
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

enter image description here

enter image description here

enter image description here

+0

はたぶん、あなたはラジアンを、I/O度試してみてください:次のように任意のFOVを補うために、私はそれらを修正しました –

答えて