
Go 标准库 image 包提供了简洁的 Point.In(Rect) 方法,可直接判断二维点是否严格位于图像矩形内部(左闭右开、下闭上开),无需手动比较坐标边界。
go 标准库 `image` 包提供了简洁的 `point.in(rect)` 方法,可直接判断二维点是否严格位于图像矩形内部(左闭右开、下闭上开),无需手动比较坐标边界。
在 Go 图像处理中,image.Point 和 image.Rectangle 是常用的基础类型。image.Rectangle 实际上由两个 Point 构成:Min(左上角)和 Max(右下角),其定义遵循左闭右开、下闭上开的半开区间语义(即包含 Min,但不包含 Max)。这意味着矩形覆盖的像素区域为 [Min.X, Max.X) × [Min.Y, Max.Y)。
虽然 Rectangle 类型本身未提供 Contains() 方法,但标准库早已将该逻辑封装在 Point 类型中——通过 Point.In(Rect) 方法即可完成判断,语义清晰、代码简洁、零额外开销。
✅ 正确用法示例
package main
import (
"fmt"
"image"
)
func main() {
r := image.Rect(0, 0, 10, 10) // [0,10) × [0,10),共 10×10 像素
p1 := image.Point{5, 5}
p2 := image.Point{10, 5} // X=10 不在范围内(右边界不包含)
p3 := image.Point{0, 0} // X=0、Y=0 均在范围内(左/上边界包含)
fmt.Println(p1.In(r)) // true
fmt.Println(p2.In(r)) // false
fmt.Println(p3.In(r)) // true
}⚠️ 注意事项
- Point.In(r) 判断的是数学意义上的点是否落在矩形所表示的像素区域内部,完全等价于手动写 r.Min.X <= p.X && p.X < r.Max.X && r.Min.Y <= p.Y && p.Y < r.Max.Y,但更安全、不易出错;
- Rectangle 的 Min 不一定小于 Max:若构造时坐标顺序错误(如 image.Rect(10,10,0,0)),会得到空矩形(r.Empty() 返回 true),此时 p.In(r) 恒为 false,符合预期;
- 所有坐标均为整数,适用于像素级精确判断,不支持浮点坐标或抗锯齿场景;
- 该方法不进行任何边界归一化,调用前建议通过 r.Canon() 获取规范矩形(确保 Min.X ≤ Max.X 且 Min.Y ≤ Max.Y),尤其在矩形来自用户输入或计算结果时。
✅ 总结
抛弃冗长的手动边界比较——直接使用 p.In(r) 是 Go 标准库推荐、高效且语义明确的标准做法。它不仅提升代码可读性与可维护性,也避免了因坐标方向或区间理解偏差导致的常见逻辑错误。在图像裁剪、碰撞检测、UI 布局等场景中,应作为首选判断方式。










