代码的最终值显然没有任何原因波动。 (蟒蛇)

时间:2019-01-30 23:01:08

标签: python

你好,那里的人堆满了,

最近,我一直在从事我的这个随机项目,该项目将能够在图形上绘制点和线,同时能够对其进行复杂的计算。 这是源代码:

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)。

这是我的问题:为什么这些数字波动这么大?有办法解决吗?

0 个答案:

没有答案