在矩形外部查找网格

时间:2011-11-16 00:31:42

标签: c++ algorithm

我有一个“无限”点网格,列之间的间距为dx,行之间的间距为dy。我有一个点是网格和矩形中的一个点。我需要得到矩形之外的第一行/列 像:

*    *    *    *    *    *    *    *    .    .    .
   _____________________________
* |  .    .    .    .    .    . |  *    .    0    .
  |                             |
* |  .    .    .    .    .    . |  *    .    .    .
  |                             |
* |  .    .    .    .    .    . |  *    .    .    .
  |_____________________________|
*    *    *    *    *    *    *    *    .    .    .

.    .    .    .    .    .    .    .    .    .    .

我需要使用矩形的坐标,*的坐标以及行/列的间距来获取0。一切都是浮点值。我尝试使用模数做到这一点,但它真的搞砸了并且很复杂,我宁愿不发布它 我怎么能用c ++做到这一点? (我可以而且更喜欢使用c ++ 11) 我需要它迭代它以获得矩形内的所有点(因为我在点之间绘制线条,我也需要矩形之外的点,我将线条剪切到矩形)。

2 个答案:

答案 0 :(得分:1)

如果左下角坐标为(x,y),则可以先计算

来重新定位它们
double xb = x / dx;
double yb = y / dy;

然后你到达这个重新定位的坐标系中的网格点,只需要占据一席之地:

xb = floor(xb);
yb = floor(yb);

最后,您将映射回原始坐标:

xb = xb * dx;
yb = yb * dy;

现在这是原始坐标系中位于矩形左下角之外的左下网格点。

如果这没有意义,请考虑在dx = 1,dy = 1的特殊情况下,网格点与整数对应,您可以通过floor()和ceil()获得“to”网格点。当dx和dy与1不同时,首先除以它们以进入一个重新定位的坐标系,您可以使用floor()和ceil()来到格点,然后重新映射。

答案 1 :(得分:0)

计算大于Y的X的最低倍数(假设X和Y为正int s:适当时施放):

((Y / X) + 1) * X

如果您在开始之前添加了Oli关于调整原点的建议,则可以消除负面问题。

最后,您可以将上面的计算扩展为允许通过良好放置的强制转换浮点数:

((int)(Y / X) + 1) * X

现在返回浮点X的第一个倍数大于浮点Y。