質問 |
||
| QNo.3972954 | 円の描画の太さを指定できるCコード | |
|---|---|---|
| 質問者:Michael8 |
円の描画を行うCコードを記述していますが Michenerのアルゴリズムにより円を下記サイトを参考に記述できました。 しかし、アルゴリズムの理解不足の為、円の太さを指定できるようにしたいのですが、なかなか上手くいっておりません。 もし、円の太さを指定できるCコードなどありましたら教えていただけないでしょうか? |
|
困り度:
|
||
| 質問投稿日時: 08/04/24 17:43 |
||
回答良回答20pt |
|
| ANo.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。 |
|---|---|
| 回答者:mtaka2 | |
| 種類:回答 どんな人:専門家 自信:自信あり |
|
| 回答日時: 08/04/25 20:51 |
|
| |
| この回答へのお礼 | お礼が遅くなり申し訳ありません。 ご回答を参考にさせていただき何とか円の太さを指定だきるようになりました。 ありがとうございます。 |
回答 |
|
| ANo.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という計算量が少ない(そのかわりちょっと難しい)アルゴリズムを使う意味が無くなります。 |
|---|---|
| 回答者:mtaka2 | |
| 種類:回答 どんな人:専門家 自信:自信あり |
|
| 回答日時: 08/04/25 12:14 |
|
| |
| この回答へのお礼 | ご回答ありがとうございます。 上記の方法ですと、内周と外周をMichenerのアルゴリズムで座標を求めそれを一旦記憶し、その座標を元に直線を描画し、太さを出すという方法でしょうか? 今回、組込みを考えており、メモリ容量の関係で全座標を記憶する事はできないのですが、やはり難しいでしょうか? |
回答良回答10pt |
|
| ANo.1 | サイトは分かりませんがヒントだけ参考までに・・・。 (1)半径が1pixel短い(長い)円をさらに描画する つまり、コンパスを複数回まわして太くするイメージです。 (2)描画するpixel(描画対象点)が決定したら、そのpixelの上下左右もあわせて描画対象点とする こちらはコンパスの鉛筆を太いサインペンに変えて描くイメージです。 あとは(1)の方法で一番半径の長い円と一番短い円を描画した後、 塗りつぶし処理を行う方法もあるでしょうね。 (但し、塗りつぶしもアラが出やすいので注意してくださいね。) |
|---|---|
| 回答者:jk39 | |
| 種類:アドバイス どんな人:経験者 自信:参考意見 |
|
| 回答日時: 08/04/25 09:03 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |