【问题标题】:How to find the closest square of the given point如何找到给定点的最近正方形
【发布时间】:2020-06-04 15:24:32
【问题描述】:

我有一个二维正方形数组(正方形),每个正方形有 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)。

【问题讨论】:

  • 我建议使用std::array(因为在编译时知道大小)或std::vector(如果在运行时知道大小,或者对于堆栈来说太大)而不是new[]跨度>
  • 你即将成为three star programmer
  • 您正试图在具有特定要求的数组中查找元素,这与数组无关?顺便说一句,我认为您不需要任何容器,只需要 %
  • @letsShareKnowlede 我的评论不是关于如何解决您的问题,否则我会将其发布为答案,而不是评论。我的评论是关于良好的 C++ 编程实践。
  • 我仍然没有得到你必须解决的真正任务。如果是算法和研究一组随机正方形的问题,那就是问题,否则,如果是数字游戏,听起来像“I = (x+3)/55”和“j = (y+3) /55" 就是你要找的...

标签: c++ arrays algorithm oop pointers


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    让我们从更简单的问题开始:所有矩形都是 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-28
      • 2021-12-24
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      相关资源
      最近更新 更多