سؤال

أنا أستخدم Pygame لرسم خط بين نقطتين تعسفيين. أريد أيضًا إلحاق الأسهم في نهاية السطور التي تواجه الخارج في الاتجاهات التي يسافر فيها الخط.

الأمر بسيط بما يكفي لالتصاق صورة سهم في النهاية ، لكن ليس لدي أدنى فكرة عن كيفية حساب درجات الدوران للحفاظ على السهام تشير إلى الاتجاه الصحيح.

هل كانت مفيدة؟

المحلول

هنا هو الرمز الكامل للقيام بذلك. لاحظ أنه عند استخدام Pygame ، يتم قياس التنسيق Y من الأعلى ، وبالتالي نأخذ السلبية عند استخدام وظائف الرياضيات.

import pygame
import math
import random
pygame.init()

screen=pygame.display.set_mode((300,300))
screen.fill((255,255,255))

pos1=random.randrange(300), random.randrange(300)
pos2=random.randrange(300), random.randrange(300)

pygame.draw.line(screen, (0,0,0), pos1, pos2)

arrow=pygame.Surface((50,50))
arrow.fill((255,255,255))
pygame.draw.line(arrow, (0,0,0), (0,0), (25,25))
pygame.draw.line(arrow, (0,0,0), (0,50), (25,25))
arrow.set_colorkey((255,255,255))

angle=math.atan2(-(pos1[1]-pos2[1]), pos1[0]-pos2[0])
##Note that in pygame y=0 represents the top of the screen
##So it is necessary to invert the y coordinate when using math
angle=math.degrees(angle)

def drawAng(angle, pos):
    nar=pygame.transform.rotate(arrow,angle)
    nrect=nar.get_rect(center=pos)
    screen.blit(nar, nrect)

drawAng(angle, pos1)
angle+=180
drawAng(angle, pos2)
pygame.display.flip()

نصائح أخرى

نحن نفترض أن 0 درجة يعني أن السهم يشير إلى اليمين ، 90 درجة يعني الإشارة بشكل مستقيم و 180 درجة يعني الإشارة إلى اليسار.

هناك عدة طرق للقيام بذلك ، وأبسط هو على الأرجح استخدام وظيفة ATAN2. إذا كانت نقطة البداية هي (x1 ، y1) ونقطة النهاية الخاصة بك هي (x2 ، y2) ، فإن الزاوية بدرجات الخط بين الاثنين هي:

import math
deg=math.degrees(math.atan2(y2-y1,x2-x1))

سوف تكون هذه زاوية في النطاق -180 إلى 180 ، لذا فأنت بحاجة إليها من 0 إلى 360 ، عليك أن تعتني بنفسك.

سأضطر إلى البحث عن الوظائف الدقيقة التي يجب استخدامها ، ولكن ماذا عن صنع مثلث مناسب حيث يكون hypotenuse هو الخط المعني والساقين محاذاة المحور ، واستخدام بعض علم المثلثات الأساسي لحساب زاوية الخط استنادًا إلى أطوال جانبي المثلث؟ بالطبع ، سيتعين عليك أن تكون خطوطًا خاصة محاذاة محاذاة بالفعل ، ولكن يجب أن يكون ذلك تافهة.

ايضا، مقال ويكيبيديا عن المنحدر قد يعطيك بعض الأفكار.

فقط لإلحاق الكود أعلاه ، ربما تريد حلقة حدث حتى لا تترك على الفور:

...
clock = pygame.time.Clock()
running = True

while (running):
    clock.tick()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top