2017-04-20 14 views
3

Pygame에서 화살촉의 시작점과 끝점이있는 화살표 머리의 세 점에 대한 좌표를 어떻게 계산하면됩니다. 선과 같은 방향으로 포인트?PyGame에서 선의 방향을 따르는 화살촉 그리기

def __draw_arrow(self, screen, colour, start, end):  
    start = self.__coordinate_lookup[start] 
    end = self.__coordinate_lookup[end] 
    dX = start[0] - end[0] 
    dY = -(start[1] - end[1]) 
    print m.degrees(m.atan(dX/dY)) + 360 
    pygame.draw.line(screen,colour,start,end,2) 

내가 각도와 라인의 기울기와 장난 시도했습니다, 사실은 Y 좌표가 위쪽으로 증가 아래쪽 대신에 저를 던지고 내가 올바른 방향으로 찔러을 주셔서 감사합니다 정말 것이다.

+0

가능한 중복 (http://stackoverflow.com/questions/31462791/find-coordinates-to-draw-arrow-head-isoscele-triangle-at-the-end-of-a-line) – Spektre

+0

원하는 중복 QA 앱 이것도보기 : [튜브 종료 정상에 따라 실린더에 회전을 적용하십시오] (http://stackoverflow.com/a/39674497/2521214) – Spektre

답변

1

이 작동합니다 : 가난하게 조직 된 코드에 대한

def draw_arrow(screen, colour, start, end): 
    pygame.draw.line(screen,colour,start,end,2) 
    rotation = math.degrees(math.atan2(start[1]-end[1], end[0]-start[0]))+90 
    pygame.draw.polygon(screen, (255, 0, 0), ((end[0]+20*math.sin(math.radians(rotation)), end[1]+20*math.cos(math.radians(rotation))), (end[0]+20*math.sin(math.radians(rotation-120)), end[1]+20*math.cos(math.radians(rotation-120))), (end[0]+20*math.sin(math.radians(rotation+120)), end[1]+20*math.cos(math.radians(rotation+120))))) 

죄송합니다. 그러나 위에서 말했듯이 좌상단에서 시작하는 좌표계는 어떤 수학을 대치해야합니다. 또한 삼각형을 동등한 것으로 바꾸려면 4 호선의 rotation +/- 120 또는 다른 반경의 20*을 변경해야합니다.

희망이 도움이 :)

1

내가 시작 나타내며 끝 좌표 startX, startY, endX, endYenter image description here

dX = endX - startX 
dY = endY - startY 

//vector length 
Len = Sqrt(dX* dX + dY * dY) //use Hypot if available 

//normalized direction vector components 
udX = dX/Len 
udY = dY/Len 

//perpendicular vector 
perpX = -udY 
perpY = udX 

//points forming arrowhead 
//with length L and half-width H 
arrowend = (end) 

leftX = endX - L * udX + H * perpX 
leftY = endY - L * udY + H * perpY 

rightX = endX - L * udX - H * perpX 
rightY = endY - L * udY - H * perpY 
[줄 끝에 화살촉 (isoscele 삼각형)을 그리는 좌표를 찾기]의