画像処理ソリューション
これを見れば画像処理の入門から基礎~応用まで全てがわかるのを目指して!
   
翻訳(Translate)

プロフィール

Akira

ニックネーム:Akira
東京都の町田事業所に勤務
画像処理ソフトの開発を行っています。リンクフリーです!
詳細プロフィールは こちら
お問い合わせは、こちら↓

【補助HP】
画像処理ソリューションWeb版 【Newブログ】
イメージングソリューション

スポンサーリンク


カテゴリ

最近のコメント

カレンダー

09 | 2017/10 | 11
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

趣味のブログ

iPhone萬歳!
iPhoneの情報いろいろ。
ブログ学習帳
ブログ、SEO、アフィリエイト情報など(まだまだこれから)
俺流クラフト日記
ハンドメイド作品の記録(現在、放置中)

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【C++/CLI】矢印の大きさ変更、任意形状の指定方法

メインページC++/CLI プログラミング

.NETで矢印を描画する場合、線種、線幅、終端形状、接合形状の設定でも紹介したようにStartCapEndCapのプロパティでArrowAnchorを指定すれば、矢印を描画する事はできますが、デフォルト状態では、矢印が小さすぎてあまり使い物になりません。

そこで、矢印の大きさを指定、任意形状を指定する方法を紹介したいと思います。

まずは、実行結果と、そのプログラムを参照下さい。

【実行結果】
矢印の大きさの変更、任意形状の指定
【サンプルプログラム】
private: System::Void pictureBox1_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) {

                 //黒の線幅1のペンを作成
                 Pen^ p = gcnew Pen(Color::Black, 1);

                 ////////////////////////
                 //サイズ指定した矢印の描画


                 //サイズを指定した矢印を作成する。
                 System::Drawing::Drawing2D::AdjustableArrowCap^ myArrow
                        = gcnew System::Drawing::Drawing2D::AdjustableArrowCap(20, 20, false);

                 //線の終端に作成した矢印を指定する。
                 p->CustomEndCap = myArrow;

                 //矢印の描画
                 e->Graphics->DrawLine(p, 10, 50, 200, 50);

                 ////////////////////////
                 //任意矢印の描画

                 //GraphicsPathの作成

                 System::Drawing::Drawing2D::GraphicsPath ^hPath
                     = gcnew System::Drawing::Drawing2D::GraphicsPath();

                 array<Point>^ pts
                     = gcnew array<Point>{Point(0, 0), Point(-10, -20)
                        , Point(0, -14), Point(10, -20), Point(0, 0)};

                 // GraphicsPathへ多角形(矢印)を追加
                 hPath->AddPolygon(pts);

                 //塗りつぶさないカスタムキャップの定義
                 System::Drawing::Drawing2D::CustomLineCap ^HookStartCap
                     = gcnew System::Drawing::Drawing2D::CustomLineCap(nullptr, hPath);
                 //カスタムキャップの指定
                 p->CustomStartCap = HookStartCap;

                 //塗りつぶすカスタムキャップの定義
                 System::Drawing::Drawing2D::CustomLineCap ^HookEndCap
                     = gcnew System::Drawing::Drawing2D::CustomLineCap(hPath, nullptr);
                 //カスタムキャップの指定
                 p->CustomEndCap = HookEndCap;

                 //矢印の描画
                 e->Graphics->DrawLine(p, 10, 100, 200, 100);

                 //ペン幅を指定して矢印を描画
                 p->Width = 3;
                 e->Graphics->DrawLine(p, 10, 180, 200, 180);

             }

まず、矢印の大きさはSystem::Drawing::Drawing2D::AdjustableArrowCapクラスで幅と高さを指定します。
幅と高さの関係は以下のようになっています。
矢印の大きさの変更、任意形状の指定
また、塗りつぶした矢印を描きたい場合は

System::Drawing::Drawing2D::AdjustableArrowCap^ myArrow
                 = gcnew System::Drawing::Drawing2D::AdjustableArrowCap(20, 20, true);

のように指定します。

また、任意形状の矢印を描画したい場合は、矢印の形状そのものはGraphicPathで指定した形状をSystem::Drawing::Drawing2D::CustomLineCapクラスに指定する事で矢印を描画できます。

この時、GraphicPathで矢印の形状を指定する時の座標系は以下のように、線の中心から線の端点へ向かう方向が+Y軸方向となり、その反時計まわりに90度の方向が+X軸方向となります。
矢印の大きさの変更、任意形状の指定

塗りつぶさない矢印を描画する場合は
System::Drawing::Drawing2D::CustomLineCap ^HookStartCap
                  = gcnew System::Drawing::Drawing2D::CustomLineCap(nullptr, hPath);

塗りつぶす矢印を描画する場合は
System::Drawing::Drawing2D::CustomLineCap ^HookStartCap
                  = gcnew System::Drawing::Drawing2D::CustomLineCap(hPath, nullptr);

のように、CustomLineCapのどちらかに引数に作成したGraphicPathを指定します。

ここで、バグ?のような動作があり、同じGraphicPathを指定しているにも関わらず、塗りつぶすか?塗りつぶさないか?によって実際に描画される大きさが異なる場合もあるようにです。

また、実際に描画される矢印の大きさは線の幅(PenWidthプロパティ)の値に応じて大きさが変わります。

Loading...
スポンサーリンク

この記事に対するコメント

この記事に対するコメントの投稿














管理者にだけ表示を許可する


この記事に対するトラックバック
トラックバックURL
→http://imagingsolution.blog107.fc2.com/tb.php/280-1756d732
この記事にトラックバックする(FC2ブログユーザー)

現在の閲覧者数: / 合計