我有一个“无限”点网格,列之间的间距为dx
,行之间的间距为dy
。我有一个点是网格和矩形中的一个点。我需要得到矩形之外的第一行/列
像:
* * * * * * * * . . .
_____________________________
* | . . . . . . | * . 0 .
| |
* | . . . . . . | * . . .
| |
* | . . . . . . | * . . .
|_____________________________|
* * * * * * * * . . .
. . . . . . . . . . .
我需要使用矩形的坐标,*
的坐标以及行/列的间距来获取0
。一切都是浮点值。我尝试使用模数做到这一点,但它真的搞砸了并且很复杂,我宁愿不发布它
我怎么能用c ++做到这一点? (我可以而且更喜欢使用c ++ 11)
我需要它迭代它以获得矩形内的所有点(因为我在点之间绘制线条,我也需要矩形之外的点,我将线条剪切到矩形)。
答案 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。