
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。
お礼が遅くなり申し訳ありません。
ご回答を参考にさせていただき何とか円の太さを指定だきるようになりました。
ありがとうございます。
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という計算量が少ない(そのかわりちょっと難しい)アルゴリズムを使う意味が無くなります。
ご回答ありがとうございます。
上記の方法ですと、内周と外周をMichenerのアルゴリズムで座標を求めそれを一旦記憶し、その座標を元に直線を描画し、太さを出すという方法でしょうか?
今回、組込みを考えており、メモリ容量の関係で全座標を記憶する事はできないのですが、やはり難しいでしょうか?
No.1
- 回答日時:
サイトは分かりませんがヒントだけ参考までに・・・。
(1)半径が1pixel短い(長い)円をさらに描画する
つまり、コンパスを複数回まわして太くするイメージです。
(2)描画するpixel(描画対象点)が決定したら、そのpixelの上下左右もあわせて描画対象点とする
こちらはコンパスの鉛筆を太いサインペンに変えて描くイメージです。
あとは(1)の方法で一番半径の長い円と一番短い円を描画した後、
塗りつぶし処理を行う方法もあるでしょうね。
(但し、塗りつぶしもアラが出やすいので注意してくださいね。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
- 物理学 歌口と楕円形の太鼓 1 2023/05/15 23:21
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- スピーカー・コンポ・ステレオ ワード。オブジェクトの上に半円を描くには。 2 2022/10/06 13:02
- 政治 どうしたら、日本円と人民元が同じ¥マークなのを利用して、中国人から金をだまし取る事ができますか? 5 2023/04/22 17:17
- 政治 日本円と中国の人民元が同じ「¥」マークを使うと、損するのは日本人です 2 2023/04/22 19:15
- Visual Basic(VBA) ユーザーフォームで銀行に対応した支店コードの入力ができません Sheet1のA列に銀行名、B列に銀行 5 2022/07/28 17:50
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Visual Basic(VBA) エクセルのマクロコードの一部分を変更する方法について教えてください。 2 2023/02/17 08:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
TextBoxに文字を書いても表示さ...
-
CreateFontで回転させて印刷出...
-
最前面に無理やりフォームを持...
-
VC++プログラムをつかったBMP画...
-
Form1 Load で実行されない。
-
MFC 6.0 VC++ で、処理が重くな...
-
word
-
画像の印刷について
-
VB.netでのライン描画方法がわ...
-
InvalidateRectの使い方について
-
NVIDIAのシェーダーキャッシュ
-
[VB.net] DataGridViewの列ヘッ...
-
MFCでOnPaintのタイミング
-
ウインドウサイズを変更しても...
-
BitBltでの表示での問題です。
-
FlexGridの一部のみ表示を更新...
-
win32api 画面のちらつき
-
エクセルでガンチャートを作成...
-
[Win32API]JpegをDIBに変換する
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
panelのスクロール表示について
-
VC++プログラムをつかったBMP画...
-
VBAにGDI+を参照させる方法
-
google Colabでmatplotlibの描...
-
MFCでOnPaintのタイミング
-
MFCのタイマーのつかい方を教え...
-
UpdateData( FALSE); による文...
-
CStaticコントロールの静的イメ...
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
win32api 画面のちらつき
-
c++ ダブルバッファリング、以...
-
CDC(LineTo)で描画した線を透過...
-
BitBltでの表示での問題です。
おすすめ情報