• ベストアンサー

VB2010で曲線の書き方。

VB2010でPictureBoxの中に2点を結ぶ曲線を書きたいのですが、どのようにしたらかけるのか教えていただきたいです。 (例) (0,-1)、(1,0)の2点を結ぶ y=3x^3-2x-1のという3次曲線を書く。 直線までならGraphicクラスを用いて、g.drawlineを使う、複数点を通るスプライン曲線を書くならg.drawcurveなどどいうメソッドがあるのですが、このような3次式や2次式の線は書けないのでしょうか?解答よろしくお願いします。

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

  • ベストアンサー
  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

まず、物理的に描けないという事は認識していますか? 少なくとも最小単位はピクセルになりますし、点画に なります。 これは、正確には DrawLine で直線さえも描けていない という意味でです。 勿論、近似の点をプロットして人間の目に目的の曲線 っぽく表示するのが目的だとは分かっていますが、 上の原理が分かっていれば、座標計算して点を1つ1つ 塗りつぶしていく事で、あらゆる図形が描けることを 理解できるはずです。 で、それを自動で描いてくれるような機能はありません。 表現するのが何次式なのか?あらゆる条件をクリアできる ような機能を実現するのは難しいでしょう。 かといって自分で描くのも大して難しくないです。 数式の1の単位を画面上の何ピクセルに対応させているか を決め、例えば50ピクセル単位だったら、1ピクセルは 数列の0.02間隔に対応しますから、xを0.02単位でループ で加算していき、その時のyを計算すれば良いだけです。 求められた(x,y)の点を順に塗りつぶしていくだけです。 精度を求めず、スピード重視なら、xを間引きます。 ピクセル単位で計算するのに0.02単位であれば、0.04 単位にすれば計算回数は半分になります。点は1ピクセル ずつ歯抜けになります。この場合、2点間を直線で結べば 間の点が埋まります。

jastaway0124
質問者

補足

g.drawlineは直線を引いてくれるものと勘違いしていました。 なるほど、自動でやってくれるというものではないのですね。 下の0.02でプロットしていくとのアドバイスですが、プロットはg.DrawEllipseで円を書くのを利用してしていく感じで(もっといい方法があったら教えていただきたいですが)、それをループしていけばいいのですが、VB2010では座標は整数値でしか扱えないですよね・・・。当然drawEllipseもinteger型しか引数に受け付けませんし。 1ずつプロットだとひどい精度になってしまいそうですが、これが精一杯って感じになってしまうのでしょうか?よろしくお願いします。

その他の回答 (1)

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.2

>1ずつプロットだとひどい精度になってしまいそうですが 数値の1ではなく、1ピクセルですよ? 画面解像度は分かりますか?画面のプロパティで1024×768等 の数値で単位はピクセルです。これが画素数であり、パソコンが 色のついた点を表示できる数です。 今見ている画面は、それ以上細かい表示はできないということです。 今見ている画面がひどい精度だと思うなら、それ以上は表示 する方法がありません。あとは、人間の目に(錯覚で)滑らかに 見えるようにスムージング(アンチエイリアス)と呼ばれるような 加工をするくらいです。 あと、コンピュータの座標系は左上隅が(0,0)なので注意して 下さい。 http://www.atmarkit.co.jp/fdotnet/dotnettips/377screentoclient/screentoclient.html

関連するQ&A