円描画の方法と疑問点

このQ&Aのポイント
  • 円描画の方法について疑問があります。現在の方法ではきれいな円が描画できず、ドットの描画がずれることがあります。
  • 円を1/8ずつ描画するには特定のループ回数を設定する必要がありますが、その値が2の平方根に似ていることに疑問を感じています。
  • 数学的な知識がないため、円描画について困っています。どのようにすればよりきれいな円を描画できるのか、またループ回数をどのように設定すればいいのか教えてください。
回答を見る
  • ベストアンサー

アルゴリズム : 円描画

画像を作ってるのですが、円描画のまともな方法が分かりません。 現在は、数学っぽいサイトを検索した所円の方程式は 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の平方根に似ている気がします。 なぜこうなるんでしょう。たぶん数学的な何かだと思うのですが。 なお数学的な知識は全然ないです。学校では一日中寝るのが特技でした。 まさかこんな技術が必要になるとは…。

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

  • ベストアンサー
noname#208507
noname#208507
回答No.1

ミッチェナーの円の描画アルゴリズムというよく知られた手法があるので調べてみてください。

TANUKIA
質問者

お礼

ありがとうございます。 本日の昼に検索した所、出てきました。 すごく平たく言うと、基本の式は今のままで構わないが、 普通は1ドットずつ全部計算しないと言うことなのでしょうか。 そうなのでしょうね。

TANUKIA
質問者

補足

ありがとうございました。 今まであった使ってた処理を整理して書き換えた所で納得がつきました。 選びにくいのですが最初の返信をベストアンサーの理由にしようと思います。

その他の回答 (4)

noname#208507
noname#208507
回答No.5

#1です。おっしゃる通り、基本の式は同じです。 ミッチェナーのアルゴリズムの特徴の一つは、三角関数や絶対値の計算を使わず、整数の範囲で実現できるので比較的に高速です。 また、誤差がより小さい画素が選択されるので > 1ドットずらしたほうが綺麗な円になるぞ? ということが軽減されます。 ただし、やはり1/8円弧ずつ描くので、その点で処理が入り組んでしまうのは改善しませんけれども。

TANUKIA
質問者

お礼

よく見てよく理解して作ろうと思います。 ただ最近のPCは恐ろしく高性能なので、ある程度は処理(記述)のスマートさが優先になるかもしれません。 ありがとうございました。

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.4

訂正 色々へんだった。。。 y = r * sinθ θを -π/2~π/2 まで、幾つかに(3*r程度)分割して、順に y を求めて、 その y をしたの式にあてはめて、x を求める。 x^2 + y^2 = r^2

TANUKIA
質問者

お礼

ご丁寧訂正にありがとうございました。 ----------------------------------------------------- 今気づいたのですが、私も書いた式が間違ってるのに今気づきました。 y ** 2 = (x + n) ** 2 + r ** 2 こんな式自分のプログラムのどこにも書いてなかったです。

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.3

三角関数を使うといいよ! x = r * sinθ θを 0π~2π まで、幾つかに分割して、順に x を求めて、 その x をしたの式にあてはめて、y を求める。 x^2 + y^2 = r θをなん分割するかだけど、 r * 6 ぐらいあれば十分。。。かな?

TANUKIA
質問者

お礼

ありがとうございます。 遠い昔に三角関数と言う言葉を聞いたような聞かないような記憶があります。 この計算法だと1ドットずつ出すと言うことでしょうか。 最初画像を作るとなった時、画像のフォーマットを知ればそれでOKと思ったんですが、 よくよく考えると何か描画すると言うのは全部2次元平面の数式が必要なんですね。 ナメてました。 rからループ回数を出すと言うのは塗りつぶすドット数の数を出すと言う解釈でいいですよね。 二乗とかなるとイメージが掴みにくいのですが。

TANUKIA
質問者

補足

回答頂いた皆様には申しわけないですが、 ベストアンサーをどうするかの判別が付かないので 自分が納得できる描画の処理を書けてから選びたいを所存でございます。 すみませんがお待ちください。

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.2

ブレゼンハムのアルゴリズムという線分を描画するアルゴリズムがあります。 このアルゴリズムが成り立つ理屈を応用すると楕円を描画するアルゴリズムができます。 円は楕円の長辺と短辺を同じにしたものですから、この方法でも可能です。

TANUKIA
質問者

お礼

ありがとうございます。 こちらも見つける事ができました。 もう少ししっかり考えた上で記述を書き直そうかと思います。

