Hatena::ブログ(Diary)

パジャマdeブロッガー(myugaruのヲタ日記) このページをアンテナに追加 RSSフィード

myugaruの色々構想中・・・! - 本気でゲームやコンピュータに打ち込むブログ
myugaruの作ったプログラム達New! 最終更新2008/3/1)

2007年12月11日 Shapeクラス(完成)

[][]Shapeクラス(完成)

Bitmapクラスの内部バイト構造へ簡単にアクセスできるBmpProcX(XはPixelFormatに応じた1画素あたりのビット数=1,8,24,32)を使って単純な直線、長方形、楕円を描画するクラスShapeを完成した。全コードはそこそこ多くなったのでブログへ貼り付けずにダウンロードする形にした。

使用方法

  1. BmpProcXはjunki氏のHPにてダウンロードしてください。→no titleのImageUtils.lzh
  2. Shapeは私のHPにてダウンロードしてください。→http://www4.atpages.jp/myugaru/のShape.zip

ちとダウンロード権限をつけるのに手間取りました。→結論。どうやら拡張子lzhはダウンロードさせてくれないサーバでした。zipにしました。

上記でダウンロードしたImageUtils.csとShape.csをプロジェクトへ入れて以下のような感じで使います。

[][][]24ビットBitmapでのShape描画例

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using ImageUtils;

namespace ShapeTestApp
{
    public partial class MainForm : Form
    {
        int drawType = 0;

        public MainForm()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int w = ClientSize.Width;
            int h = ClientSize.Height;
            int xmin = -100;
            int xmax = w + 100;
            int ymin = -100;
            int ymax = h + 100;
            Bitmap bmp = new Bitmap(w, h, PixelFormat.Format24bppRgb);
            Shape24 shp = new Shape24(bmp);
            Random rnd = new Random();
            for (int i = 0; i < 100; i++)
            {
                shp.Color = ColorTranslator.FromWin32(rnd.Next(1 << 25));
                Point pt = new Point(rnd.Next(xmin, xmax), rnd.Next(ymin, ymax));
                Size sz = new Size(rnd.Next(w / 3), rnd.Next(h / 3));
                Rectangle rect = new Rectangle(pt, sz);
                switch (drawType)
                {
                    case 0:
                        if (rnd.Next(2) == 0)
                            sz.Width = -sz.Width;
                        if (rnd.Next(2) == 0)
                            sz.Height = -sz.Height;
                        shp.DrawLine(pt, pt + sz);
                        break;
                    case 1:
                        shp.DrawRectangle(rect);
                        break;
                    case 2:
                        shp.FillRectangle(rect);
                        break;
                    case 3:
                        shp.DrawEllipse(rect);
                        break;
                    default:
                        shp.FillEllipse(rect);
                        break;
                }
            }
            shp.Dispose();
            Graphics g = CreateGraphics();
            g.DrawImage(bmp, 0, 0);
            g.Dispose();
            bmp.Dispose();
            if (++drawType >= 5) drawType = 0;
        }
    }
}

なお、Shape.csはImageUtils.csと併用するように作ったのでImageUtils namespaceに所属するようにした。

[][]Shapeクラス検証(予告)

今描画速度について色々検証中であるが、楕円描画ははっきり言ってかなり遅いと感じる。なので

  1. 直線、長方形はShapeが十分使えそうかも?
  2. 楕円はGDI+を使うほうがよさそうかも?

検証結果を出したら改めてはっきり書きたいと思う。

[][]Shapeクラス課題

課題はいっぱいある。

  1. DrawLineが水平線、垂直線の場合の最適化処理をしてない。(全部斜線のつもりで無駄に計算してる)
  2. Fill系で透明色を考慮していない。
  3. Fill系でborder色を考慮していない。
  4. GDI+やJavaなどでDraw〜とFill〜で描画範囲が1ドットの違いが存在する。ShapeはDraw〜とFill〜はまったく同じ範囲を描画する。移植などするときに混乱を招きそうなのでGDI+、Javaにあわせたほうが良いのかもしれない。
  5. まだあるがこれくらいにしとく。

1、2、4はちょこっといじればなんとかなりそうとしても、3の場合はまったくそんなことを考えてロジックを作ってないのでロジック自体から変えないといけない。

とまあ書いてみたが・・・・そもそもお手軽図形描画のつもりで開発した以上はこれはこれ以上いじるのは冗長な気もしている。とりあえずしばらくこのまま様子を見る。

Connection: close