如何找到给定点的最近平方
How to find the closest square of the given point
我有一个二维正方形数组(正方形(,每个正方形有 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 个单位宽,即它们之间没有空白空间......
最好的容器是你不需要的容器。数组中正方形的i
和j
索引及其m
和n
坐标之间存在简单的关系:
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); }
在这里使用整数算术很好,因为我们得到的结果与使用浮点数然后向下舍入的结果相同。
这已经是更简单问题的完整解决方案。给定坐标m
和n
,最接近的正方形位于索引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;
}
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何找出GDB的SIGTRAP核心转储的根本原因
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 找不到QtResource文件中的文件
- Python中的for循环与C++有何不同
- VC++本机单元测试,找不到调试符号
- RegGetValue在当前用户下找不到名称
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- c++找不到具有相同哈希的无序集合元素
- 查找最近配对时的OpenMP竞赛条件
- 找不到以下加速库:boost_fiber
- 找不到 FLTK(缺少:FLTK_INCLUDE_DIR)
- 设置 Visual Studio for MPI: 找不到标识符错误
- "assimp/config.h"找不到,但它在文件夹中
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 在最近的K个单词中找出最频繁的单词