将矩形分割成相等大小的矩形?

| 我需要将一个矩形(一个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 , y * height, 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));
    

要回复问题请先登录注册