13

長方形(CGRect構造{{float x,float y},{float w,float h}})をいくつかの小さな長方形/構造に分割して、ある種のグリッドを作成する必要があります。ウィンドウレイアウトマネージャーを作成していますが、ウィンドウプレビューオプションが必要です。

ここに画像の説明を入力してください

私は同様の質問を見ましたが、私が見たアルゴリズム(とを含むもの)はどれも機能しませんでした。私も試しました:ceilfloor

float widthOfNewRect = total.size.width / floor(sqrt(n));
float heightOfNewRect = total.size.height / ceil(sqrt(n));

誰かがCの私の構造体でそれを行う例を提供できますか?

4

4 に答える 4

12

あなたの最後のコメントに基づいて、あなたはあなたの長方形を同じサイズのn個のサブ長方形に分割したいと思います、そしてそれらは行数と列数が等しくなるように整列されるべきであると思います(最後の行はおそらくそうではありません)完全に満たされている)。もしそうなら、あなたはceil(sqrt(n))の数を計算するために使うことができます(これは明らかにあなたが推測したように、列より多くの行を持たないために必要な列の最小量だからです)。次に、 numColumns列に分散されたn個の要素に対応するために必要な行数は、で与えられます。ceil(n / (double)numColumns)

あなたが示したコードに関しては:それが機能しない理由は(おそらくあなた自身が発見したように)nfloor(sqrt(n)) * ceil(sqrt(n))よりも小さいかもしれないからです。たとえば、これはn=7の場合です。私が提案する計算は、行数がであるか、であるかを(間接的に)発見するためのより安全な方法です。ceil(sqrt(n))floor(sqrt(n))

于 2011-05-31T15:47:38.367 に答える
4

これを見てください。私はそれが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;
}
于 2011-05-31T16:21:12.690 に答える
0

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)

これにより、行と列が均等に分散されます。最高の因数<sqrt(n)は1になるため、素数を選択すると失敗します。

于 2011-05-31T15:59:15.733 に答える
0

これを試して:

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));
于 2013-08-16T13:37:44.227 に答える