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))
我正在尝试使用 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))