我正在尝试使用turtle中的随机坐标创建直角三角形。有时我的代码有效,而其他时候我的三角形的斜边指向错误的方向。我花了几个小时试图弄清楚是什么原因导致了这种不一致。
代码中有几个形状。但是,只有RightTriangle
类会给我带来问题,所以我删除了其他类。
如果有人能想出我如何解决我遇到的问题,我将不胜感激。
from turtle import Turtle
import random
from math import sqrt, degrees, asin, acos, atan
class Shape():
turtle = Turtle()
class RightTriangle(Shape):
def __init__(self, A, B):
self.A = A
self.B = B
def draw(self):
a = (self.B[0] - (self.A[0]))
b = (self.B[1] - (self.A[1]))
c = (sqrt((self.B[0] - self.A[0])**2 + (self.B[1] - self.A[1])**2))
angleA = degrees(atan(a/b))
angleB = degrees(atan(b/a))
Shape.turtle.penup()
Shape.turtle.setposition(self.A)
Shape.turtle.pendown()
Shape.turtle.forward(a)
Shape.turtle.right(90)
Shape.turtle.forward(b)
Shape.turtle.right(180-angleA)
Shape.turtle.forward(c)
Shape.turtle.penup()
def random_shapes(count):
def random_point():
return (random.randint(-200,200), random.randint(-200,200))
shapes = []
for i in range(1, count+1):
shapes += [RightTriangle(random_point(), random_point())]
return shapes
def main():
shapes = random_shapes(15)
for s in shapes:
s.draw()
input ('Hit <enter> key to end.')
input ('Have a nice day!')
main()
使用现有的代码,边的长度可以是负数,这会改变您的"向前";运动和";右";转弯。计算长度时使用绝对值:
a = abs(self.B[0] - (self.A[0]))
b = abs(self.B[1] - (self.A[1]))
注意,c
总是正的。
附带说明一下,您的代码中不需要angleB
变量。
您使用a
和b
来表示dx
和dy
,并且始终从A
开始。想想总是执行right(90)
是否正确(提示,它不能(。如果B
在A
的垂直上方,你将向下而不是向上(如果你采用Selcuk提到的腹肌(。
实现这一点的一个非常简单的方法是直接指向turtle代码中的点A。你可以用做到这一点
Shape.turtle.setheading(Shape.turtle.towards(self.A))
代替
Shape.turtle.right(180-angleA)
这绝对是解决这个问题的最不真实的数学方法,但它确实很好。