2016-12-07 9 views
-2

В настоящее время я завершаю задание колледжа. Мы использовали первый модуль John Zelle graphics.py для первого семестра.Нужна помощь в реорганизации этой функции

Задача состояла в том, чтобы построить два разных шаблона, а затем выложить их в определенном дизайне, автоматически настраивая в зависимости от того, было ли окно 500 x 500, 700 x 700 or 900 x 900 пикселей.

Я выполнил задачу, однако одна большая часть моего кода очень неэффективна и длинна, поэтому это не идеально.

Ниже приведен код, который долго и неэффективно:

def DrawPattern(width,size,win,colour): 

    if size == 5: 
     for x in range(0,width,100): 
      drawCircleExpanse(win,x,400,colour) 
     for j in range(100,400,100): 
      drawCircleExpanse(win,j,300,colour) 
     drawCircleExpanse(win,200,200,colour) 
     for j in range(100,400,100): 
      drawCircleExpanse(win,j,100,colour) 
     for x in range(0,width,100): 
      drawCircleExpanse(win,x,0,colour) 
    if size == 7: 
     for x in range(0,width,100): 
      drawCircleExpanse(win,x,width-100,colour) 
     for j in range(100,width-100,100): 
      drawCircleExpanse(win,j,width-200,colour) 
     for i in range(200,width-200,100): 
      drawCircleExpanse(win,i,width-300,colour)   
     drawCircleExpanse(win,300,300,colour) 
     for j in range(100,width-100,100): 
      drawCircleExpanse(win,j,100,colour) 
     for x in range(0,width,100): 
      drawCircleExpanse(win,x,0,colour) 
     for i in range(200,width-200,100): 
      drawCircleExpanse(win,i,width-500,colour) 
    if size == 9: 
     for x in range(0,width,100): 
      drawCircleExpanse(win,x,width-100,colour) 
     for j in range(100,width-100,100): 
      drawCircleExpanse(win,j,width-200,colour) 
     for i in range(200,width-200,100): 
      drawCircleExpanse(win,i,width-300,colour) 
     for y in range(300,width-300,100): 
      drawCircleExpanse(win,y,width-400,colour) 
     drawCircleExpanse(win,400,400,colour) 
     for j in range(100,width-100,100): 
      drawCircleExpanse(win,j,100,colour) 
     for x in range(0,width,100): 
      drawCircleExpanse(win,x,0,colour) 
     for i in range(200,width-200,100): 
      drawCircleExpanse(win,i,width-700,colour) 
     for y in range(300,width-300,100): 
      drawCircleExpanse(win,y,width-600,colour) 

Переменная size принимает ввод пользователя; например 5, 7 or 9. Это означает либо 500 x 500, 700 x 700 or 900 x 900. Аналогично colour, который просто изменит цвет на один из вариантов пользователя.

Этот код, будет производить следующий шаблон, с размером 5 который переводит к 500 x 500:

Pattern

drawCircleExpanse функции, которая строит сам шаблон, содержит следующий код:

def drawCircleExpanse(win,x,y,colour): 
    rad = 50 
    for c in range(10): 
     circle = Circle(Point(50+x,(50+(c * 10)/2)+y), rad) 
     circle.setOutline(colour) 
     circle.draw(win) 
     rad -= 5 

Я был бы очень благодарен, если бы кто-то мог помочь в сокращении моего массивного блока кода.

+3

Я не уверен, что этот тип вопроса на тему здесь. Я никогда не спрашивал об этом SE раньше, но, возможно, codereview SE - лучшее место, чтобы задать этот вопрос? Я бы дважды проверял правила по темам там до публикации, но похоже, что это может быть лучше. – Lexi

ответ

1

Я согласен, что это, вероятно, лучше подходит для Просмотра Кода, но есть две мыслей, которые могут помочь вам:

  • Для каждого значения size, количество строк (для петель) до и после центра -элемент drawCircleExpanse - floor(size/2). Поскольку вы можете вычислить количество строк, вы можете использовать другой цикл, в котором петли строк вложены. Использование вложенных циклов до и после центрального элемента draw... вызов означает, что вы можете полностью избавиться от своих заявлений if.
  • Чтобы сделать код более удобным для чтения, я бы фактически переместил коэффициент 100 в drawCircleExpanse, так что координаты drawCircleExpanse находятся на воображаемой сетке, а не на пикселях экрана. Локализация преобразования «сетка в пиксель» также дает вам больше возможностей для изменения этого преобразования позже, если вам нужно.
0

Почему вы не делаете компьютер с математикой для вас? Для size == 5, это первый проход в рефакторинга:

x_list = range(0, 500, 100) + \ 
     range(100, 400, 100) + \ 
     [200] + \ 
     range(100, 400, 100) + \ 
     range(0, 500, 100) 

y_list = [400] * 5 + \ 
     [300] * 3 + \ 
     [200] + \ 
     [100] * 3 + \ 
     [0] * 5 

def drawCircleExpanse(win, x, y, colour): 
    print "%3d, %3d" % (x, y) 

win = None 
colour = None 
for x, y in zip(x_list, y_list): 
    drawCircleExpanse(win, x, y, colour) 

Выход

0, 400 
100, 400 
200, 400 
300, 400 
400, 400 
100, 300 
200, 300 
300, 300 
200, 200 
100, 100 
200, 100 
300, 100 
    0, 0 
100, 0 
200, 0 
300, 0 
400, 0 

Вы должны быть в состоянии далее реорганизовать это с помощью size для создания x_list и y_list.

0

Я был бы очень благодарен, если бы кто-нибудь мог помочь в сокращении моего массивного блока кода.

Является ли это достаточно коротким:

from graphics import * 

RADIUS = 50 
NUMBER_CIRCLES = 10 
DECREMENT = RADIUS // NUMBER_CIRCLES 

def drawCircleExpanse(win, x, y, colour): 
    for radius in range(RADIUS, 0, -DECREMENT): 
     circle = Circle(Point(RADIUS + x, (2 * RADIUS - radius) + y), radius) 
     circle.setOutline(colour) 
     circle.draw(win) 

def DrawPattern(width, size, win, colour): 
    for y in range(size, 0, -2): # 5 3 1 
     for x in range(width // 2 - y * RADIUS, width // 2 + y * RADIUS, RADIUS * 2): 
      drawCircleExpanse(win, x, width // 2 - y * RADIUS, colour) 
      if y > 1: 
       drawCircleExpanse(win, x, width // 2 + (y - 2) * RADIUS, colour) 

win = GraphWin("Optimize Drawing", 700, 700) 

DrawPattern(700, 7, win, "red") 

win.getMouse() 

win.close() 

Я думаю, что вы сделали это гораздо сложнее, чем это необходимо. Вышеизложенное должно также работать для «3» (и 300) и, возможно, других значений за пределами 5, 7 & 9. Существует небольшая проблема в настройке для небольшой ширины границы окна (хром), которую я оставляю вам.

enter image description here

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

  • Нет связанных вопросов^_^