一个矩形可以由代表对角的两个点来定义,例如:A(x,y) 和 B(x,y)。如果您要测试一个点 C(x,y) 以查看它是否在矩形内,则:
IF( (Cx BETWEEN Ax AND Bx) AND (Cy BETWEEN Ay AND By) ) THEN
point C is in the rectangle defined by points A and B
ELSE
nope
ENDIF
一个圆可以由一个点C(x,y)和一个半径R来定义。如果圆心到点P(x,y)的距离D小于半径R,那么它在里面圈子:
你当然记得勾股定理,对吧?
C² = A² + B² SO C = SQRT(A² + B²)
所以:
D = SQRT( ABS(Cx - Px)² + ABS(Cy - Py)²)
IF( D <= R ) THEN
point P is inside the circle with center C and radius R
ELSE
nope
ENDIF
编辑:
检查一个点是否在多边形内的算法比我希望在 SQL 查询或存储过程中编写的算法复杂一些,但这是完全可能的。值得注意的是,它以恒定时间运行并且非常轻量级。 [对于多边形中的每个点大约需要 6 个算术运算,并且可能需要 2 或 3 个逻辑运算]
要减少所需的数字计算,您只需编写您的选择以在粗略的边界框中获取点,然后再进一步处理它们:
WHERE
x BETWEEN MIN(x1,x2,x3,x4) AND MAX(x1,x2,x3,x4)
AND
y BETWEEN MIN(y1,y2,y3,y4) AND MAX(y1,y2,y3,y4)
假设包含 x 和 y 值的列被编入索引,这可能比简单地进行数学运算使用更少的 CPU 周期,但这是值得商榷的,我倾向于称之为洗牌。
至于圈子,你不可能比这个更有效率了
WHERE
SQRT( POW(ABS($Cx - x),2) + POW(ABS($Cy - y),2) ) < $radius
您太在意这些计算的感知成本,只需编写代码并使其工作即可。这不是执行这种琐碎优化的阶段。