【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード

VB2010でPictureBoxの中に2点を結ぶ曲線を書きたいのですが、どのようにしたらかけるのか教えていただきたいです。

(例)
(0,-1)、(1,0)の2点を結ぶ y=3x^3-2x-1のという3次曲線を書く。

直線までならGraphicクラスを用いて、g.drawlineを使う、複数点を通るスプライン曲線を書くならg.drawcurveなどどいうメソッドがあるのですが、このような3次式や2次式の線は書けないのでしょうか?解答よろしくお願いします。

A 回答 (2件)

まず、物理的に描けないという事は認識していますか?


少なくとも最小単位はピクセルになりますし、点画に
なります。
これは、正確には DrawLine で直線さえも描けていない
という意味でです。

勿論、近似の点をプロットして人間の目に目的の曲線
っぽく表示するのが目的だとは分かっていますが、
上の原理が分かっていれば、座標計算して点を1つ1つ
塗りつぶしていく事で、あらゆる図形が描けることを
理解できるはずです。

で、それを自動で描いてくれるような機能はありません。
表現するのが何次式なのか?あらゆる条件をクリアできる
ような機能を実現するのは難しいでしょう。

かといって自分で描くのも大して難しくないです。
数式の1の単位を画面上の何ピクセルに対応させているか
を決め、例えば50ピクセル単位だったら、1ピクセルは
数列の0.02間隔に対応しますから、xを0.02単位でループ
で加算していき、その時のyを計算すれば良いだけです。
求められた(x,y)の点を順に塗りつぶしていくだけです。

精度を求めず、スピード重視なら、xを間引きます。
ピクセル単位で計算するのに0.02単位であれば、0.04
単位にすれば計算回数は半分になります。点は1ピクセル
ずつ歯抜けになります。この場合、2点間を直線で結べば
間の点が埋まります。

この回答への補足

g.drawlineは直線を引いてくれるものと勘違いしていました。
なるほど、自動でやってくれるというものではないのですね。

下の0.02でプロットしていくとのアドバイスですが、プロットはg.DrawEllipseで円を書くのを利用してしていく感じで(もっといい方法があったら教えていただきたいですが)、それをループしていけばいいのですが、VB2010では座標は整数値でしか扱えないですよね・・・。当然drawEllipseもinteger型しか引数に受け付けませんし。

1ずつプロットだとひどい精度になってしまいそうですが、これが精一杯って感じになってしまうのでしょうか?よろしくお願いします。

補足日時:2011/10/12 15:02
    • good
    • 0

>1ずつプロットだとひどい精度になってしまいそうですが


数値の1ではなく、1ピクセルですよ?
画面解像度は分かりますか?画面のプロパティで1024×768等
の数値で単位はピクセルです。これが画素数であり、パソコンが
色のついた点を表示できる数です。
今見ている画面は、それ以上細かい表示はできないということです。

今見ている画面がひどい精度だと思うなら、それ以上は表示
する方法がありません。あとは、人間の目に(錯覚で)滑らかに
見えるようにスムージング(アンチエイリアス)と呼ばれるような
加工をするくらいです。

あと、コンピュータの座標系は左上隅が(0,0)なので注意して
下さい。
http://www.atmarkit.co.jp/fdotnet/dotnettips/377 …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!