Sympy 延长线段的长度

Sympy extend the length of a Line Segment

我正在尝试使用 Sympy 计算沿延长线段的点。

所以首先我在 point_a 和 point_b 之间设置一条线 Segment:

from sympy import Point, Segment

point_a = (4, 1)
point_b = (10, 3)

p1, p2 = Point(point_a), Point(point_b)
seg = Segment(p1, p2)

在此示例中,段的长度约为 6.32455532034

我希望能够将 point_a 保留在原处,但将 point_b 延伸出去,以便该段的长度为 20(而不是 6.32

seg.length = 20
new_end_point = seg.points[1]

但是它不允许像这样更改行的长度。有没有简单的方法可以做到这一点?

注意 1:我正在尝试为此使用 Sympy,以保持代码对于非数学人员(例如我自己)的可读性

注2:20为任意长度,与p1和p2的起始距离无关

感谢@smichr 的回答,我添加了他所说内容的简化版本:

from sympy import Point, Ray, Circle

point_a = (4, 1)
point_b = (10, 3)
extend = 20

p1, p2 = Point(point_a), Point(point_b)
ray = Ray(p1, p2)
c = Circle(p1, extend).intersection(ray)

# The resulting point
result = c[0].evalf().coordinates

改变线的长度意味着什么?新的起点和终点在哪里?

我假设您想保持 p1 不变,但移动 p2 使其与 p1 的距离增加一倍,但与 [=] 的方向相同12=] 到 p2:

In [12]: p1, p2 = Point2D(4, 1), Point2D(10, 3)

In [13]: p3 = p1 + 2*(p2 - p1)

In [14]: p3
Out[14]: Point2D(16, 5)

In [15]: Segment2D(p1, p3)
Out[15]: Segment2D(Point2D(4, 1), Point2D(16, 5))

或者,您可以使多个符号化,然后替换不同的值:

In [16]: x = symbols('x')

In [17]: line = Segment2D(p1, p1 + x*(p2 - p1))

In [18]: line
Out[18]: Segment2D(Point2D(4, 1), Point2D(6*x + 4, 2*x + 1))

In [19]: line.subs(x, 2)
Out[19]: Segment2D(Point2D(4, 1), Point2D(16, 5))

取一个由点定义的线段

>>> p1=(0,0)
>>> p2=(1,0)
>>> s=Segment(p1,p2)

将它投射到光线上,看看它与以 p1 为中心的所需半径的圆相交的位置。它只会在一个点相交,所以将那个点用于您的新线段:

>>> from sympy.abc import t
>>> from sympy import Ray, Circle
>>> Circle(p1, 20).intersection(Ray(*s.args))[0]
Point(20, 0)
>>> new_segment = Segment(p1, _)

您可以将其包装成这样的函数:

>>> def directed_segment(line, length):
...     from sympy import Circle, Ray
...     p3 = Ray(*line.args).intersection(Circle(line.p1, length))[0]
...     return line.func(line.p1, p3)
...
>>> directed_segment(s,20)
Segment2D(Point2D(0, 0), Point2D(20, 0))