Получение точек, чтобы следовать за большей точкой - PullRequest
0 голосов
/ 26 мая 2018

Так что это программа, которую я сделал для того, чтобы некоторые точки притягивались к большей точке и чтобы эта большая точка росла.Проблема, с которой я сталкиваюсь сейчас, заключается в том, что точки не следуют за большей точкой, а, кажется, отходят от нее.Чтобы приблизиться, я перевожу точки, одну в (0,0), другую в [t2.xcor () - t1.xcor (), t2.ycor () - t1.ycor ()], а затем найти C с помощью теоремы Пифагора и затем использовать арккосинус, чтобы найти угол, к которому он должен обратиться, чтобы двигаться к большей точке.

from turtle import *
import sys
from math import *
#grows t1 shape + has it follow cursor
def grow(x, y):
    t1.ondrag(None)
    t1.goto(x,y)
    global big, nig
    t1.shapesize(big,nig)
    big += .004
    nig += .004
    t1.ondrag(grow)
    follow()

#has create()'d dots follow t1
def follow():
    global count
    #t1.ondrag(None)
    screen.tracer(0,0)
    for p in lx:
        #print(lx[0:5])
        t2.goto(p, ly[count])
        t2.dot(4, "white")
        if ly[count] != 0:
            yb = abs(t2.ycor() - t1.ycor())
            xb = abs((t2.xcor() - t1.xcor()))
            c = sqrt((xb**2 + yb**2))
            #print(y,x,c)
            #print(lx)
            t2.seth(360 - degrees(acos(yb/c)))
        else:
            t2.seth(0)
        t2.forward(20)
        t2.dot(4, "purple")
        lx.pop(count)
        ly.pop(count)
        lx.insert(count, t2.xcor())
       ly.insert(count, t2.ycor())
        count += 1
            #print(lx[0:5])
    #screen.update()
    screen.tracer(1,10)
    count = 0
    #t1.ondrag(follow)
#quits program
def quit():
    screen.bye()
    sys.exit(0)

#create()'s dots with t2
def create():
    screen.tracer(0,0)
    global nux, nuy, count3
    while nuy > -400:
        t2.goto(nux, nuy)
        if t2.pos() != t1.pos():
            t2.dot(4, "purple")
        lx.append(t2.xcor())
        ly.append(t2.ycor())
        nux += 50
        count3 += 1
        if count3 == 17:
            nuy = nuy - 50
            nux = -400
            count3 = 0
    screen.tracer(1, 10)

#variables    
count3 = count = 0
big = nig = .02
lx = []
ly = []
nux = -400
nuy = 300

screen = Screen()
screen.screensize(4000,4000)


t2 = Turtle()
t2.ht()
t2.pu()
t2.speed(0)
t2.shape("turtle")

t1 = Turtle()
t1.shape("circle")
t1.penup()
t1.speed(0)
t1.color("purple")
t1.shapesize(.2, .2)

create()

screen.listen()
screen.onkeypress(quit, "Escape")

t1.ondrag(grow)
#t1.ondrag(follow)

#screen.update()
screen.mainloop()

1 Ответ

0 голосов
/ 27 мая 2018

Я вижу две (похожие) проблемы с вашим кодом.Во-первых, вы можете бросить необычную математику, изобретая метод черепахи .towards(), который дает вам угол, который вы ищете.Во-вторых, вы изобретаете штампы , которые, в отличие от большинства элементов черепахи, могут быть чисто удалены с экрана с помощью clearstamp().Кроме того, вы используете параллельные массивы координат, что указывает на отсутствие правильной структуры данных.Я заменил это одним массивом, содержащим кортежи позиций и штампов.

Я настроил динамику вашей программы, заставляя точки действовать независимо (по таймеру) и не полагаться на движениекурсор.Т.е. они движутся в направлении курсора, движется он или нет.Кроме того, я заставил курсор расти только тогда, когда точка достигает и исчезает:

from turtle import Turtle, Screen

CURSOR_SIZE = 20

def move(x, y):
    """ has it follow cursor """

    t1.ondrag(None)

    t1.goto(x, y)

    screen.update()

    t1.ondrag(move)

def grow():
    """ grows t1 shape """

    global t1_size

    t1_size += 0.4
    t1.shapesize(t1_size / CURSOR_SIZE)

    screen.update()

def follow():
    """ has create()'d dots follow t1 """

    global circles

    new_circles = []

    for (x, y), stamp in circles:
        t2.clearstamp(stamp)

        t2.goto(x, y)
        t2.setheading(t2.towards(t1))
        t2.forward(2)

        if t2.distance(t1) > t1_size // 2:
            new_circles.append((t2.position(), t2.stamp()))
        else:
            grow()  # we ate one, make t1 fatter

    screen.update()

    circles = new_circles

    if circles:
        screen.ontimer(follow, 50)

def create():
    """ create()'s dots with t2 """

    count = 0
    nux, nuy = -400, 300

    while nuy > -400:
        t2.goto(nux, nuy)

        if t2.distance(t1) > t1_size // 2:
            circles.append((t2.position(), t2.stamp()))

        nux += 50
        count += 1
        if count == 17:
            nuy -= 50
            nux = -400
            count = 0

    screen.update()

# variables
t1_size = 4
circles = []

screen = Screen()
screen.screensize(900, 900)

t2 = Turtle('circle', visible=False)
t2.shapesize(4 / CURSOR_SIZE)
t2.speed('fastest')
t2.color('purple')
t2.penup()

t1 = Turtle('circle')
t1.shapesize(t1_size / CURSOR_SIZE)
t1.speed('fastest')
t1.color('orange')
t1.penup()

t1.ondrag(move)

screen.tracer(False)

create()

follow()

screen.mainloop()

enter image description here

Вы должны быть в состоянии переделать этот кодделать все, что вы хотите.Я настоятельно рекомендую вам потратить некоторое время на чтение документации Turtle, чтобы вам не пришлось заново изобретать ее многочисленные функции.

...