Уведомления

Группа в Telegram: @pythonsu

#1 Май 27, 2018 06:34:28

Trk
Зарегистрирован: 2018-05-27
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите совсем новичку

Доброго времени суток! Только начинаю изучать 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)

Офлайн

#2 Май 27, 2018 06:49:27

Trk
Зарегистрирован: 2018-05-27
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите совсем новичку

То же самое, но через функцию
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

Офлайн

#3 Май 27, 2018 22:51:47

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Помогите совсем новичку

1. у вас стороны всех многоугольников одинаковы и равны 50, но это не правильно, длину стороны каждой фигуры нужно вычислять в зависимости от радиуса описанной окружности.

2. нужно назначить радиус первой окружности R и расстояние между окружностями L, тогда легко посчитать радиусы всех окружностей и соответствующие им стороны и углы.

3. перед рисованием сторон нужно развернуть “черепашку” на половину внутреннего угла между сторонами (у треугольника 3 угла по 60° — разворачиваем на 30°, у квадрата 4 угла по 90° — разворачиваем на 45°, и т.д., это нужно посчитать), после завершения фигуры разворачиваем “черепашку” обратно на этот угол.

4. поднимаем “карандаш” (“черепашку”) и переходим на следующий круг, опускаем “карандаш”.

5. для расчётов нужен модуль math.


Успехов в “черепаховождении”, если нужно, могу показать моё решение.

Офлайн

#4 Май 30, 2018 00:39:49

Trk
Зарегистрирован: 2018-05-27
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите совсем новичку

Спасибо большое за помощь!!!!!! Не совсем понимаю, зачем 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

Все равно получается неправильно(( А где ошибся, понять не могу

Офлайн

#5 Май 30, 2018 09:10:19

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Помогите совсем новичку

Trk
Не совсем понимаю, зачем 3 пункт? ( Разворачивать черепашку)
Черепашка может рисовать только вперёд или назад, чтобы нарисовать линию под углом, нужно развернуть черепашку. Командами turtle.right(45) и turtle.left(45) вы её разворачиваете (я это имел в виду в п.3), но нужно разворачивать не на 45°, а на другой угол, для каждой фигуры нужно посчитать. А также в том порядке как я написал в п.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° вправо

Теперь то же самое сделайте в цикле, с расчётами и т.д. для всех фигур.

P.S. Код вставляйте в теги Python, список тегов в панели инструментов окна редактирования (рядом со смайликом)

Офлайн

#6 Июнь 3, 2018 11:52:23

Trk
Зарегистрирован: 2018-05-27
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите совсем новичку

Спасибо вам большое за уделенное время, все оказалось проще, чем я себе в голове выстраивал, нужно только было понять, что поворачивать надо на определенный угол

 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
Еще раз спасибо за помощь в освоении

Офлайн

#7 Июнь 4, 2018 12:00:11

Intarr
Зарегистрирован: 2018-06-04
Сообщения: 3
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите совсем новичку

Я тоже осваиваю данный курс. Лектор замечательный.
Гуглил по этой теме и наткнулся на ваши посты.
Боролся с этой задачкой 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()

Офлайн

#8 Июнь 4, 2018 12:26:29

Trk
Зарегистрирован: 2018-05-27
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите совсем новичку

Боролся с этой задачкой 4 дня.
Также маялся. пытался решить без модуля math, так как в лекциях про него ни слова,думал - значит он не требуется, считал на бумаге, пытался какую-нибудь закономерность выявить.
Теперь новая проблема: вы задачу с рисованием звезды с n вершинами решили? Я так и не смог посчитать угол при вершине у звезды с n вершинами, в итоге поэтому пользовалься координатами и соответсвенно списками, хотя , мне кажется, есть более простое решение, вот что я насочинял:
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)

Офлайн

#9 Июнь 4, 2018 14:07:14

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Помогите совсем новичку

Trk
Но программа где-то зацикливается, и звезда рисуется бесконечно, так и не понял где
В строке кода while i<n+1: должен быть - а не +

В случае с нечётным числом сторон нужно завершить рисование последней стороны возвращением карандаша в исходную (самую первую) точку.

Офлайн

#10 Июнь 4, 2018 14:34:38

Trk
Зарегистрирован: 2018-05-27
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите совсем новичку

как всегда спасибо Действительно, условие i<n+1 - всегда верно

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version