Форум сайта python.su
0
Доброго времени суток! Только начинаю изучать Python в чстности и программирование в общем. Такая проблема, необходимо с помощью модуля turtle нарисовать10 вложенных правильных многоугольников.( пример - http://judge.mipt.ru/mipt_cs_on_python3/labs/lab1.html#id45 упражнение№9). Не могу сообразить - как переставить курсор( черепаху), чтобы расстояние м/у предыдущим и следующим многоугольником было одинаково. Вот, что смог сам:
import turtle
turtle.shape('turtle')
n=3
for n in range(3,13,1):
q=360/n
while n>0:
turtle.forward(50)
turtle.left(q)
n-=1
Отредактировано Trk (Май 27, 2018 06:35:30)
Офлайн
0
То же самое, но через функцию
import turtle
turtle.shape('turtle')
n=3
def more_agles(n):
q=360/n
while n>0:
turtle.forward(50)
turtle.left(q)
n-=1
while n<13:
more_agles(n)
n+=1
Офлайн
72
1. у вас стороны всех многоугольников одинаковы и равны 50, но это не правильно, длину стороны каждой фигуры нужно вычислять в зависимости от радиуса описанной окружности.
2. нужно назначить радиус первой окружности R и расстояние между окружностями L, тогда легко посчитать радиусы всех окружностей и соответствующие им стороны и углы.
3. перед рисованием сторон нужно развернуть “черепашку” на половину внутреннего угла между сторонами (у треугольника 3 угла по 60° — разворачиваем на 30°, у квадрата 4 угла по 90° — разворачиваем на 45°, и т.д., это нужно посчитать), после завершения фигуры разворачиваем “черепашку” обратно на этот угол.
4. поднимаем “карандаш” (“черепашку”) и переходим на следующий круг, опускаем “карандаш”.
5. для расчётов нужен модуль math.
Успехов в “черепаховождении”, если нужно, могу показать моё решение.
Офлайн
0
Спасибо большое за помощь!!!!!! Не совсем понимаю, зачем 3 пункт? ( Разворачивать черепашку)
вот что смог сам додумать:
import turtle
import math
turtle.shape('turtle')
n=3
r=10 #задаем радиус первой окружности
def more_agles(n,m): #опеределяем функцию, рисующую многоугольник
q=360/n
while n>0:
turtle.left(q)
turtle.forward(m)
n-=1
while n<13:
m=2*r*math.sin(math.pi/n) #считаем размер стороны многоугольника (a=2Rsin (360/2n))
more_agles(n,m)
turtle.right(45)
turtle.penup()
turtle.forward(10)# задаем расстояние м/у окружностями
turtle.left(45)
turtle.pendown()
n+=1
r+=10 #раз расстояние м/у окружностями 10, увеличиваем радиус на 10
Все равно получается неправильно(( А где ошибся, понять не могу
Офлайн
72
TrkЧерепашка может рисовать только вперёд или назад, чтобы нарисовать линию под углом, нужно развернуть черепашку. Командами turtle.right(45) и turtle.left(45) вы её разворачиваете (я это имел в виду в п.3), но нужно разворачивать не на 45°, а на другой угол, для каждой фигуры нужно посчитать. А также в том порядке как я написал в п.3.
Не совсем понимаю, зачем 3 пункт? ( Разворачивать черепашку)
TrkПопробуйте проанализировать следующий код:
Все равно получается неправильно(( А где ошибся, понять не могу
import turtle turtle.shape('turtle') #черепашка for i in range(3): #рисуем треугольник как у вас, видно, что он ориентирован не как в задании turtle.left(120) turtle.forward(50) turtle.color('red') #меняем цвет на красный для наглядности turtle.left(30) #разворачиваем на 30° влево, угол нужно вычислить for i in range(3): #рисуем красный треугольник как в задании turtle.left(120) turtle.forward(50) turtle.right(30) #разворачиваем на 30° вправо turtle.penup() #поднимаем карандаш turtle.forward(30) #перемещаем карандаш на нужное место turtle.pendown() #опускаем карандаш turtle.color('blue') #меняем цвет на циний для наглядности turtle.left(45) #разворачиваем на 45° влево, угол нужно вычислить for i in range(4): #рисуем синий квадрат как в задании turtle.left(90) turtle.forward(100) turtle.right(45) #разворачиваем на 45° вправо
Офлайн
0
Спасибо вам большое за уделенное время, все оказалось проще, чем я себе в голове выстраивал, нужно только было понять, что поворачивать надо на определенный угол
import turtle import math turtle.shape('turtle') n=3 r=10 #задаем радиус первой окружности def more_agles(n,m): #опеределяем функцию, рисующую многоугольник q=360/n while n>0: turtle.left(q) turtle.forward(m) n-=1 while n<13: m=2*r*math.sin(math.pi/n) #считаем размер стороны многоугольника (a=2Rsin (360/2n)) x=(180-360/n)/2 turtle.left(x) more_agles(n,m) turtle.right(x) turtle.penup() turtle.forward(10)# задаем расстояние м/у окружностями turtle.pendown() n+=1 r+=10 #раз расстояние м/у окружностями 10, увеличиваем радиус на 10
Офлайн
1
Я тоже осваиваю данный курс.
Лектор замечательный.
Гуглил по этой теме и наткнулся на ваши посты.
Боролся с этой задачкой 4 дня.
Вот моё решение:
import turtle as t import math as m t.pencolor("black") # Vars: loops = 0 # Начальное количество итераций для отрисовки многоугольников: n = 3 # Количество сторон многоугольника N > 3 r = 15 # Начальный радиус окружности. (иначе говоря точка на оси X) # Формула радиуса R = a / 2 * m.sin(180) / n) но тут нам не пригодится, # так как смещать будем по оси X а не произвольно. # def: def polygon(n,L): a = (n - 2) * 180 / n # Угол между вершинами многоугольника for i in range(n): t.right(180 - a) t.forward(L) while loops < 10: L = 2 * r * m.sin(m.pi / n) # Длинна стороны многоугольника ang = ((n - 2) * 180/n) / 2 # Угол поворота каждого построенного многоугольника t.right(ang) # Поворачиваем на угол ang polygon(n, L) # Рисуем многоугольник t.left(ang) # Возвращаем угол в исходное положение. t.penup() t.forward(15) # Смещаем на расстояние по оси X t.pendown() r += 15 # Увеличиваем радиус на расстояние между многоугольниками, для увелечения длинны L n += 1 # Увеличиваем количество сторон многоугольника loops += 1 # Увеличиваем итерацию t.mainloop()
Офлайн
0
Боролся с этой задачкой 4 дня.Также маялся. пытался решить без модуля math, так как в лекциях про него ни слова,думал - значит он не требуется, считал на бумаге, пытался какую-нибудь закономерность выявить.
mport turtle
import math
n=int (input ('Введите количество вершин '))
r=200
A=[]
B=[]
i=0
for k in range(1,n+1,1):
x=r*math.cos(math.pi/2+2*k*math.pi/n)
y=r*math.sin(math.pi/2+2*k*math.pi/n)
#print ('Координата х', x, 'Координата y',y)#выводил для проверки, что список заполняется правильно
A.append(x)
B.append(y)
turtle.penup()
turtle.goto(A[0],B[0])
if n%2!=0:
while i<n+1:
turtle.pendown()
for i in range(0,n,2):
turtle.goto(A[i],B[i])
for i in range(1,n,2):
turtle.goto(A[i],B[i])
i+=1
else:
turtle.pendown()
for i in range(0,n,2):
turtle.goto(A[i],B[i])
turtle.goto(A[0],B[0])
turtle.penup()
turtle.goto(A[1],B[1])
turtle.pendown()
for i in range(1,n,2):
turtle.goto(A[i],B[i])
turtle.goto(A[1],B[1])
#turtle.pendown()
#turtle.goto(A[0],B[0])
Отредактировано Trk (Июнь 4, 2018 12:32:13)
Офлайн
72
TrkВ строке кода while i<n+1: должен быть - а не +
Но программа где-то зацикливается, и звезда рисуется бесконечно, так и не понял где
Офлайн
0
как всегда спасибо
Действительно, условие i<n+1 - всегда верно
Офлайн