问题描述
|
我需要将一个矩形(一个CGRect结构为
{{float x,float y},{float w,float h}}
)拆分为多个较小的矩形/结构,以创建某种网格。我正在编写一个窗口布局管理器,我想要一个窗口预览选项。
我看到了类似的问题,但没有一个算法(涉及ceil
和floor
的算法)起作用。我也尝试过:
float widthOfNewRect = total.size.width / floor(sqrt(n));
float heightOfNewRect = total.size.height / ceil(sqrt(n));
有人可以提供使用我的C语言结构进行操作的示例吗?
解决方法
根据您的最后一条评论,我假设您要将矩形分成大小相等的n个子矩形,并且应该以行数和列数相等的方式对齐(最后一行可能不相等)。完全填满)。如果是这样,您可以使用ѭ4来计算列数(因为您显然已经猜到这是为了使行数不超过列数所需的最小列数)。然后,为容纳n个分布在numColumns列中的元素所需的行数将由ѭ5给出。
至于您显示的代码,它不起作用的原因是(您可能发现了自己)
floor(sqrt(n)) * ceil(sqrt(n))
可能小于n。例如,n = 7就是这种情况。我建议的计算是一种(间接)发现行数应为4还是8的更安全的方法。
, 看看这个。我知道它是用C ++而不是C编写的,但是您应该可以理解该算法。这段代码未经测试,但应该可以为您提供总体思路。
std:vector<CGRect> arrange(CGRect &original,int numWindows)
{
int columns = ceil(sqrt(numWindows));
int fullRows = numWindows / columns;
int orphans = numWindows % columns; // how many \'odd-sized\' ones on our bottom row.
int width = original.width/ columns;
int height = original.height / (orphans == 0 ? fullRows : (fullRows+1)); // reduce height if there are orphans
std:vector<CGRect> output;
//Calculate rectangles
for (int y = 0; y < fullRows; ++y)
for (int x = 0; x < columns; ++x)
output.push_back(CGRect(x * width,y * height,width,height));
if (orphans > 0)
{
int orphanWidth = original.width / orphans);
for (int x = 0; y < orphans; ++x)
output.push_back(CGRect(x * orphanWidth,orphanWidth,height));
}
return output;
}
, 您想找到最接近sqrt(n)的n因子。
factorMax = floor(sqrt(n));
factorY = 1;
for (x = factorMax; x > 0; x--) {
if ( (n % x) == 0 ) {
factorY = x;
break;
}
factorX = floor(n/factorX)
这应该使行和列的分布均匀。如果选择素数,它将失败,因为最高因数CGRect rect = myView.bounds; CGRect slice; CGRect remainder; /*enum CGRectEdge { CGRectMinXEdge,CGRectMinYEdge,CGRectMaxXEdge,CGRectMaxYEdge };*/ //CGRectDivide(<#CGRect rect#>,<#CGRect *slice#>,<#CGRect *remainder#>,<#CGFloat amount#>,<#CGRectEdge edge#>) CGRectDivide(rect,&slice,&remainder,rect.size.width/2,CGRectMinXEdge); LOG_DBUG(@\"%@\",NSStringFromCGRect(rect)); LOG_DBUG(@\"%@\",NSStringFromCGRect(slice)); LOG_DBUG(@\"%@\",NSStringFromCGRect(remainder));