• ベストアンサー

円の描画の太さを指定できるCコード

円の描画を行うCコードを記述していますが Michenerのアルゴリズムにより円を下記サイトを参考に記述できました。 しかし、アルゴリズムの理解不足の為、円の太さを指定できるようにしたいのですが、なかなか上手くいっておりません。 もし、円の太さを指定できるCコードなどありましたら教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

座標を記録しなくても描画可能です。 単純ループではなく、以下のような2重ループ構成にします。 外: yを(R+0.5d)から0まで1づつ減らしていくループ 中: yがその座標に等しい間、xを増やしていくループ これで、各y座標に対応するx座標が求まります。 あとは、 ・yが(R+0.5d)~(R-0.5d)の間 →外周のMichenerについてだけ中ループを実施、求まったx座標から線を引く ・yが(R-0.5d)~0の間  →外周・内周両方のMichenerについて中ループを実行、内周と外周両方のx座標を求めて、その間を結ぶ線分を描画 といった形にすればOK。

Michael8
質問者

お礼

お礼が遅くなり申し訳ありません。 ご回答を参考にさせていただき何とか円の太さを指定だきるようになりました。 ありがとうございます。

その他の回答 (2)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

Michenerで線の太い円を描く手順は以下の通りです。(具体的なコードは示しません。) 半径R、線幅dの場合、 ・内周: 半径R-0.5dの円 ・外周: 半径R+0.5dの円 の二つを考えます。 yを-(R+0.5d)~+(R+0.5d)の間での個々のy座標について、以下の処理を行います。 ・内周・外周のx座標を求めます。  内周のx座標の開始値: x1  外周のx座標の終了値: x2 だった場合、x1とx2の間(および-x1と-x2の間)を水平な直線で描画する ・y座標が内周より外の場合は、-x1~x1を直線で描画します。 以上のようにすれば、線幅のある円が描画できます。 本来Michenerは1/8円ですが、上記アルゴリズムで実行する場合、1/4円で計算した方がいいかと思います。 なお、ANo.1の > (1)半径が1pixel短い(長い)円をさらに描画する の方法だと、たいてい隙間ができるので使い物になりません。 > (2)描画するpixel(描画対象点)が決定したら、そのpixelの上下左右もあわせて描画対象点とする こちらの場合、描画結果は問題ないですけど、ものすごく無駄が多いですね。 この方法だと、Michenerという計算量が少ない(そのかわりちょっと難しい)アルゴリズムを使う意味が無くなります。

Michael8
質問者

お礼

ご回答ありがとうございます。 上記の方法ですと、内周と外周をMichenerのアルゴリズムで座標を求めそれを一旦記憶し、その座標を元に直線を描画し、太さを出すという方法でしょうか? 今回、組込みを考えており、メモリ容量の関係で全座標を記憶する事はできないのですが、やはり難しいでしょうか?

  • jk39
  • ベストアンサー率54% (366/670)
回答No.1

サイトは分かりませんがヒントだけ参考までに・・・。 (1)半径が1pixel短い(長い)円をさらに描画する つまり、コンパスを複数回まわして太くするイメージです。 (2)描画するpixel(描画対象点)が決定したら、そのpixelの上下左右もあわせて描画対象点とする こちらはコンパスの鉛筆を太いサインペンに変えて描くイメージです。 あとは(1)の方法で一番半径の長い円と一番短い円を描画した後、 塗りつぶし処理を行う方法もあるでしょうね。 (但し、塗りつぶしもアラが出やすいので注意してくださいね。)

