你好,那里的人堆满了,
最近,我一直在从事我的这个随机项目,该项目将能够在图形上绘制点和线,同时能够对其进行复杂的计算。 这是源代码:
from math import *
class Point:
def __init__(self, position, name=None):
"""Args:
position (tuple[int x, int y]): Point's position on grid
name: Point's name
"""
self.position = {"x": position[0], "y": position[1]}
self.name = name
def distance_from(self, point=None, line=None, pos=()):
if point is not None or len(pos) == 2:
if point is not None:
return sqrt(((point.position["x"] - self.position["x"]) ** 2) + ((point.position['y']
- self.position['y']) ** 2))
elif pos is not None:
return sqrt((pos[0] - self.position["x"]) ** 2 + (pos[1]- self.position['y']) ** 2)
else:
print("Invallid distance_from('point') call made!")
if line is not None or len(pos) == 4:
if line is not None:
base = sqrt(((line.start_point.position['x'] - line.end_point.position['x']) ** 2)
+ ((line.start_point.position['y'] - line.end_point.position['y']) ** 2))
side1 = sqrt((line.start_point.position['x'] - self.position["x"]) ** 2
+ (line.start_point.position['y'] - self.position['y']) ** 2)
side2 = sqrt((line.end_point.position['x'] - self.position["x"]) ** 2
+ (line.end_point.position['y'] - self.position['y']) ** 2)
s = (base + side1 + side2) / 2
area = sqrt(s * (s - base) * (s - side1) * (s - side2))
distance = 2 * (area / base)
return distance
else:
print('Empty distance_from call made!')
class Line:
def __init__(self, start_point, end_point):
try:
self.start_point = Point((start_point[0], start_point[1]))
self.end_point = Point((end_point[0], end_point[1]))
except TypeError:
self.start_point = start_point
self.end_point = end_point
x = 500
a = Point((0, 0), 'Point A')
b = Point((100, 0), 'Point B')
c = Point((50, x), 'Point C')
line = Line(a, b)
print(c.distance_from(line=line))
以下是发生的情况的背景信息:
Point类具有distance_from方法,该方法能够计算自身与一个点之间的距离(通过使用勾股定理来计算边a和b等于的三角形的斜边(c)两个点的x和y坐标彼此相减)或自身以及直线中最接近的点(通过使用Heron公式求出三角形的高度),其底数为距直线的start_point和end_point的距离,边是其自身与直线的起点和终点之间的距离(我知道仅通过阅读就很难将其可视化))
完成程序的这一部分后,我开始对其进行一些随机测试,并且我意识到,更改x的值(第55行)时,有时结果会有些不准确(例如:对于x = 500,请打印第64行中的(c.distance_from(line = line))应该打印出500.0,但是它打印出500.00000000000057,这在x = 10000和x = 100000时也会发生,并且我确定还有其他数字。)有趣的是,会有一些数字应有的出现(例如:100、155)。
这是我的问题:为什么这些数字波动这么大?有办法解决吗?