
画像を作ってるのですが、円描画のまともな方法が分かりません。
現在は、数学っぽいサイトを検索した所円の方程式は
r2乗 = X2乗 + Y2乗
と言うのが出てきたのでそれを元に作ってます。
具体的には、y軸に近い部分はx軸から。x軸に近い部分はy軸から描画を始め、
それそれ8回に分けて一つの円を描画しまてす。
イメージ的には rを定数とし、y軸の直下や真上付近ならx軸を一つづつずらし、yの値を求めます。
x軸の右側付近とかならy軸をずらします。
数学風に書くと
y ** 2 = (x + n) ** 2 + r ** 2
みたいなイメージです。(n = 何個目のドットを描画しているか。**はPerlなどでべき乗)。
これの平方根を求めて端数を四捨五入してます。
この方法だと軸から遠ざかると塗りつぶすドットが飛び飛びになるので8回(もしくは4回)の描画が必要です。
問題はまず、
それが一般的な方法かどうかと言う点です。8回に分けるもんだから処理が汚いです。
さらになぜか、円も汚いです。
いや理由はだいたい分かるんですけど、ドット数に少数点とかないから四捨五入とかしてます。
すると、どうもちゃんとした円にならないです。そこドットの描画一個ズレてるだろコレ?
おまえそれ、明らかに1ドットずらしたほうが綺麗な円になるぞ?
みたいことが起きます。
もう一つ、他の疑問なんですがちょっと数学的な疑問で、
円を1/8づつ描画させるにはnのループ回数を
n = r / (1.4140 < m < 1.4146) くらいの値に設定しなきゃならないことが分かりました。
なぜ割り算させたのかはもう覚えてません。
一つづつ手作業で確かめて絞り込んだ数値なのですが、
どうもmが2の平方根に似ている気がします。
なぜこうなるんでしょう。たぶん数学的な何かだと思うのですが。
なお数学的な知識は全然ないです。学校では一日中寝るのが特技でした。
まさかこんな技術が必要になるとは…。
No.1ベストアンサー
- 回答日時:
ミッチェナーの円の描画アルゴリズムというよく知られた手法があるので調べてみてください。
この回答への補足
ありがとうございました。
今まであった使ってた処理を整理して書き換えた所で納得がつきました。
選びにくいのですが最初の返信をベストアンサーの理由にしようと思います。
ありがとうございます。
本日の昼に検索した所、出てきました。
すごく平たく言うと、基本の式は今のままで構わないが、
普通は1ドットずつ全部計算しないと言うことなのでしょうか。
そうなのでしょうね。
No.5
- 回答日時:
#1です。
おっしゃる通り、基本の式は同じです。ミッチェナーのアルゴリズムの特徴の一つは、三角関数や絶対値の計算を使わず、整数の範囲で実現できるので比較的に高速です。
また、誤差がより小さい画素が選択されるので
> 1ドットずらしたほうが綺麗な円になるぞ?
ということが軽減されます。
ただし、やはり1/8円弧ずつ描くので、その点で処理が入り組んでしまうのは改善しませんけれども。
よく見てよく理解して作ろうと思います。
ただ最近のPCは恐ろしく高性能なので、ある程度は処理(記述)のスマートさが優先になるかもしれません。
ありがとうございました。
No.4
- 回答日時:
訂正
色々へんだった。。。
y = r * sinθ
θを -π/2~π/2 まで、幾つかに(3*r程度)分割して、順に y を求めて、
その y をしたの式にあてはめて、x を求める。
x^2 + y^2 = r^2
ご丁寧訂正にありがとうございました。
-----------------------------------------------------
今気づいたのですが、私も書いた式が間違ってるのに今気づきました。
y ** 2 = (x + n) ** 2 + r ** 2
こんな式自分のプログラムのどこにも書いてなかったです。
No.3
- 回答日時:
三角関数を使うといいよ!
x = r * sinθ
θを 0π~2π まで、幾つかに分割して、順に x を求めて、
その x をしたの式にあてはめて、y を求める。
x^2 + y^2 = r
θをなん分割するかだけど、
r * 6 ぐらいあれば十分。。。かな?
この回答への補足
回答頂いた皆様には申しわけないですが、
ベストアンサーをどうするかの判別が付かないので
自分が納得できる描画の処理を書けてから選びたいを所存でございます。
すみませんがお待ちください。
ありがとうございます。
遠い昔に三角関数と言う言葉を聞いたような聞かないような記憶があります。
この計算法だと1ドットずつ出すと言うことでしょうか。
最初画像を作るとなった時、画像のフォーマットを知ればそれでOKと思ったんですが、
よくよく考えると何か描画すると言うのは全部2次元平面の数式が必要なんですね。
ナメてました。
rからループ回数を出すと言うのは塗りつぶすドット数の数を出すと言う解釈でいいですよね。
二乗とかなるとイメージが掴みにくいのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- レトロゲーム ファミコンのインベーダの質問その3 背景にインベーダーを描画したとしても、なぜ動けるのか? 3 2022/07/08 16:58
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- 高校 三次関数のグラフにつきまして 3 2022/05/15 11:14
- マンガ・コミック 漫画の練習方について 1 2022/06/06 19:26
- その他(悩み相談・人生相談) 漫画業界ってフォロワー多ければ簡単なんですか? 価値 希望 可能性 将来性がある人間ってどんな人です 1 2022/04/26 21:56
- USTREAM ★YOUTUBEの登録者数についての質問です 1 2022/06/23 02:00
- その他(悩み相談・人生相談) お願いします。 最近何も食べない状態になってしまいました。 精神病も発見されてしまいました。 主な原 2 2022/04/26 21:07
- pixiv 絵師はなぜ1枚絵ばかりで漫画を描かないのか? 14 2022/08/05 10:30
- 工学 高周波工学について 3 2022/05/11 11:04
- 工学 フィードバック制御の問題です。 3 2022/12/02 11:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
for文の実行速度を遅くしたいの...
-
ListBoxで改行したい
-
図の削除直後の再描画
-
PowerPoint の VBA
-
画面に絵を出す方法
-
立方体をくるくる回転させるプ...
-
VB.netで図形描画ができません^^;
-
c言語 ちらつき
-
円の頂点の求め方を知りたいです。
-
給紙トレイをダイアログを使わ...
-
PictureBoxのダブルバッファリ...
-
worksheetFunctionクラスのVloo...
-
実行時エラー 438になった時の...
-
VBA シートのボタン名を変更し...
-
ユーザーフォームを表示中にシ...
-
「Columns("A:C")」の列文字を...
-
VBA(エクセル)で自動的にボタン...
-
【C#/Java?】try-catchでcatch...
-
ウォッチ式の文字数制限について
-
VBAがブレークモードになっ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ListBoxで改行したい
-
給紙トレイをダイアログを使わ...
-
C#を用いて描画する四角形の角...
-
vb6のTEXTBOX
-
PowerPoint の VBA
-
for文の実行速度を遅くしたいの...
-
win32api複数のタイマーを同時...
-
MFCでのコンボボックスについて
-
VB.netで図形描画ができません^^;
-
花火のアルゴリズム
-
図の削除直後の再描画
-
円の頂点の求め方を知りたいです。
-
C# DrawImage 物理サイズでな...
-
VB.NETでグラフィックを描くと...
-
PictureBoxのダブルバッファリ...
-
色を合成するには
-
C++/CLIを用いて画像をクリップ...
-
【Delphi】 Canvasへの描画につ...
-
エクセルのレーダーチャート 0...
-
C#で壁の当たり判定と自キャラ...
おすすめ情報