Python 使用海龟图形和递归绘制锯齿形山体曲线

Python 使用海龟图形和递归绘制锯齿形山体曲线,python,python-3.x,recursion,turtle-graphics,Python,Python 3.x,Recursion,Turtle Graphics,我正在尝试为家庭作业创建一个函数,该函数使用海龟和递归绘制一条锯齿状的山形曲线。该函数称为jaggedMountain(x,y,c,t),其中xx,y是端点坐标,c是复杂度常数,t是海龟对象。我正在尝试创建这样的图像: 这会很快崩溃,因为基本情况从未执行,函数被调用993次,并且超过了递归深度。我已经为这个问题挠头很久了,有什么建议吗?起初,我发现您的代码有两个问题。第一个是: if (x1,y1) == (x,y): 海龟在浮点平面上游荡,它们完全相等的几率很小。你最好做以下事情: def

我正在尝试为家庭作业创建一个函数,该函数使用海龟和递归绘制一条锯齿状的山形曲线。该函数称为
jaggedMountain(x,y,c,t)
,其中x
x,y
是端点坐标,
c
是复杂度常数,
t
是海龟对象。我正在尝试创建这样的图像:


这会很快崩溃,因为基本情况从未执行,函数被调用993次,并且超过了递归深度。我已经为这个问题挠头很久了,有什么建议吗?

起初,我发现您的代码有两个问题。第一个是:

if (x1,y1) == (x,y):
海龟在浮点平面上游荡,它们完全相等的几率很小。你最好做以下事情:

def distance(x1, y1, x2, y2):
    return ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5

...

    if distance(x1, y1, x, y) < 1.0:
def距离(x1、y1、x2、y2):
返回((x2-x1)**2+(y2-y1)**2)**0.5
...
如果距离(x1,y1,x,y)<1.0:
第二个问题是
jaggedCurve()
不绘制任何内容,也不返回任何可用于绘制的内容。在某个地方,你需要移动乌龟,让它画一些东西


最后,虽然没有
c
的值很难确定,但我的猜测是,即使进行了上述更改,您也无法得到您想要的。祝你好运。

一开始,我发现你的代码有两个问题。第一个是:

if (x1,y1) == (x,y):
海龟在浮点平面上游荡,它们完全相等的几率很小。你最好做以下事情:

def distance(x1, y1, x2, y2):
    return ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5

...

    if distance(x1, y1, x, y) < 1.0:
def距离(x1、y1、x2、y2):
返回((x2-x1)**2+(y2-y1)**2)**0.5
...
如果距离(x1,y1,x,y)<1.0:
第二个问题是
jaggedCurve()
不绘制任何内容,也不返回任何可用于绘制的内容。在某个地方,你需要移动乌龟,让它画一些东西


最后,虽然没有
c
的值很难确定,但我的猜测是,即使进行了上述更改,您也无法得到您想要的。祝你好运。

非常有趣的问题

我的解决方案是制作一个递归函数,在给定两个端点的情况下绘制一条山形曲线。随机选取一个位于两个端点之间的x坐标值,计算给定最大可能斜率的可能y坐标范围,并在该范围内随机选取一个y值,然后递归执行此操作。当终点足够接近时,只需在它们之间画一条线。代码如下:

MAX_SLOPE = 45
MIN_SLOPE = -45
MIN_HEIGHT = 0
def dist_squared(P1,P2):
    return (P1[0]-P2[0])**2 + (P1[1]-P2[1])**2

def mountain(P1,P2):
    if dist_squared(P1,P2) < 1:
        turtle.goto(P2)
        return
    x1,y1 = P1
    x2,y2 = P2
    x3 = random.uniform(x1,x2)
    y3_max = min((x3-x1)*math.tan(math.radians(MAX_SLOPE)) + y1, (x2-x3)*math.tan(-math.radians(MIN_SLOPE)) + y2)
    y3_min = max((x3-x1)*math.tan(math.radians(MIN_SLOPE)) + y1, (x2-x3)*math.tan(-math.radians(MAX_SLOPE)) + y2)
    y3_min = max(y3_min, MIN_HEIGHT)
    y3 = random.uniform(y3_min,y3_max)
    P3 = (x3, y3)
    mountain(P1,P3)
    mountain(P3,P2)
    return

turtle.up()
turtle.goto(-400,0)
turtle.down()
mountain((-400,0),(400,0))
最大坡度=45
最小坡度=-45
最小高度=0
def距离平方(P1,P2):
返回(P1[0]-P2[0])**2+(P1[1]-P2[1])**2
def山(P1、P2):
如果距离平方(P1,P2)<1:
乌龟。后藤(P2)
返回
x1,y1=P1
x2,y2=P2
x3=随机均匀(x1,x2)
y3_max=min((x3-x1)*数学tan(数学弧度(最大斜率))+y1,(x2-x3)*数学tan(-数学弧度(最小斜率))+y2)
y3_最小=最大((x3-x1)*数学tan(数学弧度(最小斜率))+y1,(x2-x3)*数学tan(-数学弧度(最大斜率))+y2)
y3_最小值=最大值(y3_最小值,最小高度)
y3=随机均匀(最小y3,最大y3)
P3=(x3,y3)
山区(P1、P3)
山区(P3、P2)
返回
乌龟
乌龟。后藤(-400,0)
乌龟
山(-400,0)、(400,0))