関連するQ&A

  • 円弧の描画方法

     円(または1/8円弧)の描画アルゴリズムとして ミッチェナーの円のアルゴリズムが知られています。 しかし、任意の円弧(例えば、長方形に内接するような→MFCのライブラリに あるような指定方法や3点を指定して円弧を描画する)を高速に描画する 方法はありますか?ミッチェナーの方法の変形(制限)でもいいので 教えてください。

  • リアルタイムで多数の3角形ポリゴン(2D)を描画したい

    リアルタイムでテクスチャを貼った多数の3角形ポリゴン(2D)をアルファブレンドを加味して描画したいのですが、OpenGL,DirectX等は使わずに自前のコードで実装したいのです。参考になるアルゴリズムを紹介したサイト、ソースコードなどを掲載しているサイトなどありましたら教えてください。検索のヒントになるワードでも結構です。お願いします。

  • DirectX9.0での四角形の描画について

    現在、WindowsXP, VS2005, DirectX9.0, C/C++の環境で 4角形を表示するプログラムを作ろうとしています。 しかし、3Dモデルの表示などは資料も多くあり、比較的 容易に学ぶことが出来たものの、4角形や3角形、円など 基本図形の描画については手持ちの書籍にはほとんど 書かれておらず、私が探せたサイトではVBやDirectX8.0 などの情報ばかりヒットしてしまい、少し困ってしまっています。 確かDirectX8.0と9.0では手順が違うと聞いたことがあったので、 もしよろしければ参考になりそうなサイトや書籍やソースコードを ご教授頂けると幸いです。

  • C#のpictureBoxの描画のタイミング

    C#のpictureBoxの描画について質問します。 drawにpictureBoxの描画コードが有りますがあり、Form1() の InitializeComponent();の 後(コードA)では、描画できませんが、button1_Click(コードB)では、描画できるようです。 Q1)プログラムの起動時に、描画できる方法はありますか? public Form1() { InitializeComponent(); 処理コード draw(); //コードA } private void button1_Click(object sender,EventArgs e) { draw(); //コードB }

  • C#で折れ線の描画を行っているのですが

    C#で折れ線の描画を行っているのですが たとえば複数のデータがあるとします。。 その複数のデータを折れ線として表すことはできたのですが、 その個々のデータを区別するために各折れ線に (1)データ番号グラフに表示する (2)違う色をつける ということは可能なのでしょうか?;; ちなみにfor分で制御をおこなっているため(2)に関して 個々の折れ線のg.DrawLinesに色名で指定して違う色を指定するといことはできそうにありません;; これは色コードを使えば可能なのでしょうかね?;; (1)全くは分かりません;; 宜しくお願い致します;;

  • VC++2010(MFC)での描画

    とあるグラフを描こうとしています。…View.cppのOnDraw()内に描画の為のコードを記述するのが一般的だと思いますが、そのグラフを描く為の元データを得るまでに、かなり長い計算の為のコードを書く必要があります。又、途中で計算の為のコードが正しく書けているか検証する為に、描画(グラフの描画)をこまめにする必要があります。 例えば、基本的に描画とは関係のない計算の為の関数AAA(xx)、BBB(yy)、CCC(zz)…等を準備して、OnDrawing()からそれらの関数を呼ぶ場合で、関数AAAの中でも(即ちOnDrawの外でも)検証用に描画する(グラフを描く)ようなケースでは(即ち、関数AAA内でもpDCを使えるようにするには)、関数AAA内でどのようなコードを準備すればよいのでしょうか? それとも根本的にもっとスマートなやり方があるのでしょうか? 教えて下さい。

  • 円の頂点の求め方を知りたいです。

    プログラムで円を作成したいので、参考になるアルゴリズムを探しています。 数学の教科書に出てくる様な公式では無く、コードで記述されたwebページがあれば教えて下さい。 計算方法なのでどんな言語でも特に支障無いと思いますが、スクリプト系であれば嬉しいです。

  • 描画出力にあたって

    単純に直線や円などを画面に描画するプログラムなのですが 参考サイトの通りに記述しても画像や文字の出力は出来るのですが線や円の描画が出来ません。 指定した位置に線、円、四角形等を画面に描画するとき 下に表記したソースに足りない宣言とかありましたら教えてください よろしくお願いします #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode(TRUE) ; if( DxLib_Init() == -1) return -1; int white,red,g_blue; white = GetColor(255,255,255); red = GetColor(255,0,0); g_blue = GetColor(0,255,255); DrawLine(10,10,630,10,white); DrawBox(10,50,310,100,g_blue,false); DrawBox(10,150,310,200,g_blue,true); DrawCircle(500,300,100,red,true); WaitKey(); DxLib_End(); return 0; } なお参考にしたサイトは http://l.huu.cc/g/#0 です

  • [c++]webサイトからのコード引用方法

    C++のコードを掲載しているWebサイトはたくさんありますが コードの一部しか記述していないサイトが多く どのヘッダーファイルをインクルードすればいいのかは書いていない 場合が多い。 わたしはVC++2008 Express Editionを 使用しているが、インクルードファイルを指定しないと コンパイルできないし、どのファイルをインクルードすれば いいのか教えてくれる機能もない。 上記の問題を踏まえた上で、Webサイトに断片的に記述されたコードは どのように使用すればいいのか教えてください。

  • 漢字コード変換のアルゴリズム…

    下記URLのページ中に、 http://www.tohoho-web.com/wwwkanji.htm 「各コード間の変換アルゴリズム」 という項目があるのですが、 その下の、 「漢字コードマップ」を見ても、 JIS⇒S-JISの変換アルゴリズムがよくわかりません。 自分でももう一度考えて見ますが、 参考にあるようなサイト、 もしくは説明?してもらえると助かります。

専門家に質問してみよう