如何找到给定点的最近平方

How to find the closest square of the given point

本文关键字:最近 何找      更新时间:2023-10-16

我有一个二维正方形数组(正方形(,每个正方形有 50 个单位的长度和 x、y 坐标。正方形之间的距离为 5 个单位。x、y 坐标是正方形的左下角。现在,给定任何点(x,y 坐标(,我如何找到最接近该点的正方形。

square **sq = new square*[10];
for(int i=0;i<10;++i){
sq[i]=new square[10];
}
int m=0, n=0;
for(int i=0;i<10;++i){
m=0;
for(int j=0;j<10;++j){
sq[i][j].setCoOrdinates(m,n);
m+=55;
}
n+=55;
}

给定一个点 (x, y(,我怎样才能找到最接近该点的平方的索引 (i, j(。

让我们严格定义从正方形到点的距离的定义:"从点 (x,y( 到矩形内某个点的所有长度的最小值"。 这为定义矩形的距离提供了一些明确的规则。对于任何矩形,如果点 (x,y( 位于矩形边的正上方、下方、左侧或右侧,则到矩形的最小距离是垂直或水平绘制的穿过该点的直线。例如,如果你的点是(40,90(,矩形的左下角是(0,0((它是一个50x50的正方形(,你可以画一条垂直线穿过你的点,距离是min(90-(0+50(,90-0(

如果点不在正方形边的正上方、下方、左侧或右侧,则最近的距离是四个角中最近的一个。您可以简单地将所有距离的最小值取到四个角,这可以通过使用距离公式找到。

只需将此逻辑应用于数组中的每个方块,您就可以开始了!时间 O(NM(,其中 n 是正方形的行数,M 是正方形的列数。换句话说,O(您拥有的平方数(。空间 O(1(。

让我们从更简单的问题开始:所有矩形都是 55 个单位宽,即它们之间没有空白空间......

最好的容器是你不需要的容器。数组中正方形的ij索引及其mn坐标之间存在简单的关系:

const int distance = 55;
int m(int i) { return i*distance; }
int n(int j) { return m(j); }

由于关系是线性的,因此您可以反转它:

int i(int m) { return m / distance; }
int j(int n) { return i(n); }

在这里使用整数算术很好,因为我们得到的结果与使用浮点数然后向下舍入的结果相同。

这已经是更简单问题的完整解决方案。给定坐标mn,最接近的正方形位于索引i(m),j(n)处。

现在让我们介绍一下差距:

cosnt int width = 50;
const int gap = 5;

现在我们必须区分两种可能性:给定的坐标在正方形内部或外部。当它在外面时,有两个候选人用于最阴暗的广场。

int i_with_gap(int m) {
int i = m / distance;
// point is inside the square?
if (m % distance <= width) return i;
// point is closer to square at index i?
if (m % distance <= width+ gap/2.0) return i;
// otherwise i+1 is closer
return i+1;
}