Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Tkinter, Canvas. Нарисовать спираль

#python #python_3x #tkinter


Здравствуйте! Подскажите, пожалуйста, как правильно нарисовать спираль?
Написал такую пародию на код 

from tkinter import *

root = Tk()

canvas = Canvas(root, width=300, height=300)
canvas.pack()
step = 10
p = [145, 145, 155, 155]
iters = 0
canvas.create_arc(p[0], p[1], p[2], p[3], start=0, extent=180, style=ARC)

while p[0] > 10:
    if (iters % 2):
        canvas.create_arc(p[0] - step, p[1] - step, p[2], p[3],
                          start=0, extent=180, style=ARC)
        p[0], p[1] = p[0] - step, p[1] - step
    else:
        canvas.create_arc(p[0], p[1], p[2] + step, p[3] + step,
                          start=0, extent=-180, style=ARC)
        p[2], p[3] = p[2] + step, p[3] + step
    iters += 1
root.mainloop()

На выходе получаю такое:

 

Вопрос в том как избавиться от этой щели? 

Я пробовал играться с аргументами start и extent, но какого-либо качественного результата
это не дало, потому что две части не совпадали друг с другом, т.е. что-то типо этого:



^ Тут я от балды ввел значения, попиксельно не подгоняя. 

Сталкивался ли кто с такой проблемой? 
    


Ответы

Ответ 1



На каждом шаге нужно расширять эллипс (частью которого является отрисовываемая дуга) вверх и вниз одинаково. Если делать как у вас сейчас, то центры четных и нечетных эллипсов будут смещаться вверх и вниз от горизонтальной оси, из-за чего и получается зазор между верхней и нижней частью. Рабочий код: from tkinter import * root = Tk() canvas = Canvas(root, width=300, height=300) canvas.pack() step = 10 p = [145, 145, 155, 155] iters = 0 canvas.create_arc(*p, start=0, extent=180, style=ARC) while p[0] > step: p[1] -= step/2 # расширение вниз p[3] += step/2 # расширение вверх if iters % 2: p[0] -= step # расширение и сдвиг левой границы влево canvas.create_arc(*p, start=0, extent=180, style=ARC) else: p[2] += step # расширение и сдвиг правой границы вправо canvas.create_arc(*p, start=0, extent=-180, style=ARC) iters += 1 root.mainloop()

Комментариев нет:

Отправить комментарий