рисование изогнутой горной кривой с использованием черепашьей графики и рекурсии - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь создать функцию для домашнего задания, которая рисует изогнутую горную кривую, используя черепах и рекурсию.Функция называется jaggedMountain(x,y,c,t), где x x,y - конечные координаты, c - постоянная сложности, а t - объект черепахи.Я пытаюсь создать образ, подобный этому: mountain curve

def jaggedCurve(x,y,c,t):
    t.pendown()
    x1 = t.xcor() + x / 2
    y1 = t.ycor() + y / 2
    y1 = y + (random.uniform(0,c)-0.5) * (t.xcor() - x)
    if (x1,y1) == (x,y):
        return None
    else:
        jaggedCurve(x1,y1,c,t)

Это происходит сбой быстро, так как базовый случай никогда не выполняется, функция вызывается 993 раза, а глубина рекурсиипревышены.Я довольно долго царапал голову этим, есть какие-нибудь предложения?

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Очень интересная проблема!

Мое решение - создать рекурсивную функцию, которая рисует горную кривую с учетом двух конечных точек. Произвольно выберите значение координаты 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))
1 голос
/ 20 апреля 2019

Изначально я вижу две проблемы с вашим кодом.Первый:

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:

Вторая проблема заключается в том, что jaggedCurve() рисует ничего и не возвращает ничего, что можно использовать для рисования.Где-то вам нужно на самом деле переместить черепаху, чтобы заставить что-то нарисовать.

Наконец, хотя трудно быть уверенным без значения для c, я думаю, что даже с вышеуказанными изменениями вы не получитеты чего хочешь.Удачи.

...