primitives.geometry¶
geometry ¶
几何基础模块 (geometry)¶
此模块提供了用于处理几何图形和坐标系统的基础类,包括点、向量、矩形等几何对象的表示和操作。
主要功能¶
- 坐标系统:提供二维、三维、四维坐标的表示
- 点操作:支持整数和浮点数坐标点的各种运算
- 矩形操作:提供矩形的创建、变换、相交检测等功能
- 向量运算:支持向量的加减乘除、距离计算、单位化等操作
- 类型安全:使用泛型和类型守卫确保类型安全
核心类¶
Vector2D- 二维向量,支持泛型Vector3D- 三维向量,适用于颜色和空间坐标Vector4D- 四维向量,适用于 RGBA 等场景Point- 整数坐标点,适用于像素定位PointF- 浮点数坐标点,适用于精确计算Rect- 矩形类,提供丰富的几何操作
使用示例¶
# 坐标点操作
p1 = Point(100, 200, name="起始点")
p2 = PointF(150.5, 250.8)
distance = p1.distance_to(p2)
# 矩形操作
rect = Rect(10, 20, 100, 50, name="按钮区域")
center = rect.center
enlarged = rect.inflate(5, 5)
# 向量运算
v1 = Vector2D(10, 20)
v2 = Vector2D(5, 8)
result = v1 + v2
注意事项¶
- 所有坐标系统遵循屏幕坐标系,原点在左上角
- 矩形操作使用半开区间规则:[x1, x2) x [y1, y2)
- 点和向量的运算会根据输入类型自动选择返回类型
类:
| 名称 | 描述 |
|---|---|
Vector2D |
Vector2D¶ |
Vector3D |
Vector3D¶ |
Vector4D |
Vector4D¶ |
PointF |
PointF¶ |
Point |
Point¶ |
Rect |
Rect¶ |
函数:
| 名称 | 描述 |
|---|---|
unify_point |
将点或元组统一转换为 |
unify_pointf |
将点或元组统一转换为 |
unify_any_point |
将点或元组统一转换为 |
unify_rect |
将矩形或元组 (x, y, w, h) 统一转换为 |
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
RectTuple |
矩形。(x, y, w, h) |
|
PointTuple |
点。(x, y) |
|
PointFTuple |
浮点数点。(x, y) |
|
Size |
尺寸。相当于 Vector2D[int] |
|
SizeTuple |
尺寸。(width, height) |
|
SizeLike |
尺寸类型,可以是 Size 对象或尺寸元组。 |
|
Number |
数字类型,可以是整数或浮点数。 |
|
AnyPoint |
任意 Point 对象,包括 Point 与 PointF。 |
|
AnyPointTuple |
任意 Point 元组,包括 tuple[int, int] 与 tuple[float, float]。 |
|
AnyPointLike |
任意类似于 Point 的对象,包括 Point、PointF、tuple[int, int]、tuple[float, float]。 |
|
RectLike |
任意类似于 Rect 的对象,包括 Rect、tuple[int, int, int, int]。 |
AnyPointTuple
module-attribute
¶
AnyPointTuple = Union[PointTuple, PointFTuple]
任意 Point 元组,包括 tuple[int, int] 与 tuple[float, float]。
AnyPointLike
module-attribute
¶
AnyPointLike = Union[AnyPoint, AnyPointTuple]
任意类似于 Point 的对象,包括 Point、PointF、tuple[int, int]、tuple[float, float]。
RectLike
module-attribute
¶
RectLike = Union[Rect, RectTuple]
任意类似于 Rect 的对象,包括 Rect、tuple[int, int, int, int]。
Vector2D ¶
Bases: Generic[T]
Vector2D¶
表示一个二维向量。此类支持泛型,可用于表示不同类型的坐标(如整数、浮点数等)。
例¶
# 创建二维坐标
v = Vector2D(10, 20, name="位置")
print(v.x, v.y) # 10, 20
# 使用索引访问
print(v[0], v[1]) # 10, 20
# 坐标计算
v2 = Vector2D(5, 8)
print(f"坐标距离: {math.sqrt((v.x - v2.x)**2 + (v.y - v2.y)**2):.2f}")
# 支持命名坐标
center = Vector2D(640, 360, name="屏幕中心")
print(center) # Point<"屏幕中心" at (640, 360)>
方法:
| 名称 | 描述 |
|---|---|
as_tuple |
Return coordinates as a tuple of ints: (x, y). |
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
name |
str | None
|
坐标的名称。 |
Vector3D ¶
Bases: Generic[T]
Vector3D¶
表示一个三维向量。
例¶
# 创建三维坐标
v3 = Vector3D(100, 200, 50, name="3D点")
print(v3.x, v3.y, v3.z) # 100, 200, 50
# 使用索引访问
print(v3[0], v3[1], v3[2]) # 100, 200, 50
# 解构
x, y, z = v3.xyz # (100, 200, 50)
x, y = v3.xy # (100, 200)
# 颜色值应用
rgb = Vector3D(255, 128, 64, name="颜色")
print(f"RGB: {rgb.rgb if hasattr(v3, 'rgb') else '未定义'}")
方法:
| 名称 | 描述 |
|---|---|
as_tuple |
Return coordinates as a tuple of ints: (x, y, z). |
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
name |
str | None
|
坐标的名称。 |
xyz |
tuple[T, T, T]
|
三元组 (x, y, z)。OpenCV 格式的坐标。 |
xy |
tuple[T, T]
|
二元组 (x, y)。OpenCV 格式的坐标。 |
Vector4D ¶
Bases: Generic[T]
Vector4D¶
此类用于表示四维坐标或向量,通常用于颜色空间(如RGBA)等场景。
例¶
# 创建四维坐标
v4 = Vector4D(100, 200, 150, 255, name="颜色值")
print(f"RGBA: {v4.x}, {v4.y}, {v4.z}, {v4.w}") # 100, 200, 150, 255
# 使用索引访问
print(v4[0], v4[1], v4[2], v4[3]) # 100, 200, 150, 255
# 在颜色空间中使用
color = Vector4D(255, 0, 0, 128, name="半透明红色")
print(f"颜色: {color}")
# 四维向量运算
v4_2 = Vector4D(50, 50, 50, 100)
# 注意:Vector4D 未定义运算,但可用于数据存储
方法:
| 名称 | 描述 |
|---|---|
as_tuple |
Return coordinates as a tuple of ints: (x, y, z, w). |
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
name |
str | None
|
坐标的名称。 |
PointF ¶
Bases: _BasePoint[float]
PointF¶
表示浮点数坐标点。
例¶
# 创建浮点数坐标点
p1 = PointF(10.5, 20.7, name="精确位置")
p2 = PointF(5.2, 8.9)
# 距离计算
distance = p1.distance_to(p2) # 计算到另一点的距离
print(f"距离: {distance:.2f}")
# 向量运算
result = p1 + p2 # 坐标相加
scaled = p1 * 2 # 坐标缩放
# 单位向量
unit = p1.normalized() # 转换为单位向量
# 坐标偏移
moved = p1.offset(5.0, 10.0) # 偏移坐标
方法:
| 名称 | 描述 |
|---|---|
as_tuple |
Return coordinates as a tuple of ints: (x, y). |
distance_to |
计算到另一个点的距离。 |
__eq__ |
比较两个点是否相等。 |
__lt__ |
小于比较,按 (x, y) 的字典序进行比较。 |
__le__ |
小于等于比较,按 (x, y) 的字典序比较。 |
__gt__ |
大于比较,按 (x, y) 的字典序比较。 |
__ge__ |
大于等于比较,按 (x, y) 的字典序比较。 |
normalized |
返回一个新的、方向相同但长度为 1 的 |
offset |
偏移坐标。 |
__add__ |
与另一个点或元组相加。 |
__sub__ |
与另一个点或元组相减。 |
__mul__ |
与标量相乘(缩放)。 |
__truediv__ |
与标量相除(缩放)。总是返回一个 PointF 对象。 |
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
name |
str | None
|
坐标的名称。 |
xy |
NumberTuple2D
|
二元组 (x, y)。 |
length |
float
|
将点视为从原点出发的向量,其长度(模)。 |
distance_to ¶
distance_to(other: AnyPoint | AnyPointTuple) -> float
__eq__ ¶
__eq__(value: object) -> bool
__lt__ ¶
__lt__(other: AnyPoint | AnyPointTuple) -> bool
小于比较,按 (x, y) 的字典序进行比较。
支持 Point / PointF 或长度为2的元组/列表。
offset ¶
offset(dx: int | float, dy: int | float) -> AnyPoint
__add__ ¶
__add__(other: Point | PointTuple) -> Point
__add__(other: PointF | PointFTuple) -> PointF
__add__(other: AnyPoint | AnyPointTuple) -> PointF
__add__(other: AnyPoint | AnyPointTuple) -> AnyPoint
与另一个点或元组相加。
如果任一操作数为浮点数,则结果提升为 PointF。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
AnyPoint | AnyPointTuple
|
另一个 Point/PointF 对象或元组。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
AnyPoint
|
相加后的新 Point 或 PointF 对象。 |
__sub__ ¶
__sub__(other: Point | PointTuple) -> Point
__sub__(other: PointF | PointFTuple) -> PointF
__sub__(other: AnyPoint | AnyPointTuple) -> PointF
__sub__(other: AnyPoint | AnyPointTuple) -> AnyPoint
与另一个点或元组相减。
如果任一操作数为浮点数,则结果提升为 PointF。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
AnyPoint | AnyPointTuple
|
另一个 Point/PointF 对象或元组。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
AnyPoint
|
相减后的新 Point 或 PointF 对象。 |
__mul__ ¶
__mul__(scalar: int) -> Point
__mul__(scalar: float) -> PointF
__mul__(scalar: int | float) -> AnyPoint
Point ¶
Bases: _BasePoint[int]
Point¶
表示整数坐标点。
例¶
# 创建整数坐标点
pixel = Point(1920, 1080, name="屏幕分辨率")
button = Point(100, 200, name="按钮位置")
# 像素定位操作
center = Point(640, 360)
offset = center.offset(10, -5) # 向右移动10像素,向下移动5像素
# 点与点的运算
distance = center.distance_to(button)
relative_pos = button - center # 相对位置
# 检查点是否相等
if center == Point(640, 360):
print("找到了中心点")
# 与浮点数运算时会自动转换为PointF
precise = center + (5.5, 3.2) # 结果为PointF类型
方法:
| 名称 | 描述 |
|---|---|
as_tuple |
Return coordinates as a tuple of ints: (x, y). |
distance_to |
计算到另一个点的距离。 |
__eq__ |
比较两个点是否相等。 |
__lt__ |
小于比较,按 (x, y) 的字典序进行比较。 |
__le__ |
小于等于比较,按 (x, y) 的字典序比较。 |
__gt__ |
大于比较,按 (x, y) 的字典序比较。 |
__ge__ |
大于等于比较,按 (x, y) 的字典序比较。 |
normalized |
返回一个新的、方向相同但长度为 1 的 |
offset |
偏移坐标。 |
__add__ |
与另一个点或元组相加。 |
__sub__ |
与另一个点或元组相减。 |
__mul__ |
与标量相乘(缩放)。 |
__truediv__ |
与标量相除(缩放)。总是返回一个 PointF 对象。 |
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
name |
str | None
|
坐标的名称。 |
xy |
NumberTuple2D
|
二元组 (x, y)。 |
length |
float
|
将点视为从原点出发的向量,其长度(模)。 |
distance_to ¶
distance_to(other: AnyPoint | AnyPointTuple) -> float
__eq__ ¶
__eq__(value: object) -> bool
__lt__ ¶
__lt__(other: AnyPoint | AnyPointTuple) -> bool
小于比较,按 (x, y) 的字典序进行比较。
支持 Point / PointF 或长度为2的元组/列表。
offset ¶
offset(dx: int | float, dy: int | float) -> AnyPoint
__add__ ¶
__add__(other: Point | PointTuple) -> Point
__add__(other: PointF | PointFTuple) -> PointF
__add__(other: AnyPoint | AnyPointTuple) -> PointF
__add__(other: AnyPoint | AnyPointTuple) -> AnyPoint
与另一个点或元组相加。
如果任一操作数为浮点数,则结果提升为 PointF。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
AnyPoint | AnyPointTuple
|
另一个 Point/PointF 对象或元组。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
AnyPoint
|
相加后的新 Point 或 PointF 对象。 |
__sub__ ¶
__sub__(other: Point | PointTuple) -> Point
__sub__(other: PointF | PointFTuple) -> PointF
__sub__(other: AnyPoint | AnyPointTuple) -> PointF
__sub__(other: AnyPoint | AnyPointTuple) -> AnyPoint
与另一个点或元组相减。
如果任一操作数为浮点数,则结果提升为 PointF。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
AnyPoint | AnyPointTuple
|
另一个 Point/PointF 对象或元组。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
AnyPoint
|
相减后的新 Point 或 PointF 对象。 |
__mul__ ¶
__mul__(scalar: int) -> Point
__mul__(scalar: float) -> PointF
__mul__(scalar: int | float) -> AnyPoint
Rect ¶
Rect¶
表示一个矩形区域,支持多种坐标格式和几何操作。
例¶
# 创建矩形
rect = Rect(10, 20, 100, 50, name="按钮区域")
rect2 = Rect(xywh=(10, 20, 100, 50))
# 从两点创建矩形
rect3 = Rect.from_xyxy(10, 20, 110, 70)
# 获取矩形属性
print(rect.center) # 中心点
print(rect.size) # (100, 50)
print(rect.top_left) # 左上角点,其他三个角落同理
# 矩形操作
moved = rect.move(10, 10) # 原地移动
copied = rect.moved(5, 15) # 移动后的新矩形
enlarged = rect.inflate(5, 5) # 原地扩大
# 几何计算
if rect.contains_point(Point(50, 40)):
print("点在矩形内")
if rect.intersects_with(other_rect):
print("两个矩形相交")
union = rect.union_of(other_rect) # 并集
intersection = rect.intersection_of(other_rect) # 交集
方法:
| 名称 | 描述 |
|---|---|
__init__ |
从给定的坐标信息创建矩形。 |
from_xyxy |
从 (x1, y1, x2, y2) 创建矩形。 |
copy |
返回一个与当前对象完全相同的新 |
move |
原地移动矩形。 |
moved |
返回一个移动后的新 |
inflate |
原地缩放矩形(中心点不变)。 |
inflated |
返回一个缩放后的新 |
normalize |
原地修正矩形,确保 |
normalized |
返回一个修正后的新 |
contains_point |
检查一个点是否在此矩形内部。 |
contains_rect |
检查此矩形是否完全包含另一个矩形。 |
intersects_with |
检查此矩形是否与另一个矩形相交。 |
union_of |
返回一个能同时包含两个矩形的新 |
intersection_of |
返回两个矩形相交区域的新 |
is_empty |
如果矩形的 |
__contains__ |
判断点或矩形是否被此矩形包含。 |
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
x1 |
矩形左上角的 X 坐标。 |
|
y1 |
矩形左上角的 Y 坐标。 |
|
w |
矩形的宽度。 |
|
h |
矩形的高度。 |
|
name |
str | None
|
矩形的名称。 |
x2 |
int
|
矩形右下角的 X 坐标。 |
y2 |
int
|
矩形右下角的 Y 坐标。 |
xywh |
RectTuple
|
四元组 (x1, y1, w, h)。OpenCV 格式的坐标。 |
xyxy |
RectTuple
|
四元组 (x1, y1, x2, y2)。 |
top_left |
Point
|
矩形的左上角点。 |
bottom_right |
Point
|
矩形的右下角点。 |
left_bottom |
Point
|
矩形的左下角点。 |
right_top |
Point
|
矩形的右上角点。 |
center |
Point
|
矩形的中心点。 |
center_x |
int
|
中心点的 x 坐标。 |
center_y |
int
|
中心点的 y 坐标。 |
middle_top |
Point
|
矩形顶部边的中点。 |
middle_bottom |
Point
|
矩形底部边的中点。 |
middle_left |
Point
|
矩形左侧边的中点。 |
middle_right |
Point
|
矩形右侧边的中点。 |
size |
tuple[int, int]
|
一个 |
size
property
writable
¶
size: tuple[int, int]
__init__ ¶
__init__(x: int | None = None, y: int | None = None, w: int | None = None, h: int | None = None, *, xywh: RectTuple | None = None, name: str | None = None)
from_xyxy
classmethod
¶
from_xyxy(x1: int, y1: int, x2: int, y2: int) -> Rect
move ¶
move(dx: int, dy: int) -> Rect
moved ¶
moved(dx: int, dy: int) -> Rect
inflate ¶
inflate(dx: int, dy: int) -> Rect
inflated ¶
inflated(dx: int, dy: int) -> Rect
normalize ¶
normalize() -> Rect
normalized ¶
normalized() -> Rect
contains_point ¶
contains_point(point: AnyPoint | PointTuple | PointFTuple) -> bool
检查一个点是否在此矩形内部。
.. note:: 对于边界值,左边界与上边界包含,而右边界与下边界不包含。
例如 `Rect(0, 0, 10, 10)` 包含 `Point(0, 0)`,但不包含 `Point(10, 10)`。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
AnyPoint | PointTuple | PointFTuple
|
要检查的点。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
bool
|
如果点在矩形内,则返回 |
contains_rect ¶
contains_rect(other_rect: Rect) -> bool
intersects_with ¶
intersects_with(other_rect: Rect) -> bool
union_of ¶
union_of(other_rect: Rect) -> Rect
intersection_of ¶
intersection_of(other_rect: Rect) -> Rect | None
__contains__ ¶
__contains__(obj: Point | PointTuple | PointF | PointFTuple) -> bool
__contains__(obj: Rect) -> bool
__contains__(obj: AnyPoint | PointTuple | PointFTuple | Rect) -> bool
判断点或矩形是否被此矩形包含。
- 如果传入的是点或点元组,等价于
Rect.contains_point。 - 如果传入的是
Rect,则判断整个矩形是否被包含(完全包含)。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
AnyPoint | PointTuple | PointFTuple | Rect
|
要检查的点或矩形。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
bool
|
如果被包含则返回 |
unify_point ¶
unify_point(point: PointLike) -> Point
unify_pointf ¶
unify_pointf(point: PointLike) -> PointF
unify_any_point ¶
unify_any_point(point: AnyPointLike) -> Point | PointF
将点或元组统一转换为 Point 或 PointF 对象。
如果输入已是 Point 或 PointF 对象,直接返回。
如果输入是元组,根据其数值类型决定返回类型:
- 若所有坐标为整数,返回 Point
- 若有任何坐标为浮点数,返回 PointF
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
AnyPointLike
|
要转换的点或元组。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
Point | PointF
|
转换后的 |
引发:
| 类型 | 描述 |
|---|---|
TypeError
|
如果输入类型不正确则抛出。 |