为什么红色多边形离开平面,然后再次返回指定位置?

时间:2018-03-06 12:48:14

标签: python-3.x turtle-graphics

我想把红色多边形放在空白多边形的位置。但它再次回到它之前首先超过它。有人可以帮助我吗?

为什么红色多边形离开平面,然后再次返回指定位置?

enter image description here

def Rotating(Rotating_angle, polygon_points):  # Drawing the rotated figure
    my_points = (re.findall("\(\-?\d*\.?\d*\,\-?\d*\.?\d*\)", polygon_points))
    sleep_time = .5
    my_new_points = []  # Scale_points
    for point in my_points:
        new_point = str(point).replace(")", "").replace("(", "").split(",")

        # creating a list with all coordinates components
        all_coordinates_components = []
        all_coordinates_components.append(abs(eval(new_point[0])))
        all_coordinates_components.append(abs(eval(new_point[1])))

        point = (scale * eval(new_point[0]), scale * eval(new_point[1]))

        my_new_points.append(point)

        rotated_points = []

        for point in my_new_points:
            new_point = str(point).replace(")", "").replace("(", "").split(",")
            theta = Rotating_angle
            X = (eval(new_point[0]) * cos(theta * pi / 180)) - (eval(new_point[1]) * sin(theta * pi / 180))
            Y = (eval(new_point[0]) * sin(theta * pi / 180)) + (eval(new_point[1]) * cos(theta * pi / 180))

            # length = sqrt((X) ** 2 + (Y) ** 2)

            point = (X, Y)
            rotated_points.append(point)


    # draw steps
    time.sleep(sleep_time)

    draw_rotation_steps(my_new_points, theta)  # draw steps        ((((( 3 )))))

    # drawing rotated polygon
    draw_polygon(rotated_points)  # draw rotated polygon           ((((( 4 )))))

    s = Shape('compound')
    poly1 = (my_new_points)
    s.addcomponent(poly1, fill="red")
    register_shape('myshape', s)
    shape('myshape')

    polygon = Turtle(visible=False)
    polygon.setheading(90)
    polygon.speed('slowest')

    polygon.penup()
    polygon.shape('myshape')
    polygon.st()
    polygon.circle(0, theta)

    pen_dot = Turtle(visible=False)
    pen_dot.speed('fastest')
    for point in rotated_points:
        pen_dot.penup()
        pen_dot.goto(point)
        pen_dot.pendown()
        pen_dot.dot(5, 'blue violet')

1 个答案:

答案 0 :(得分:0)

我无法重现您描述的行为。但是你的代码中充斥着应该解决的问题,所以修复这些问题也可能会解决定位问题:

这些循环是嵌套的,但它们不应该是:

my_new_points = []
for point in my_points:
        ...
        rotated_points = []
        for point in my_new_points:

他们俩都应该处于同一水平。

您不应该使用eval()。在这种情况下,请使用float()

point = (scale * eval(new_point[0]), scale * eval(new_point[1]))

在这里,您已经转换了点数,但是将它们重新转换为字符串并重新转换它们:

new_point = str(point).replace(")", "").replace("(", "").split(",")

X = (eval(new_point[0]) * cos(theta * pi / 180)) - (eval(new_point[1]) * sin(theta * pi / 180))

当你可以做到:

X = point[0] * cos(theta * pi / 180) - point[1] * sin(theta * pi / 180)

您无需将笔放下以使.dot()方法起作用:

pen_dot.goto(point)
pen_dot.pendown()
pen_dot.dot(5, 'blue violet')

所以你可以将penup()移出循环。

以下是我对示例代码的修改。我添加了足够的代码使其可以运行并删除任何与问题无关的内容。看看这是否为您提供了如何简化和修复自己的代码的任何想法:

import re
from math import sin, cos, pi
from turtle import *

scale = 20

def draw_rotation_steps(points, theta):

    ''' Not supplied by OP '''

    pass

def draw_polygon(rotated_points):

    ''' Simple replacement since not supplied by OP '''

    hideturtle()
    penup()
    goto(rotated_points[-1])
    pendown()
    for point in rotated_points:
        goto(point)

def Rotating(theta, polygon_points):  # Drawing the rotated figure
    my_points = re.findall(r"\(\-?\d*\.?\d*\,\-?\d*\.?\d*\)", polygon_points)

    my_new_points = []  # Scaled points

    for point in my_points:
        X, Y = point.replace(")", "").replace("(", "").split(",")

        point = (scale * float(X), scale * float(Y))

        my_new_points.append(point)

    rotated_points = []

    for point in my_new_points:
        X = point[0] * cos(theta * pi / 180) - point[1] * sin(theta * pi / 180)
        Y = point[0] * sin(theta * pi / 180) + point[1] * cos(theta * pi / 180)

        point = (X, Y)
        rotated_points.append(point)

    # draw steps

    draw_rotation_steps(my_new_points, theta)  # draw steps

    # drawing rotated polygon
    draw_polygon(rotated_points)  # draw rotated polygon

    s = Shape('compound')
    s.addcomponent(my_new_points, fill="red")
    register_shape('myshape', s)

    polygon = Turtle('myshape', visible=False)
    polygon.setheading(90)
    polygon.showturtle()

    polygon.circle(0, theta, steps=100)  # added steps to visually slow it down

    pen_dot = Turtle(visible=False)
    pen_dot.penup()

    for point in rotated_points:
        pen_dot.goto(point)
        pen_dot.dot(5, 'blue violet')

Rotating(180, "(-8,-6) (-6,-3) (-3,-4)")

mainloop()