関連するQ&A

  • 数学の円の部分で質問があります。

    数学の問題で質問があります。 半径rの円がx軸とy軸に接し、かつ円(x-16)2乗+(y-9)2乗=81に外接している。 このとき、rの取りうる値をすべて求めよ。 途中式、答えまで詳しく書いていただけるとありがたいです。 よろしくお願いします

  • modを使用した平方根の求め方

    解き方が解からない問題があります。 どれだけ考えても解き方がわからないので、どなたかわかる方教えてください。 【解き方が解からない問題】 大きな素数の積n=pqが与えられた時、nを素因数分解するのは非常に難しい。 整数mと整数y(<m)が与えられた時y=x2(xの二乗) mod mなる整数解xが存在すれば、yは mod mで平方剰余であるという。 xを mod mでのyの平方根という。 mが素数7の時、 12(1の二乗の事です。二乗の書き方がわからなくて・・・)≡1 (mod 7) 、 22(2の二乗) ≡ 4 (mod 7) 32(3の二乗)≡2 (mod 7) 、 42(4の二乗) ≡ 2 (mod 7) 52(5の二乗)≡4 (mod 7) 、 62(6の二乗) ≡ 1 (mod 7) となるので、1、2、4が平方剰余で、各平方剰余には2個の平方根がある。 mが二つの素数の積の場合、4個の平方根がある。 ここまでが参考書に載ってる説明です。 ここから私がわからない問題です。 102(10の二乗) mod 77=23 n = 77 の素因数7と11から素因数の知識を利用してZのmod nでの平方根Sを計算する。 S2(Sの二乗) ≡ 23 mod 7 S2(Sの二乗) ≡ 23 mod 11 上の2つを解いて、mod 77での4つの平方根10、32、45、67を得る。 この2つの式から、何をどうやって計算して、4つの平方根10、32、45、67が導き出せたのかわかりません。 二乗の表記の仕方がわからず、とても見難くなってしまいました。すみません。 乱文になってしまいましたが、どなたかわかる方教えてください。 よろしくお願いします。

  • 数学II 円と直線

    数学の問題で、途中まで解いてみたもののわからなくなりました。 ご解説をお願いできたらと思います。 問題1, 円 X^2+Y^2ー4KXー2KY+20K-25=0 は、 どんな実数Kに対しても2つの定点を通る。その定点の座標を求めよ。 やってみたこと  円の式を、(   )^2+(    )^2=半径2乗の形にしてみたがその後どうして良いかわからず。 Kについて整理してみたもののその後どうして良いかわからず。 問題2、 中心がX+Y=5 上にあり、半径が√10である円がある。 この円が、X軸から長さ6の線分を切り取るとき、円の半径を求めよ。 やってみたこと 中心の座標を(M、N)とした。 X軸は、式がY=0の直線だとわかった。 そこで中心と半径を、 仮に決めた円の式(XーM)^2+(Y-N)^2=R^2 に代入した。 すると(XーM)^2+(Y-N)^2=10 となった。 また、円と直線の交点座標を求めるため、↑の円の式にY=0を代入した。 この後どうして良いかわからなくなった。 上記のような状態です。 ご解説をお願いいたします。

  • n乗根を複素平面で視覚的に解けないか?

    1の平方根は±1で複素平面上で0を中心に180度角をなしています。 1の3乗根も1と(1±√3)/2 で綺麗に120度になってます。 1の4乗根も ±1と±iでそれぞれ90度の角をなしてるんですね。 -1の平方根も±iで180度なんですね。 iの平方根はx軸と45度の角をなした線の上に180度の角を なして (2+√2i)/2と(-2-√2i)/2 ですかね。 ±1と±iの n乗根には何か複素平面上で規則がありそうですが、 なんか定理とか公式みたいなものってあるんでしたっけ。

  • C言語の数学関数

    C言語の数学関数で、double型実数Xの平方根(1/2乗)は「sprt(X)」ですが1/3乗や1/4乗、1/n乗(n:実数)はどうやって表せばいいんですか? 「pow()関数」を用いればいいんですか? 例えば、 1.2の1/3乗は→pow(1.2 , 1.0/3.0) 1.2の1/4乗は→pow(1.2 , 1.0/4.0) 1.2の1/12.3は→pow(1.2 , 1.0/12.3) となるのですか? 宜しくお願いします。

  • 描画プログラムで、2楕円に接する円を描く

    VBで円を描くプログラムを作っています。 2つの楕円に接し、片方の楕円円周上にある 1点を通過する円を描きたいです。 正確には、もう一方(通過点のない側)の円周上にある 2接円が通過する点を求めたいです。 楕円はxy座標に対して平行ではなく、さまざまに傾いています。 楕円A(接円の通過点がある) 楕円中心(Ax,Ay) 楕円長径Aa 楕円短径Ab 楕円長径ベクトルAaD(x,y) 楕円短径ベクトルAbD(x,y) 焦点As1(x,y)、As2(x,y) 通過点T1(x,y) 通過点を通る楕円Aの接線T1L 通過点を通る楕円AのベクトルT1LD(x,y) も出ています。 楕円B(接円の通過点がない) 楕円中心(Bx,By) 楕円長径Ba 楕円短径Bb 楕円長径ベクトルBaD(x,y) 楕円短径ベクトルBbD(x,y) 焦点Bs1(x,y)、Bs2(x,y) 楕円はいずれも、中心から長径方向のベクトルに進んだ点を始点に描画されています。 ちなみにこの2楕円+片方の楕円円周上通過点の2接円を考える前に 真円AB2つと、片方の円周上通過点Tの2接円も考えました。 円AおよびB 中心(x,y) 半径Ar、Br 円A上の通過点T(x,y) 通過点を通る円Aの接線T1L 通過点を通る円AのベクトルT1LD(x,y) 円A、Bはどちらも、中心からX軸方法に半径分の距離をとった座標 を始点に描画されています。 この場合は、 (1)真円A上にある通過点から円接線を引く。 (2)接線T1Lから、真円A中心方向に法線T1Nを引く。長さは円Bの半径 (3)2の法線の終点座標T1Ned(x,y)と円Bの中心をつなぐ線T1NBを取る (4)T1NedのX軸正方向水平線から、T1NとT1NBの角度を調べる (5)円B上に始点からT1NB-T1Nの角度をとった円周上点T2を取る。ここが2接円の通過点。 という感じでできました。(5)の計算が、手元に資料がないので曖昧なんですが。 真円2接の応用で楕円2接もトライしたのですがどうもできません。 よろしくお願いします!

  • 三角形と内接円の問題

    △ABCとその内接円があり、内接円と辺BC、CA、ABとの接点をそれぞれD、E、Fとする。 (1)AF=x、BD=y、CE=zとする。△ABCの面積Sと内接円の半径rをx、y、zで表せ (2)Iを内接円の中心とする。  P=(AB・BC・CA)/(AI・BI・CI)の最小値を求めよ。 x、y、zを正の数とすると不等式 (x+y+z)/3 ≧ xyzの三乗根 が成り立つことは用いてよい。 という問題に取り組んでいます。 (1)はヘロンの公式を利用して、 S=√(xyz)(x+y+z)、r=√(xyz)/(x+y+z) と一応なりました。 (2)なのですがAI、BI、CIなどをそれぞれ三平方の定理をもちいて出して代入してみると複雑でうまく計算できませんでした。何かいい方法はありませんでしょうか 回答いただけるとありがたいです。 宜しくお願いします

  • 円の方程式の微分について

    円の方程式の微分について (x-a)^2+(y-b)^2=r^2 という円の微分について教えてください。 変形して、 (y-b)^2=r^2-(x-a)^2 y={r^2-(x-a)^2}^(1/2)+b これを微分すると、 y'=(1/2)×{r^2-(x-a)^2}^(-1/2)×(2a-2x) になると考えました。 これで、答えがあっているのでしょうか? この微分を用いて、任意の中心(a,b)をもつ半径rの円をX軸で回転させたときの面積を求めるつもりです。 ある製品の表面積を求めたいのですが、数学が不得意で苦労しています。 よろしくお願いします。

  • 円の最短距離。。。

    円C:x2乗+y2乗ー16x-18y+96=0上の点と、直線J;4x+3y=5との最短距離を求めよ。。 最短距離というのはなんですか?自分の教科書簡単な方なので載ってません。 二次関数f(x)=x2乗+axのー2≦x≦2における最大値M(a)を求よ。 これは平方完成したら解けると思いしたんですがそれから先がピンときません。

  • 二次関数の問題

    (1)y=xの二乗-4x+3 (2)y=2xの二乗+8x+3 (3)y=-3xの二乗+6x+1 (4)y=-xの二乗+3x の四問を平方完成を利用して解き、それぞれ軸と頂点を求めるという問題が分かりません。 今週の月曜日に学校で答えないといけないので、それまでに分かる方教えてください。 よろしくお願いします。