2016-12-06 6 views
3

вот код В книге Thinkpython 2e.Как можно быть кругом в питоне?

import turtle 
import math 

bob = turtle.Turtle() 

def polygon(t, n, length): 
    angle = 360/n 
    for i in range(n): 
     t.fd(length) 
     t.lt(angle)  

def circle(t, r): 
    circumference = 2 * math.pi * r 
    n = 50 
    length = circumference/n 
    polygon(t, n, length) 

circle(bob,50) 
turtle.mainloop() 

Я не понимаю, как можно быть круг, я думаю, что это будет 50-сторон многоугольника, я прав?

+1

это многоугольник с 50 сторонами, но он выглядит почти как круг. – furas

+0

Обратите внимание, что здесь полезны комментарии и docstring, в идеале у вас будет такая информация, как '' "" приблизительный круг с регулярным 50-ушедшим "" "", чтобы разорвать путаницу ... – Julien

ответ

4

Круг имеет бесконечно много точек, экран имеет конечное число пикселей. Вы правы, что не можете рисовать истинные круги на экране. Это не означает, что рисование полигона - единственный способ приблизить круг на экране. Как справедливо отмечает @Qwerty в комментариях, вы также можете сделать это с помощью триггерных функций.

Тем не менее, аппроксимирующие круги полигонами являются древним подходом и были классическим способом, в котором pi был аппроксимирован. Также - это забавное упражнение для черепах.

+0

Вы можете использовать SINE и COSINE для нарисовать как можно ближе к кругу на компьютере – Qwerty

+0

@ Qwerty Хорошая точка. Я отредактирую свой пост, чтобы не создавать впечатление, что рисование полигона - единственный способ приблизиться к кругу. –

+0

Вы хотите, чтобы я опубликовал математику? – Qwerty

1

Я не запрограммирован в питона в то время (в частности, с черепахой библиотеки), но если я помню, есть способ проще

import turtle 

circumfrence = 80 

turtle = turtle.Turtle() 
turtle.shape("circle") 
turtle.circle(circumfrence/2) 

Это так просто!

+0

Это может быть простым способом сделать это, но с ним сложно работать, чтобы создать эллипс. Использование SINE и COSINE было бы более мощным, но, возможно, более запутанным для некоторых людей, которые не изучают тригонометрию. Но этот ответ подходит этим людям. Хорошая работа! – Qwerty

+0

Это просто, но неверно. Метод Python 'turtle.circle()' принимает радиус, который равен «диаметр/2» или «окружность/(2 * math.pi)». Это базовая математика, а не Python. – cdlane

+0

cdlane, я хотел бы задать вам вопрос ... в чем проблема? потому что речь идет о том, как быть кругом, а рисование круга было только примером! –

0

Нечетная часть о вашей функции circle() заключается в том, что n зафиксирован на уровне 50. В экстремальных условиях больших и малых кругов это может быть не оптимальным и, возможно, должно быть более динамичным. Что касается 50-угольника против круга, давайте проверим, используя turtle.circle() команду:

from turtle import Turtle, Screen 

radius = 100 
sides = 50 

bob = Turtle(shape="turtle") 
bob.width(2) 

bob.pencolor("red") 
bob.circle(radius) 

bob.pencolor("green") 
bob.circle(radius, steps=sides) 

bob.hideturtle() 

screen = Screen() 
screen.exitonclick() 

enter image description here

Метод turtle.circle() использует аппроксимацию полигон, но он вычисляет число сторон в зависимости от радиус с максимумом 60. Для радиуса 100 выше он фактически использует только 28 шагов, поэтому наш 50-сторонний полигон потенциально больше точный!

+0

круглая часть - это всего лишь пример ... мы говорим о том, как превратиться в круг! –

+0

@BukkitmanPlaysMCPE, I don Не понимаю ваш комментарий. Пожалуйста, перефразируйте, так как это может пролить свет на это обсуждение. – cdlane

+0

nvm, но вы можете воссоздать скрипт, но вместо этого круги будут отделяться друг от друга? –