Up

破線の描画

 

 図1のような破線を描くプログラムをVisual C++ 2008/CLRで作成してみた。

図1

 

破線のパターンは配列の形で下記のように設定する。

        array<Single> ^dsh1 = { 8.0, 4.0, 3.0, 4.0 };           //              線分の長さ 空白の長さ 線分の長さ 空白の長さ ・・・

これは、一点鎖線のパタンであるが、単純な破線は

        array<Single> ^dsh2 = { 4.0, 3.5 };             //              線分の長さ  空白の長さ ・・・

というように設定できる。

これらの破線のパターンはPenDashPatternプロパティに

        pn->DashPattern = dsh1;

のように設定する。

 曲線は、曲線を短い線分の集まりとして描くが、各線分の端点は配列として用意するため、まず配列を

         array<Point> ^ pnt1 = gcnew array<Point>(1001);

         array<Point> ^ pnt2 = gcnew array<Point>(1001);

というように与え、これらの配列の要素に以下のようにPoint型の値を設定する。以下のコードでは3角関数の値を設定している。

         for (int i = 0; i < 1001; i++){

                 double v = i * 2.0 * Math::PI / 1000.0;

                 pnt1[i] = Point( int(i * double(w) / 1000.0), int(y0 + 0.95 * y0 * Math::Sin(v)) );

                 pnt2[i] = Point( int(i * double(w) / 1000.0), int(y0 - 0.95 * y0 * Math::Sin(v)) );

         }

これらの破線パターンの設定されたPenと線分の端点の配列を用いて以下のコードで描画すると図1の破線が描かれる。

         pn->DashCap = System::Drawing::Drawing2D::DashCap::Round;              //              Roundに設定すると破線が滑らかになる

         gh->DrawLines(pn, pnt1);

         pn->DashPattern = dsh2;

         gh->DrawLines(pn, pnt2);

この描画のコードは「Draw」ボタンのクリックで実行されるが、このクリックで呼び出されるメソッドは以下のようになっている。

 

private: System::Void buttonDraw_Click(System::Object^  sender, System::EventArgs^  e) {

         int w = pictureBox1->Width;

         int h = pictureBox1->Height;

         pictureBox1->Image = gcnew Bitmap(w, h);

         Graphics ^ gh = Graphics::FromImage(pictureBox1->Image);

         Brush ^ bshW = gcnew SolidBrush(Color::White);

         gh->FillRectangle(bshW, 0, 0, w, h);

         Pen ^pn = gcnew Pen(Color::Black, 3);

 

         int y0 = h / 2;

         array<Single> ^dsh1 = { 8.0, 4.0, 3.0, 4.0 };          //              線分の長さ 空白の長さ 線分の長さ 空白の長さ ・・・

         array<Point> ^ pnt1 = gcnew array<Point>(1001);

         array<Point> ^ pnt2 = gcnew array<Point>(1001);

         //

         //                     曲線の座標値の設定

         //

         for (int i = 0; i < 1001; i++){

                 double v = i * 2.0 * Math::PI / 1000.0;

                 pnt1[i] = Point( int(i * double(w) / 1000.0), int(y0 + 0.95 * y0 * Math::Sin(v)) );

                 pnt2[i] = Point( int(i * double(w) / 1000.0), int(y0 - 0.95 * y0 * Math::Sin(v)) );

         }

         pn->DashPattern = dsh1;

         pn->DashCap = System::Drawing::Drawing2D::DashCap::Round;              //              Roundに設定すると破線が滑らかになる

         gh->DrawLines(pn, pnt1);

 

         array<Single> ^dsh2 = { 4.0, 3.5 };            //              線分の長さ  空白の長さ ・・・

         pn->DashPattern = dsh2;

         gh->DrawLines(pn, pnt2);

 }

 

上のプログラムは.NET Framework3.5対応であるが、プログラムファイル名DashedLines.exeをクリックしてダウンロード・実行することができる。プログラムのソースコードファイルなどは圧縮ファイルとしてまとめた。圧縮ファイル名DashedLines.zipをクリックしてダウンロードできる。ダウンロードした圧縮ファイルの名前をマウスの右ボタンでクリックして表示されるメニュから「展開」あるいは「解凍」を選ぶと解凍することができる。解凍したファイルはVisual C++2008で開くことができる。

 なお、Visual C++プログラミングの解説を<岡本安晴「大学生心理学VC++プログラミング入門勁草書房>で行っている。

 

Up