2017-01-05 3 views
0

Я пытаюсь установить индикаторы интервалов по кругу, подобно тому, что вы найдете на таймере или часах.Интервальные индикаторы на круговой грани

import pygame 
from pygame.locals import * 
import math 

SCREENWIDTH = 400 
SCREENHEIGHT = 400 
BACKGROUND = (0, 0, 0) 
FPS = 60 
clock = pygame.time.Clock() 
screen = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT)) 

lineStart = (200, 200) 
lineLen = 100 
color = (255, 255, 255) 

pygame.init() 

def drawLines(width, delta, amt): 
    for i in range(amt): 
     deltaAmt = 0 
     deltaRadian = delta*2*math.pi #converts degree amt to radians 

     x = lineStart[0] + math.cos(deltaAmt) * lineLen 
     y = lineStart[1] + math.sin(deltaAmt) * lineLen 
     pygame.draw.line(screen, color, lineStart, (x, y), width) 
     deltaAmt += deltaRadian 


    pygame.display.flip() 

drawLines(4, 0, 80) 
clock.tick(FPS) 

У меня возникла проблема в том, что код, как есть, только рисует одну строку. Мне нужно, чтобы он рисовал несколько строк с разной степенью разницы. Например, мне нужно нарисовать четыре линии на 90 градусов друг от друга или 5 линий на 72 градуса друг от друга. Я думал, что я предусмотрел это, увеличив deltaAmt по текущему значению deltaRadian, но снова посмотрев на код, я не думаю, что это на самом деле это делает.

Кроме того, вы увидите, что для параметра delta я в настоящее время передал 0 в качестве аргумента. В идеале это означало бы, что линия будет нарисована в положении 12 часов, но вместо этого нарисована на 3 часа. Когда я ввожу 90 в качестве аргумента, линия позиционируется в положении «6 часов» или на 180 градусов, когда она должна быть нарисована в положении «3 часа» или «90 градусов».

Любая помощь будет оценена по достоинству.

+0

Нормально, что некоторые системы используют 3 часа как 0 градусов - простое использование 'math.sin (math.radians (angle-90))' – furas

ответ

1

Ваша проблема deltaAmt = 0 внутри for - вы переустановите угол, прежде чем рисовать каждую строку. deltaAmt = 0 должен быть перед for

Если вам нужно 0 градусов в 12 часов, то используйте angle-90 во всех расчетах

radiants = math.radians(angle-90) 

мне пришлось использовать round() для преобразования x,y в целые числа, потому что pygame использует int(), который округляет значения в некотором роде и после 360 градусов линия не точно вертикальная/горизонтальная.

Версия с анимацией - для поворота линий используется start_angle.

import pygame 
import math 

# --- constants --- (UPPER_CASE names) 

SCREEN_WIDTH = 400 
SCREEN_HEIGHT = 400 

BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 

FPS = 60 

# --- functions --- (lower_case names) 

def draw_lines(screen, number, delta_angle, start_angle, width=1): 

    angle = start_angle 

    for i in range(number): 

     radiants = math.radians(angle-90) 

     x = round(line_start[0] + math.cos(radians) * line_len) 
     y = round(line_start[1] + math.sin(radians) * line_len) 

     pygame.draw.line(screen, line_color, line_start, (x, y), width) 

     angle += delta_angle 


# --- main --- (lower_case names) 

# - init - 

pygame.init() 
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) 
screen_rect = screen.get_rect() 

# - objects- 

line_start = screen_rect.center 
line_len = 200 
line_color = WHITE 

start_angle = 0 

# - mainloop - 

clock = pygame.time.Clock() 

running = True 

while running: 

    # - events - 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 

     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       running = False 

    # - updates (without draws) - 

    start_angle += 0.5 

    # - draws (without updates) - 

    screen.fill(BLACK) 

    draw_lines(screen, 4, 90, start_angle) 

    pygame.display.flip() 

    # - constant speed - FPS - 

    clock.tick(FPS) 

# - end - 

pygame.quit() 

КСТАТИ: я изменил имена, потому что: PEP 8 -- Style Guide for Python Code

enter image description here


КСТАТИ: смотри пример с часами Clock in Python

enter image description here

Смежные вопросы