飞机¶
- class sympy.geometry.plane.Plane(p1, a=None, b=None, **kwargs)[源代码][源代码]¶
平面是一个平坦的二维表面。平面是点(零维)、线(一维)和实体(三维)的二维模拟。平面通常可以通过两种类型的输入来构造。它们是:- 三个不共线的点 - 一个点和法向量
- 属性:
p1
平面的唯一定义点。
normal_vector
给定平面的法向量。
方法
平面与其他几何实体之间的角度。
arbitrary_point
([u, v])返回平面上的任意一点。
are_concurrent
(*planes)一系列平面是否同时发生?
as_content_primitive
([radical, clear])一个存根,允许在计算表达式的内容和基本组件时跳过基本参数(如元组)。
as_dummy
()返回表达式,其中任何具有结构绑定符号的对象都被替换为在其出现的对象中唯一的规范符号,并且仅对交换性具有默认假设为True。
atoms
(*types)返回构成当前对象的原子。
class_key
()类的好顺序。
compare
(other)如果对象在规范意义上小于、等于或大于其他对象,则返回 -1、0、1。
count
(query)计算匹配的子表达式的数量。
count_ops
([visual])用于返回操作计数的 count_ops 的包装器。
distance
(o)平面与其他几何实体之间的距离。
doit
(**hints)评估默认情况下不评估的对象,如极限、积分、求和和乘积。
dummy_eq
(other[, symbol])比较两个表达式并处理哑符号。
encloses
(o)如果 o 在 self 的边界内(不在边界上或外部),则返回 True。
equals
(o)如果 self 和 o 是相同的数学实体,则返回 True。
equation
([x, y, z])平面的方程。
evalf
([n, subs, maxn, chop, strict, quad, ...])将给定的公式计算到 n 位精度。
find
(query[, group])查找所有匹配查询的子表达式。
fromiter
(args, **assumptions)从可迭代对象创建一个新对象。
has
(*patterns)测试是否有任何子表达式匹配任何模式。
has_free
(*patterns)如果 self 包含对象
x
作为自由表达式,则返回 True,否则返回 False。has_xfree
(s)如果 self 有 s 中的任何一个模式作为自由参数,则返回 True,否则返回 False。
intersection
(o)与其他几何实体的交点。
is_coplanar
(o)如果 \(o\) 与自身共面,则返回 True,否则返回 False。
is_parallel
(l)给定的几何实体是否与平面平行?
给定的几何实体是否垂直于给定的平面?
is_same
(b[, approx])如果 a 和 b 结构相同则返回 True,否则返回 False。
is_similar
(other)这个几何实体与另一个几何实体相似吗?
match
(pattern[, old])模式匹配。
matches
(expr[, repl_dict, old])用于 match() 的辅助方法,用于在 self 中的通配符符号与 expr 中的表达式之间寻找匹配。
n
([n, subs, maxn, chop, strict, quad, verbose])将给定的公式计算到 n 位精度。
parallel_plane
(pt)与给定平面平行并通过点 pt 的平面。
parameter_value
(other, u[, v])返回与给定点对应的参数。
一条垂直于给定平面的直线。
perpendicular_plane
(*pts)返回通过给定点的垂直线。
projection
(pt)将给定点沿平面法线投影到平面上。
projection_line
(line)将给定的直线投影到包含该直线的法平面所通过的平面上。
random_point
([seed])返回平面上的一个随机点。
rcall
(*args)通过表达式树递归应用于参数。
refine
([assumption])请参阅 sympy.assumptions 中的 refine 函数。
reflect
(line)反映一个对象穿过一条线。
replace
(query, value[, map, simultaneous, exact])将
self
中匹配的子表达式替换为value
。rewrite
(*args[, deep])使用定义的规则重写 self。
rotate
(angle[, pt])围绕点
pt
逆时针旋转angle
弧度。scale
([x, y, pt])通过将 x,y 坐标乘以 x 和 y 来缩放对象。
simplify
(**kwargs)请参阅 sympy.simplify 中的 simplify 函数。
sort_key
([order])返回一个排序键。
subs
(*args, **kwargs)在简化参数后,在表达式中用新内容替换旧内容。
translate
([x, y])通过将 x 和 y 值添加到 x,y 坐标来移动对象。
xreplace
(rule)替换表达式中对象的出现。
复制
could_extract_minus_sign
is_hypergeometric
示例
>>> from sympy import Plane, Point3D >>> Plane(Point3D(1, 1, 1), Point3D(2, 3, 4), Point3D(2, 2, 2)) Plane(Point3D(1, 1, 1), (-1, 2, -1)) >>> Plane((1, 1, 1), (2, 3, 4), (2, 2, 2)) Plane(Point3D(1, 1, 1), (-1, 2, -1)) >>> Plane(Point3D(1, 1, 1), normal_vector=(1,4,7)) Plane(Point3D(1, 1, 1), (1, 4, 7))
- angle_between(o)[源代码][源代码]¶
平面与其他几何实体之间的角度。
- 参数:
- LinearEntity3D, 平面。
- 返回:
- 角度弧度角
注释
此方法仅接受3D实体作为其参数,但如果你想计算2D实体与平面之间的角度,你应该首先通过投影到所需平面上将其转换为3D实体,然后继续计算角度。
示例
>>> from sympy import Point3D, Line3D, Plane >>> a = Plane(Point3D(1, 2, 2), normal_vector=(1, 2, 3)) >>> b = Line3D(Point3D(1, 3, 4), Point3D(2, 2, 2)) >>> a.angle_between(b) -asin(sqrt(21)/6)
- arbitrary_point(u=None, v=None)[源代码][源代码]¶
返回平面上的任意一点。如果给定两个参数,点在整个平面上变化。如果给定1个或没有参数,返回一个带有一个参数的点,当该参数从0变化到2*pi时,点在平面的p1点周围半径为1的圆上移动。
- 返回:
- Point3D
示例
>>> from sympy import Plane, Ray >>> from sympy.abc import u, v, t, r >>> p = Plane((1, 1, 1), normal_vector=(1, 0, 0)) >>> p.arbitrary_point(u, v) Point3D(1, u + 1, v + 1) >>> p.arbitrary_point(t) Point3D(1, cos(t) + 1, sin(t) + 1)
虽然任意 u 和 v 的值可以将点移动到平面上的任何位置,但单参数点可以用来构造一条射线,其任意点可以通过从 p.p1 的角度 t 和半径 r 来定位。
>>> Ray(p.p1, _).arbitrary_point(r) Point3D(1, r*cos(t) + 1, r*sin(t) + 1)
- static are_concurrent(*planes)[源代码][源代码]¶
一系列平面是否同时发生?
如果两个或更多平面的交线是同一条直线,则这些平面是相交的。
- 参数:
- planes: list
- 返回:
- 布尔值
示例
>>> from sympy import Plane, Point3D >>> a = Plane(Point3D(5, 0, 0), normal_vector=(1, -1, 1)) >>> b = Plane(Point3D(0, -2, 0), normal_vector=(3, 1, 1)) >>> c = Plane(Point3D(0, -1, 0), normal_vector=(5, -1, 9)) >>> Plane.are_concurrent(a, b) True >>> Plane.are_concurrent(a, b, c) False
- distance(o)[源代码][源代码]¶
平面与其他几何实体之间的距离。
- 参数:
- Point3D, LinearEntity3D, Plane.
- 返回:
- 距离
注释
此方法仅接受3D实体作为其参数,但如果您想计算2D实体与平面之间的距离,应首先通过投影到所需平面上将其转换为3D实体,然后继续计算距离。
示例
>>> from sympy import Point3D, Line3D, Plane >>> a = Plane(Point3D(1, 1, 1), normal_vector=(1, 1, 1)) >>> b = Point3D(1, 2, 3) >>> a.distance(b) sqrt(3) >>> c = Line3D(Point3D(2, 3, 1), Point3D(1, 2, 2)) >>> a.distance(c) 0
- equals(o)[源代码][源代码]¶
如果 self 和 o 是相同的数学实体,则返回 True。
示例
>>> from sympy import Plane, Point3D >>> a = Plane(Point3D(1, 2, 3), normal_vector=(1, 1, 1)) >>> b = Plane(Point3D(1, 2, 3), normal_vector=(2, 2, 2)) >>> c = Plane(Point3D(1, 2, 3), normal_vector=(-1, 4, 6)) >>> a.equals(a) True >>> a.equals(b) True >>> a.equals(c) False
- equation(x=None, y=None, z=None)[源代码][源代码]¶
平面的方程。
示例
>>> from sympy import Point3D, Plane >>> a = Plane(Point3D(1, 1, 2), Point3D(2, 4, 7), Point3D(3, 5, 1)) >>> a.equation() -23*x + 11*y - 2*z + 16 >>> a = Plane(Point3D(1, 4, 2), normal_vector=(6, 6, 6)) >>> a.equation() 6*x + 6*y + 6*z - 42
- intersection(o)[源代码][源代码]¶
与其他几何实体的交点。
- 参数:
- 点, 点3D, 线性实体, 线性实体3D, 平面
- 返回:
- 列表
示例
>>> from sympy import Point3D, Line3D, Plane >>> a = Plane(Point3D(1, 2, 3), normal_vector=(1, 1, 1)) >>> b = Point3D(1, 2, 3) >>> a.intersection(b) [Point3D(1, 2, 3)] >>> c = Line3D(Point3D(1, 4, 7), Point3D(2, 2, 2)) >>> a.intersection(c) [Point3D(2, 2, 2)] >>> d = Plane(Point3D(6, 0, 0), normal_vector=(2, -5, 3)) >>> e = Plane(Point3D(2, 0, 0), normal_vector=(3, 4, -3)) >>> d.intersection(e) [Line3D(Point3D(78/23, -24/23, 0), Point3D(147/23, 321/23, 23))]
- is_coplanar(o)[源代码][源代码]¶
如果 \(o\) 与自身共面,则返回 True,否则返回 False。
示例
>>> from sympy import Plane >>> o = (0, 0, 0) >>> p = Plane(o, (1, 1, 1)) >>> p2 = Plane(o, (2, 2, 2)) >>> p == p2 False >>> p.is_coplanar(p2) True
- is_parallel(l)[源代码][源代码]¶
给定的几何实体是否与平面平行?
- 参数:
- LinearEntity3D 或 Plane
- 返回:
- 布尔值
示例
>>> from sympy import Plane, Point3D >>> a = Plane(Point3D(1,4,6), normal_vector=(2, 4, 6)) >>> b = Plane(Point3D(3,1,3), normal_vector=(4, 8, 12)) >>> a.is_parallel(b) True
- is_perpendicular(l)[源代码][源代码]¶
给定的几何实体是否垂直于给定的平面?
- 参数:
- LinearEntity3D 或 Plane
- 返回:
- 布尔值
示例
>>> from sympy import Plane, Point3D >>> a = Plane(Point3D(1,4,6), normal_vector=(2, 4, 6)) >>> b = Plane(Point3D(2, 2, 2), normal_vector=(-1, 2, -1)) >>> a.is_perpendicular(b) True
- property normal_vector¶
给定平面的法向量。
示例
>>> from sympy import Point3D, Plane >>> a = Plane(Point3D(1, 1, 1), Point3D(2, 3, 4), Point3D(2, 2, 2)) >>> a.normal_vector (-1, 2, -1) >>> a = Plane(Point3D(1, 1, 1), normal_vector=(1, 4, 7)) >>> a.normal_vector (1, 4, 7)
- property p1¶
平面的唯一定义点。其他点可以通过 arbitrary_point 方法获得。
示例
>>> from sympy import Point3D, Plane >>> a = Plane(Point3D(1, 1, 1), Point3D(2, 3, 4), Point3D(2, 2, 2)) >>> a.p1 Point3D(1, 1, 1)
- parallel_plane(pt)[源代码][源代码]¶
与给定平面平行并通过点 pt 的平面。
- 参数:
- pt: Point3D
- 返回:
- 飞机
示例
>>> from sympy import Plane, Point3D >>> a = Plane(Point3D(1, 4, 6), normal_vector=(2, 4, 6)) >>> a.parallel_plane(Point3D(2, 3, 5)) Plane(Point3D(2, 3, 5), (2, 4, 6))
- parameter_value(other, u, v=None)[源代码][源代码]¶
返回与给定点对应的参数。
示例
>>> from sympy import pi, Plane >>> from sympy.abc import t, u, v >>> p = Plane((2, 0, 0), (0, 0, 1), (0, 1, 0))
默认情况下,返回的参数值定义了一个点,该点与平面的 p1 值相距 1 的距离,并与给定点在同一直线上:
>>> on_circle = p.arbitrary_point(t).subs(t, pi/4) >>> on_circle.distance(p.p1) 1 >>> p.parameter_value(on_circle, t) {t: pi/4}
将点移动到距离 p1 两倍远的地方不会改变参数值:
>>> off_circle = p.p1 + (on_circle - p.p1)*2 >>> off_circle.distance(p.p1) 2 >>> p.parameter_value(off_circle, t) {t: pi/4}
如果需要2值参数,请提供两个参数符号,将返回一个替换字典:
>>> p.parameter_value(on_circle, u, v) {u: sqrt(10)/10, v: sqrt(10)/30} >>> p.parameter_value(off_circle, u, v) {u: sqrt(10)/5, v: sqrt(10)/15}
- perpendicular_line(pt)[源代码][源代码]¶
一条垂直于给定平面的直线。
- 参数:
- pt: Point3D
- 返回:
- Line3D
示例
>>> from sympy import Plane, Point3D >>> a = Plane(Point3D(1,4,6), normal_vector=(2, 4, 6)) >>> a.perpendicular_line(Point3D(9, 8, 7)) Line3D(Point3D(9, 8, 7), Point3D(11, 12, 13))
- perpendicular_plane(*pts)[源代码][源代码]¶
返回通过给定点的垂直线。如果点之间的方向比与平面的法向量相同,则为了从无限可能的平面中选择一个,将在z轴(如果法向量已经平行于z轴,则为y轴)上选择第三个点。如果给定的点少于两个,它们将按以下方式提供:如果没有给定点,则pt1将是self.p1;如果没有给定第二个点,它将是通过pt1且平行于z轴的线上的一个点(如果法向量不是已经平行于z轴,否则是平行于y轴的线上的点)。
- 参数:
- pts: 0, 1 或 2 Point3D
- 返回:
- 飞机
示例
>>> from sympy import Plane, Point3D >>> a, b = Point3D(0, 0, 0), Point3D(0, 1, 0) >>> Z = (0, 0, 1) >>> p = Plane(a, normal_vector=Z) >>> p.perpendicular_plane(a, b) Plane(Point3D(0, 0, 0), (1, 0, 0))
- projection(pt)[源代码][源代码]¶
将给定点沿平面法线投影到平面上。
- 参数:
- 点或点3D
- 返回:
- Point3D
示例
>>> from sympy import Plane, Point3D >>> A = Plane(Point3D(1, 1, 2), normal_vector=(1, 1, 1))
投影是沿着法向量方向,而不是z轴,因此 (1, 1) 不会投影到平面 A 上的 (1, 1, 2)。
>>> b = Point3D(1, 1) >>> A.projection(b) Point3D(5/3, 5/3, 2/3) >>> _ in A True
但是点 (1, 1, 2) 在 XY 平面上投影为 (1, 1):
>>> XY = Plane((0, 0, 0), (0, 0, 1)) >>> XY.projection((1, 1, 2)) Point3D(1, 1, 0)
- projection_line(line)[源代码][源代码]¶
将给定的直线投影到包含该直线的法平面所通过的平面上。
- 参数:
- LinearEntity 或 LinearEntity3D
- 返回:
- Point3D, Line3D, Ray3D 或 Segment3D
注释
对于2D和3D线段(或射线)之间的交互,你应该使用这种方法将线段转换为3D。例如,为了找到2D和3D线段之间的交点,通过将其投影到所需平面上将2D线段转换为3D线段,然后继续寻找这些线段之间的交点。
示例
>>> from sympy import Plane, Line, Line3D, Point3D >>> a = Plane(Point3D(1, 1, 1), normal_vector=(1, 1, 1)) >>> b = Line(Point3D(1, 1), Point3D(2, 2)) >>> a.projection_line(b) Line3D(Point3D(4/3, 4/3, 1/3), Point3D(5/3, 5/3, -1/3)) >>> c = Line3D(Point3D(1, 1, 1), Point3D(2, 2, 2)) >>> a.projection_line(c) Point3D(1, 1, 1)
- random_point(seed=None)[源代码][源代码]¶
返回平面上的一个随机点。
- 返回:
- Point3D
示例
>>> from sympy import Plane >>> p = Plane((1, 0, 0), normal_vector=(0, 1, 0)) >>> r = p.random_point(seed=42) # seed value is optional >>> r.n(3) Point3D(2.29, 0, -1.35)
随机点可以移动到以 p1 为中心、半径为 1 的圆上:
>>> c = p.p1 + (r - p.p1).unit >>> c.distance(p.p1).equals(1) True