2009-07-18 14 views
4

この問題は数百万回も解決されているに違いありませんが、Googleは私の友人ではありませんでした。N箱の行の長方形を計算する方法長さLをSのスペースで埋める

一定の長さを埋めるように、一連のボックスをプログラム的に配置し、特定の距離だけ離れて配置する必要があります。

これは私が欲しいものです:

alt text http://img194.imageshack.us/img194/3506/spacingiget.png

を私はコアグラフィックスを使用してObjective-Cで働いているので、私は:ここ

alt text http://img257.imageshack.us/img257/3362/spacingiwant.png

は私が取得していますものです画像を描画したりドロップしたりできる一連のRectが必要です。私の素朴な試みは、特定の間隔を持つボックスのセットを描画しますが、最後にスペースを残します。ここで

のdrawRectである私のコードです:メソッド

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGFloat barStartX = 96; 
CGFloat barStartY = 64.0; 

CGFloat barWidth = 16; 
CGFloat barHeight = 64; 
CGFloat barGutter = 8; 

int barSegments = 8;  

for (int segmentNumber = 0; segmentNumber <= (barSegments - 1); ++segmentNumber) { 

    // get the box rect 
    CGRect segment = CGRectMake(barStartX + (barWidth * segmentNumber), barStartY , barWidth - barGutter, barHeight); 

    // plot box 
    CGContextFillRect(context, segment); 
} 

私も、私は今から6ヶ月を理解することはありませんワンオフコードの不可解な怪物を作成する前に、私は思ったんだけどこの間隔の問題に対する一般的な解決策がある場合。

答えはObjective-Cでなくてもかまいませんが、ややCのようなものです。可読性はパフォーマンスの観点よりも優先されます。

答えて

4

あなたの努力にもかかわらず、この質問は少し不明です。しかし、私の試みです。

あなたはタイトルに説明する方程式は次のとおりです。

xは、私たちに、各ボックスの幅necessarryを与えるためにすることを解決
N*x + (N-1)*S = L 

x = (L - (N-1)*S)/N 

このようなもののようなコードになりますthis:

CGContextRef context = UIGraphicsGetCurrentContext(); 

int barSegments = 8; 

CGFloat barStartX = 96; 
CGFloat barStartY = 64.0; 
CGFloat barTotalWidth = 196.0; 

CGFloat barHeight = 64; 
CGFloat barGutter = 8; 
CGFloat barWidth = (barTotalWidth - (barSegments-1)*barGutter)/barSegments; 

for (int segmentNumber = 0; segmentNumber < barSegments; ++segmentNumber) { 

     // get the box rect 
     CGRect segment = CGRectMake(barStartX + ((barWidth + barGutter) * segmentNumber), barStartY , barWidth, barHeight); 

     // plot box 
     CGContextFillRect(context, segment); 
} 
+0

これはちょうど私がそこにあったことを知っていたエレガントなソリューションの種類です、ありがとう。 – willc2

0

、別々青、ピンク四角形を描画し、最後の青色の長方形を描く:) (又は最後ピンクのいずれかを描画しない)幅w Nボックスおよび間隔S考える

2

合計の長さは次のようになります

リットル = + W N× N -1)

×あなたはすべての変数を知っています。同じ式を使用して任意のボックスを配置することができます。あなたの図から、長さは最終ボックスの右端の座標と同じであることがわかります。だから、nから1を使って、すべてのボックスの右端を見つけることができます。それから左端を見つけることは簡単です:に減算し、1を加えます(80から80までのボックスは1ピクセル幅です)。 0

1

からカウントするあなたはもちろんの式を、変更することができます1からN数、0でないことを

注、私はこのようなものだろう:私は好き

CGFloat barStartX = 96; 
CGFloat barStartY = 64.0; 
CGFloat barWidth = 128; 
CGFloat barHeight = 64; 

... 

int numSegments = 8;  // number of segments 
CGFloat spacing = 8;  // spacing between segments 

CGFloat segmentWidth = (barWidth - spacing*(numSegments - 1))/numSegments; 

CGRect segmentRect = CGRectMake(barStartX, barStartY, segmentWidth, barHeight); 
for (int segmentNumber = 0; segmentNumber < numSegments; segmentNumber++) 
{ 
    segmentRect.origin.x = segmentNumber*(segmentWidth + spacing); 
    CGContextFillRect(context, segmentRect); 
} 

をループ外で矩形を定義し、ループ内で実際に変更されている矩形のプロパティのみを更新します。この場合、毎回変化するのはx座標だけなので、ループはかなり簡単になります。

+0

siの代わりに合計幅として使用されているため、コードを取得してbarWidthを128に増やしました箱の幅を狭くする。 'segment'は 'segmentRect'でなければなりません。 segmentRect.xはsegmentRect.origin.xでなければなりません。その後、それは動作します。 – willc2

+0

@ willc2:うれしいことを聞いてうれしいです。私のエラーを指摘してくれてありがとう。私はそれらを修正するコードを変更しました。 :) –

関連する問題