在Python中使用随机点计算直角三角形



我正在尝试使用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变量。

您使用ab来表示dxdy,并且始终从A开始。想想总是执行right(90)是否正确(提示,它不能(。如果BA的垂直上方,你将向下而不是向上(如果你采用Selcuk提到的腹肌(。

实现这一点的一个非常简单的方法是直接指向turtle代码中的点A。你可以用做到这一点

Shape.turtle.setheading(Shape.turtle.towards(self.A))

代替

Shape.turtle.right(180-angleA)

这绝对是解决这个问题的最不真实的数学方法,但它确实很好。

最新更新