四角形の中に線をいれ分割したい

解決


善じ  2010-01-25 19:00:13  No: 37249

四角形があって、数値を入れる場所があるとします。

例えば数値を2といれると四角形に線が入って2分割されます。
同様に数値をいれるとその分だけ四角形が分割されるようにしたいのですが、どうすればスマートにできるか教えて下さい。

よろしくお願いします。


善じ  2010-01-25 19:06:31  No: 37250

続けて質問すいません。

さらに2分割にしたとして、分割1、分割2にそれぞれに違う色を付けるなんことできますか?

よろしくお願いします。


Kenny  2010-01-25 19:18:14  No: 37251

4角を描いて色を付けるのなら、フォームにPaintBoxを貼り付けて、PaintBoxのCanvasにRectangle()で描くのが一番簡単だと思いますよ。
色はBrushで指定できます。
まずヘルプを見て、四角を一つ書いてみて、分からないところをまた質問してください。


善じ  2010-01-25 20:33:17  No: 37252

Kennyさん

回答ありがとうございます。

とりあえず、四角を書いて見ました。
分割するには
現在の  CanvasのXの値÷分割数  で出てきた値を
使用して線を描いていくやり方以外にありますか?

また分割したものを配列のように分割1のCanvas、分割2のCanvas・・・、
としていきたいのですが、できますか?

分割したものをそれぞれ違う処理をかけたいです。
よろしくお願いします。


Kenny  2010-01-25 21:20:32  No: 37253

では、まず基本方針を決めましょう。
四角の分割というのは、棒グラフのように同じ方向の分割だけですか?
それとも、「田」のように異方向分割にしますか?
異方向分割の場合、LineTo、MoveTo、FillRectの世界になってきて、力業でかなり面倒なことになってきます。
次に、何分割まで対応しますか? あまり多いと考え方も変わってきますし。
あと、1024*768ドットの画面を使うと仮定して、横方向に長い四角をベースにしましょう。
画面半分使ったとして横512ドットにすると、2分割だと一マス256ドットですが、13分割だと39.3846.....ドットになります。
しかし、TRectはドットに対応するためintegerですから、整数に限りますよね。
そうすると切り捨てて13*39=507、切り上げて520のどちらかに全体サイズが変わってしまいますから、
ここも小細工か割り切りが必要になってきます。
以上どうでしょうか。


善じ  2010-01-25 21:55:16  No: 37254

Kennyさん

説明不足ですいません、丁寧にありがとうございます。
やはりひとつひとつ描いてくには面倒そうですね。

基本的には100くらいまで分割したいです。
棒グラフのようにたて方向のみの分割です。
Integerしか対応してないのですね…。
切捨てなり、サイズ変更なりそこは臨機応変に考えたいと思います。


Kenny  2010-01-25 22:39:36  No: 37255

さくっと作ってみました。とりあえずのお手軽基本形です。
フォームにButtonとEditとPaitnBoxを貼り付けてください。
Button1のOnClickから呼び出せるようにこのプロシージャをButton1.OnClickより上に貼り付けて、

procedure DrawManyRects(iCount: integer);
var k, iUnit: integer;
begin
  if iCount<1 then exit;
  iUnit:=512 div iCount;
  with Form1.PaintBox1.Canvas do
  begin
    for k:=0 to iCount-1 do begin
      Brush.Color:=$00000002*k;
      Pen.Color:=Brush.Color;
      Rectangle(iUnit*k, 0, iUnit*(k+1), 100)
    end
  end
end;

Buttonのイベントを

procedure TForm1.Button1Click(Sender: TObject);
begin
  DrawManyRects(StrToIntDef(Edit1.Text, 1))
end;

として、Editに適当な数字を入れてください。
色はBrush.Colorで指定するのですが、困るのは、100色目立って違う色を用意するのが難しいんことなんですよね。
私がよく使う手は、12色位を使い回しすることです。
ここでは簡単に赤のグラデーションにしましたけど、善じさんならあとは分かりますよね。
Pen.Colorも、黒で書くと升目の数が増えてきたときに見難くなるので、色々トライしてみてください。


Kenny  2010-01-25 23:04:55  No: 37256

6色巡りパターン。

procedure DrawManyRects(iCount: integer);
var k, iUnit, iColor: integer;
begin
  if iCount<1 then exit;
  iUnit:=512 div iCount;
  with Form1.PaintBox1.Canvas do
    for k:=0 to iCount-1 do begin
      iColor:=k mod 6;
      case iColor of
        0:Brush.Color:=clBlue;
        1:Brush.Color:=clYellow;
        2:Brush.Color:=clRed;
        3:Brush.Color:=clLime;
        4:Brush.Color:=clAqua;
        5:Brush.Color:=clWhite;
      end;
      Pen.Color:=Brush.Color;
      Rectangle(iUnit*k, 0, iUnit*(k+1), 100);
    end
end;

こんな感じで。


善じ  2010-01-25 23:19:01  No: 37257

Kennyさん

どうもありがとうございます。

実際にじっこうしてみましたが、      
Pen.Color:=Brush.Color;
実際に描く色を変更していますよね。

0:Brush.Color:=clBlue;

としたら最後までclBlueで描いてしまいます。
色を変更した後なにか更新するようなものとか入れなきゃだめなのですかね?


善じ  2010-01-25 23:25:34  No: 37258

Kennyさん

ごめんなさい、私の確認不足でした!

できました。
あとは色々ためしてみます。

わかりやすく、ていねいな説明ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加