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

プロフィール

Akira

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

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

スポンサーリンク


カテゴリ

最近のコメント

カレンダー

07 | 2017/08 | 09
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】傾いた楕円の描画(楕円上の点の座標を求める方法)

前回は、.NETのGraphicsクラスの機能を使って傾いた楕円を描画しましたが、.NETでない
場合は使えないので、傾いた楕円上の点の座標を求めて描画する方法を紹介します。

目標とする楕円描画例

傾いた楕円の描画 

 もともと楕円は円を拡大縮小して書くことができる特徴を使って楕円上の点を求めたいと思います。
まず、半径1の円上の点を考えます。 

円上の点の座標 

円上の座標を式であらわすと、

X = cos ω
Y =  sin ω

となります。
この式に関して、ωを0~360°で変化させると半径1の円を描画することができます。

円上の点X = cos ω
Y = sin ω
 
 
           


この円上の点に関して、X軸方向にa倍、Y軸方向にb倍すると

楕円上の点の座標X = a × cos ω
Y = b × sin ω


となり、楕円上の点の座標が求まります。
この点を原点周りにθ°回転すると

楕円上の点X = a × cos ω × cosθ - b × sin ω × sinθ 
Y = a × cos ω × sin θ + b × sin ω × cosθ


となり傾いた楕円上の点を求めることができます。
あとは、X軸方向にX0,Y軸方向にY0だけ平行移動すると

楕円上の点X = a × cos ω × cosθ - b × sin ω × sin θ + X0 
Y = a × cos ω × sin θ + b × sin ω × cosθ + Y0
 

となり傾いた楕円上の点は求まり、角度ωを0~360°で変化させ、点を折れ線でつなぐと
傾いた楕円を描画することが出来ます。

この楕円描画部分のサンプルプログラムは以下の通りです。

 private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
     //傾いた楕円の描画

     int i;
     float Px0, Py0, Px1, Py1;

     float a, b;
     float X0, Y0;
     float w, th, thRad;

     //長軸
     a = 100;
    
//短軸
     b = 50;
     //中心座標
     X0 = 300.0F;
     Y0 = 200.0F;
     //楕円の傾き
     th = 30.0F;

     ///////////////////////////////////
     //  Graphicsの確保
     //
     //PictureBoxと同じ大きさのBitmapクラスを作成する。
     Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height);
     //空のBitmapをPictureBoxのImageに指定する。
     pictureBox1->Image = bmpPicBox;
    
//Graphicsクラスの作成(空のピクチャボックスからGraphicsを作成する)
     Graphics^g = Graphics::FromImage(pictureBox1->Image);

     ///////////////////////////////////
     //  Penの作成
     //    
     //楕円描画用のペン
     Pen^ p = gcnew Pen(Color::Blue, 5);
    
//軸描画用のペン
     Pen^ pAxis = gcnew Pen(Color::Black, 3);
    
    
///////////////////////////////////
     //  傾いていない楕円の描画
     //
 
     g->DrawEllipse(p, RectangleF(-a, -b, a * 2.0F + 1.0F, b * 2.0F + 1.0F)); 
//楕円
    
//軸の描画
     g->DrawLine(pAxis, -a * 2, 0.0, a * 2, 0.0); 
//X軸
     g->DrawLine(pAxis, 0.0, -b * 2, 0.0, b * 2); 
//Y軸
    
    
///////////////////////////////////
     //  傾いた楕円の描画
     //

     //最初の点の座標
     thRad = th / 180.0F * (float)Math::PI;
     Px0 = (float)(a * Math::Cos(0) * Math::Cos(thRad)
              - b * Math::Sin(0) * Math::Sin(thRad)
              + X0);
     Py0 = (float)(a * Math::Cos(0) * Math::Sin(thRad)
              + b * Math::Sin(0) * Math::Cos(thRad)
              + Y0);

     //楕円の描画
     for (i = 1; i <= 360; i++){
      w = i / 180.0F * (float)Math::PI;
      Px1 = (float)(a * Math::Cos(w) * Math::Cos(thRad)
         - b * Math::Sin(w) * Math::Sin(thRad)
         + X0);
      Py1 = (float)(a * Math::Cos(w) * Math::Sin(thRad)
         + b * Math::Sin(w) * Math::Cos(thRad)
         + Y0);

      g->DrawLine(p, Px0, Py0, Px1, Py1);
      Px0 = Px1;
      Py0 = Py1;

     }

     ///////////////////////////////////
     //  再描画
     //
     pictureBox1->Refresh();

    }

 


 関連記事

 

 傾いた楕円の描画(Graphicsクラスを用いた方法)

回転行列、拡大縮小行列、平行移動行列

最小二乗法による楕円近似



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

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

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














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


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

現在の閲覧者数: / 合計