计算沿线段距离线段末端一个单位的点

Calculate a point along a line segment one unit from a end of the seg

你好!当我知道直线的斜率和 y 轴截距时,我需要计算距离该直线 1 个单位的 x 值。 例如,如果 pointA = (4,5),并且我设置了一条从它开始的线,斜率为 0(因此 5 作为 y 截距),那么我想要的 x 值将是 5。如果斜率未定义(垂直),则 x 值为 4。依此类推。

到目前为止,我将 x 计算为 x = m(point[0]+1)-b。但是,这对于垂直线效果不佳。 This and this 都差不多,但是第一个我看不懂C#,第二个我不需要排除任何可能的点(还)。

这有点像用大锤敲钉子,但如果你要 运行 经常遇到几何问题,我会写或找一个 Point/Vector class喜欢

import math
class Vector():
    def __init__(self, x=0.0, y=0.0, z=0.0):
        self.x = x
        self.y = y
        self.z = z

    def __add__(self, other):
        self.x += other.x
        self.y += other.y
        self.z += other.z
        return self

    def __sub__(self, other):
        self.x -= other.x
        self.y -= other.y
        self.z -= other.z
        return self

    def dot(self, other):
        return self.x*other.x + self.y*other.y + self.z*other.z

    def cross(self, other):
        tempX = self.y*other.z - self.z*other.y
        tempY = self.z*other.x - solf.x*other.z
        tempZ = self.x*other.y - self.y*other.x
        return Vector(tempX, tempY, tempZ)

    def dist(self, other):
        return math.sqrt((self.x-other.x)**2 + (self.y-other.y)**2 + (self.z-other.z)**2)

    def unitVector(self):
        mag = self.dist(Vector())
        if mag != 0.0:
            return Vector(self.x * 1.0/mag, self.y * 1.0/mag, self.z * 1.0/mag)
        else:
            return Vector()

    def __repr__(self):
        return str([self.x, self.y, self.z])

然后你可以做各种各样的事情,比如通过减去两个点来找到向量

>>> a = Vector(4,5,0)
>>> b = Vector(5,6,0)
>>> b - a
[1, 1, 0]

或者在一个点上加上一个任意的单位向量来找到一个新的点(这就是你原来问题的答案)

>>> a = Vector(4,5,0)
>>> direction = Vector(10, 1, 0).unitVector()
>>> a + direction
[4.995037190209989, 5.099503719020999, 0.0]

您可以添加更多实用程序,例如允许 Vector/Scalar 缩放操作等