Страницы

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

воскресенье, 26 мая 2019 г.

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

Здравствуйте! Подскажите, пожалуйста, как правильно нарисовать спираль? Написал такую пародию на код
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, но какого-либо качественного результата это не дало, потому что две части не совпадали друг с другом, т.е. что-то типо этого:

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


Ответ

На каждом шаге нужно расширять эллипс (частью которого является отрисовываемая дуга) вверх и вниз одинаково. Если делать как у вас сейчас, то центры четных и нечетных эллипсов будут смещаться вверх и вниз от горизонтальной оси, из-за чего и получается зазор между верхней и нижней частью. Рабочий код:
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()

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

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