我如何让Turtle认出一个圆圈?

时间:2012-08-21 06:38:26

标签: python geometry turtle-graphics

我正在尝试使用Turtle Graphics创建一个Python程序,在一个矩形内绘制两个重叠的圆圈(如维恩图),并将随机点绘制到维恩图上。

我已成功完成此操作,但现在我想让程序识别一个点是在一个圆圈中还是在维恩图的交叉点中。然后我想根据它们所在的区域来改变点的颜色。

到目前为止,我为该程序所做的是列出变量,定义了形状并制作了一个for循环来随机生成点。

2 个答案:

答案 0 :(得分:1)

turtle只是一个图形库 - 它不会跟踪您在屏幕上绘制的对象。因此,要计算给定点是否在您的一个维恩图圆圈内,您需要执行以下步骤:

  1. 致电circle()时存储每个圈子的坐标 (课程会有所帮助,但你可能还没有学过这些课程)
  2. 调用函数以测试该点是否在存储的圆坐标空间中。这将是对笛卡尔坐标的纯粹数学运算。 @Tim给出的链接(Equation for testing if a point is inside a circle)将帮助您实现这一目标。
  3. 关于第1步的一点指导:

    绘制圆形时,其中心(当前龟位置)和半径。从那里,获得该圆圈内的所有点只是几何(如果你不能推导出公式,快速搜索将帮助你)。我建议你制作一个绘制维恩图圆的函数,以及一个返回圆内点的函数。像这样:

    def venn_circle(circle_color, circle_radius):
        """ Draws a colored circle, returns the points within. """
        turtle.color(circle_color)
        # <fill in: code to move, orient the turtle>
        center = turtle.position()
        # <fill in: code to draw the circle>
        return circle_coords(center, circle_radius)
    
    
    def circle_coords(center, radius):
        """ Return the set of pixels within the circle. """
        raise NotImplementedError()
    

    快速记录一下 - 你永远不应该做from package import *。在某些情况下可以,但通常会导致麻烦。在我的示例代码中,我假设您已将{id}替换为import turtle

答案 1 :(得分:0)

我有非常相似的任务,试图用简单的方法解决它:

import tkinter
import random

canvas = tkinter.Canvas(width = 300, height = 200, bg = "white")
canvas.pack()

n = 500

for i in range(n):
    x = random.randrange(0, 300)
    y = random.randrange(0, 200)
    bod = canvas.create_oval(x+3, y+3, x-3, y-3, fill = "black")
    if (x - 100)**2+(y - 100)**2 < 80**2:       #for dot in circle1 fill red
        canvas.itemconfig(bod, fill = "red")
    if (x - 180)**2+(y - 100)**2 < 90**2:       #for dot in circle2 fill blue
        canvas.itemconfig(bod, fill = "blue")
    if (x - 100)**2+(y - 100)**2 < 80**2 and (x - 180)**2+(y - 100)**2 < 90**2:
        canvas.itemconfig(bod, fill = "green")  #overlapping of circle1 and 2