【问题标题】:How it is possible to be a circle in python?在python中怎么可能是一个圆圈?
【发布时间】:2017-04-20 13:57:50
【问题描述】:

这是 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 边的多边形,对吗?

【问题讨论】:

  • 它是 50 边的多边形,但看起来几乎像圆形。
  • 请注意,这就是 cmets 和 docstring 有用的地方,理想情况下,您应该有一些像 """approximate a circle with a regular 50-gone""" 这样的信息来打破混乱......

标签: python geometry turtle-graphics


【解决方案1】:

一个圆有无限多个点,一个屏幕有有限多个像素。你是对的,你不能在屏幕上画出真正的圆圈。这并不是说绘制多边形是在屏幕上近似圆的唯一方法。正如@Qwerty 在 cmets 中正确指出的那样,您也可以使用三角函数来做到这一点。

尽管如此,用多边形近似圆是一种古老的方法,也是近似 pi 的经典方法。还有——这对海龟来说是一种有趣的运动。

【讨论】:

  • 您可以使用 SINE 和 COSINE 在计算机上尽可能接近圆圈
  • @Qwerty 好点。我将编辑我的帖子,以免给人留下绘制多边形是近似圆的唯一方法的印象。
  • 你要我发布数学吗?
  • @Qwerty 不需要,基本的极坐标,虽然如果你能用 Python 的海龟模块展示如何做到这一点可能会很有趣。
  • 最准确最快的绘制像素化圆的算法叫做中点圆算法,它有一个Python实现:gist.github.com/0xKD/4530035
【解决方案2】:

我已经有一段时间没有使用 python 编程了(特别是使用海龟库),但如果我记得的话,有一种更简单的方法

import turtle

circumfrence = 80

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

就这么简单!

【讨论】:

  • 这可能是一种简单的方法,但很难用它来制作椭圆。使用 SINE 和 COSINE 会更强大,但对于一些没有研究三角学的人来说可能会更困惑。但是,这个答案适合这个人的需要。干得好!
  • 简单但不正确。 Python turtle.circle() 方法采用diameter / 2circumference / (2 * math.pi) 的半径。这是基础数学,不是 Python。
  • cdlane,我想问你一个问题......主题是什么?因为它是关于如何成为一个圆的,而画一个圆只是一个例子!
  • 我想说的问题是,“如果一个多边形有足够多的边看起来像一个圆,那真的是一个圆吗?”你的 turtle.shape("circle") 光标没有解决这个问题,你的 turtle.circle(circumfrence / 2) 有错误命名的变量(应该是 diameter / 2 因为 turtle.circle() 有一个半径,并且是一个有很多边的多边形,不像一个真正的圆使用sin()cos().
  • 在那种情况下,他们为什么要这样添加它?
【解决方案3】:

对我来说,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()

turtle.circle() 方法使用多边形近似,但它计算边数作为半径的函数,最大值为 60。对于 100 以上的半径,它实际上只使用 28 步,所以我们的 50 边多边形可能准确!

【讨论】:

  • 圆圈部分只是一个例子……我们在说如何变成一个圆圈!
  • @BukkitmanPlaysMCPE,我不明白你的评论。请改写,因为它可能会阐明这个讨论。
  • nvm 那个,但是你可以重新创建脚本,而是让圆圈彼此分开吗?
猜你喜欢
  • 2015-12-16
  • 1970-01-01
  • 2018-12-15
  • 2013-12-26
  • 2014-06-28
  • 1970-01-01
  • 2012-11-12
  • 2013-12-02
  • 2022-07-10
相关资源
最近更新 更多