非常有趣的问题

我的解决方案是制作一个递归函数,在给定两个端点的情况下绘制一条山形曲线。随机选取一个位于两个端点之间的x坐标值,计算给定最大可能斜率的可能y坐标范围,并在该范围内随机选取一个y值,然后递归执行此操作。当终点足够接近时,只需在它们之间画一条线。代码如下:

MAX_SLOPE = 45
MIN_SLOPE = -45
MIN_HEIGHT = 0
def dist_squared(P1,P2):
    return (P1[0]-P2[0])**2 + (P1[1]-P2[1])**2

def mountain(P1,P2):
    if dist_squared(P1,P2) < 1:
        turtle.goto(P2)
        return
    x1,y1 = P1
    x2,y2 = P2
    x3 = random.uniform(x1,x2)
    y3_max = min((x3-x1)*math.tan(math.radians(MAX_SLOPE)) + y1, (x2-x3)*math.tan(-math.radians(MIN_SLOPE)) + y2)
    y3_min = max((x3-x1)*math.tan(math.radians(MIN_SLOPE)) + y1, (x2-x3)*math.tan(-math.radians(MAX_SLOPE)) + y2)
    y3_min = max(y3_min, MIN_HEIGHT)
    y3 = random.uniform(y3_min,y3_max)
    P3 = (x3, y3)
    mountain(P1,P3)
    mountain(P3,P2)
    return

turtle.up()
turtle.goto(-400,0)
turtle.down()
mountain((-400,0),(400,0))
最大坡度=45
最小坡度=-45
最小高度=0
def距离平方(P1,P2):
返回(P1[0]-P2[0])**2+(P1[1]-P2[1])**2
def山(P1、P2):
如果距离平方(P1,P2)<1:
乌龟。后藤(P2)
返回
x1,y1=P1
x2,y2=P2
x3=随机均匀(x1,x2)
y3_max=min((x3-x1)*数学tan(数学弧度(最大斜率))+y1,(x2-x3)*数学tan(-数学弧度(最小斜率))+y2)
y3_最小=最大((x3-x1)*数学tan(数学弧度(最小斜率))+y1,(x2-x3)*数学tan(-数学弧度(最大斜率))+y2)
y3_最小值=最大值(y3_最小值,最小高度)
y3=随机均匀(最小y3,最大y3)
P3=(x3,y3)
山区(P1、P3)
山区(P3、P2)
返回
乌龟
乌龟。后藤(-400,0)
乌龟
山(-400,0)、(400,0))

我知道这是3个月前发布的,但希望这对在期末考试前5天也被分配了这个可怕问题的人有所帮助!哈!

我与这个问题的斗争是没有意识到你只需要通过一个点。要获得海龟的起点,只需使用海龟库中包含的.xcor()和.ycor()

import turtle
import random

def mountain (x, y, complexity, turtleName):
    if complexity == 0:
        turtleName.setposition(x, y)
    else: 
        x1 = (turtleName.xcor() + x)/2
        y1 = (turtleName.ycor() + y)/2
        y1 = y1 + (random.uniform(0, complexity) - 0.5) * (turtleName.xcor() - x)
        complexity = complexity - 1
        mountain(x1, y1, complexity, turtleName)
        mountain(x, y, complexity, turtleName)


def main ():
    #Gets input for first coordinate pair, splits, and assigns to variables
    coordinate = str(input("Enter the coordinate pair, separated by a comma: "))
    x, y = coordinate.split(',')
    x = int(x)
    y = int(y)

    complexity = int(input("Enter the complexity: "))
    while complexity < 0:
        complexity = int(input("Input must be positive. Enter the complexity: "))

    Bob = turtle.Turtle()
    mountain(x, y, complexity, Bob)

main ()

导入海龟
随机输入
def mountain(x、y、复杂性、turtleName):
如果复杂性==0:
turtleName.设定位置(x,y)
其他:
x1=(turtleName.xcor()+x)/2
y1=(turtleName.ycor()+y)/2
y1=y1+(随机、均匀(0,复杂度)-0.5)*(turtleName.xcor()-x)
复杂性=复杂性-1
山(x1,y1,复杂性,turtleName)
山(x,y,复杂性,turtleName)
defmain():
#获取第一个坐标对的输入、拆分和赋值给变量
坐标=str(输入(“输入坐标对,用逗号分隔:”)
x、 y=坐标分割(',')
x=int(x)
y=int(y)
复杂性=int(输入(“输入复杂性:”)
当复杂性<0时:
复杂性=int(输入(“输入必须为正。输入复杂性:”)
Bob=海龟。海龟()
山(x,y,复杂性,Bob)
主要()

我知道这是3个月前发布的,但希望这对在期末考试前5天也被分配了这个可怕问题的人有所帮助!哈!

我与这个问题的斗争是没有意识到你只需要通过一个点。