计算沿线段距离线段末端一个单位的点
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 缩放操作等
你好!当我知道直线的斜率和 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 缩放操作等