- ベストアンサー
VB2010で曲線の書き方。
VB2010でPictureBoxの中に2点を結ぶ曲線を書きたいのですが、どのようにしたらかけるのか教えていただきたいです。 (例) (0,-1)、(1,0)の2点を結ぶ y=3x^3-2x-1のという3次曲線を書く。 直線までならGraphicクラスを用いて、g.drawlineを使う、複数点を通るスプライン曲線を書くならg.drawcurveなどどいうメソッドがあるのですが、このような3次式や2次式の線は書けないのでしょうか?解答よろしくお願いします。
- jastaway0124
- お礼率25% (3/12)
- Visual Basic
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず、物理的に描けないという事は認識していますか? 少なくとも最小単位はピクセルになりますし、点画に なります。 これは、正確には DrawLine で直線さえも描けていない という意味でです。 勿論、近似の点をプロットして人間の目に目的の曲線 っぽく表示するのが目的だとは分かっていますが、 上の原理が分かっていれば、座標計算して点を1つ1つ 塗りつぶしていく事で、あらゆる図形が描けることを 理解できるはずです。 で、それを自動で描いてくれるような機能はありません。 表現するのが何次式なのか?あらゆる条件をクリアできる ような機能を実現するのは難しいでしょう。 かといって自分で描くのも大して難しくないです。 数式の1の単位を画面上の何ピクセルに対応させているか を決め、例えば50ピクセル単位だったら、1ピクセルは 数列の0.02間隔に対応しますから、xを0.02単位でループ で加算していき、その時のyを計算すれば良いだけです。 求められた(x,y)の点を順に塗りつぶしていくだけです。 精度を求めず、スピード重視なら、xを間引きます。 ピクセル単位で計算するのに0.02単位であれば、0.04 単位にすれば計算回数は半分になります。点は1ピクセル ずつ歯抜けになります。この場合、2点間を直線で結べば 間の点が埋まります。
その他の回答 (1)
- MARU4812
- ベストアンサー率43% (196/452)
>1ずつプロットだとひどい精度になってしまいそうですが 数値の1ではなく、1ピクセルですよ? 画面解像度は分かりますか?画面のプロパティで1024×768等 の数値で単位はピクセルです。これが画素数であり、パソコンが 色のついた点を表示できる数です。 今見ている画面は、それ以上細かい表示はできないということです。 今見ている画面がひどい精度だと思うなら、それ以上は表示 する方法がありません。あとは、人間の目に(錯覚で)滑らかに 見えるようにスムージング(アンチエイリアス)と呼ばれるような 加工をするくらいです。 あと、コンピュータの座標系は左上隅が(0,0)なので注意して 下さい。 http://www.atmarkit.co.jp/fdotnet/dotnettips/377screentoclient/screentoclient.html
関連するQ&A
- Βスプライン曲線とベジェ曲線について
パソコンの本を読んでいてtruetypeフォントは2次のΒスプライン曲線を使っていますと紹介されて以下の2式で描けますとだけしか書かれていなかったのでよくわかりませんでした。 Βスプライン曲線の x=(1-t)^2x1+2(1-t)tx2+t^2x3 y=(1-t)^2y1+2(1-t)ty2+t^2y3 0≦t≦1 という式はどのように導き出すのでしょうか? また ベジェ曲線についてもどのように導き出すのでしょうか?
- ベストアンサー
- 数学・算数
- 二次曲線の問題>_<?
(1)放物線y^2+2y+4x-1=0を点(2,1)に関して対象に移動した曲線を求めよ。 (2)だ円2x^2+3y^2-1=0を 直線x+y=1に関して対称に移動した曲線を求めよ。 ⇔ まず(1)は題意の式の上にある点をP(x、y)として、点A(2.1)と対称なところQ(X,Y)として中点の座標の定理を使って、もとめたものを、再度題意の長い式に戻してあげて、曲線の式が求まりました。 で、(2)がよくわかりません>_< 2x^2+3y^2-1=0上の点をP(x,y)とし、これと直線x+y=1に対して対称な点、つまり知りたい部分を大文字のX,Yで表してQ(X,Y)としました。 PQの中点は(1)と同じで、R(x+X/2,y+Y/2)となり これはx+y=1の式をみたら、=1を式の後ろに付けれるので、(x+X/2,y+Y/2)=1とまでできました>_< でもこの後が出来ませんでした。 あと、念のため図を描いたのですけど、Pの楕円を一つ、あと、Qの楕円を(楕円かわからないですけど今は>_<)書いてみて、その二つの楕円の間に、距離が対称となるように、直線x+y=1を書きました。 でココの部分で質問なのですけど、 私の図は楕円同士を結ぶ 直線PQと、直線x+y=1の二つの直線が 垂直ではないのですけど合ってますか>_<??? 一応中点の座標Rの位置は点Pに対してと点Qに対して同じ距離、たとえば、ノートの図の上では1cm取っているので、これでOKだと思ったのですけど。。 もしPQと直線x+y=1の線が 垂直とかだったら、垂直の公式mm’=-1が使えると考えたのですけど>_< でも、垂直にしないといけない理由が思い浮かばないので解りませんでした>_< 誰かこの問題教えてください>_<!!! 宜しくお願いします!!
- ベストアンサー
- 数学・算数
- PictureBoxの描画について
VB2005を使用してPictureBoxに線を描きました。 Dim g As Graphics = PictureBox1.CreateGraphics() g.DrawLine(p, X1, Y1, X2, Y2) 線は上手く描けたのですが、表示している画面(Form)を最小化して再度最大化すると、描いた線が消えてしまいます。FormをHideしてもう一度Showしても同じです。 この描画を消さないようにするには、どうすればよいでしょうか?
- ベストアンサー
- Visual Basic
- VB.NETのグラフィック描画で困っています
VB.NETでのグラフィックの記述方法ですが 何かをクリックすると描画させるのではなく 単にあるsubプロシージャ内でグラフィックを描画させる記述する方法として pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) を教えていただきました。そこで private sub xy_keisan() '座標を計算させるプロシージャ disp_x() 'x座標に目盛りを表示させるプロシージャ disp_Y() 'xの目盛り数によってY座標の位置を変えて表示させるプロシージャ end sub private sub disp_x() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub private sub disp_y() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub のような記述(引数とか細かい所は端折っています)ですとdisp_yは描画されていますが,disp_xは消えてしまいます。 pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) が消えてしまう原因だとおもって宣言場所を変えてみましたが同じです 逆にこれが無いと描画させることが出来なくなります。 これの意味も今ひとつ判りません よろしくお願い致します
- ベストアンサー
- Visual Basic
- 2円を通る直線・曲線
数IIの図形と方程式の範囲で 「2曲線 f(x,y)=0、g(x,y)=0 が共有点を持つとき、曲線f(x,y)+kg(x,y)=0 (k:定数) もこの共有点を通る。」 というものがありますが、理由がよく分かりません。またk=-1のとき共有点を通る直線になるのもいまいち分かりません。 どなたか解説お願いします。
- ベストアンサー
- 数学・算数
- sin曲線とcos曲線を描くプログラムについて
お世話になります。 Javaのプログラミングを習い始めたものです。 標記の件ですが、プログラムを見てもどうしてそうなるかが さっぱりわからない部分があります。 import java.awt.*; import java.applet.*; public class Example2 extends Applet{ public void paint(Graphics g){ // 座標軸を描く g.drawLine(20, 10, 20, 130); g.drawLine(20, 70, 230, 70); // sinカーブを描く(20->220) g.setColor( Color.blue); int x0, y0, x1, y1; x1 = 20; y1 = 70; for (int i = 1; i <= 20; i++){ x0 = x1; y0 = y1; x1 = 20+(int)(i/20.0*200); y1 = 70-(int)(50.0*Math.sin(i/20.0*2*Math.PI)); g.drawLine(x0, y0, x1, y1); } // cosカーブを描く(20->220) g.setColor( Color.red); x1 = 20; y1 = 20; for (int i = 1; i <= 20; i++){ x0 = x1; y0 = y1; x1 = 20+(int)(i/20.0*200); y1 = 70-(int)(50.0*Math.cos(i/20.0*2*Math.PI)); g.drawLine(x0, y0, x1, y1); } } これで、赤と青の曲線が描かれるわけですが、 x1 = 20+(int)(i/20.0*200); y1 = 70-(int)(50.0*Math.sin(i/20.0*2*Math.PI)); の部分がさっぱりわかりません。 今まで、"int"は変数宣言でしか用いられなかったのに、 今回突然この式の中に組み込まれており困惑しています。 また、iが回数を表すのはわかりますが、それを全回数で割ったり、 x1の式の中でなぜ200を掛けるのか、 y1の式の中でなぜ2を掛け、さらに円周率まで掛けるのかが どうしても理解できません。 どなたか、ご教授願えませんでしょうか。 あるいは、参考になるサイトを教えていただければ助かります。 どうぞよろしくお願いいたします。
- ベストアンサー
- Java
- 曲線の式を求めるには・・・
複数の点の座標から直線の式を求めるときには最小二乗法をよく使いますが、 曲線の式ならばどのように求めればいいでしょうか? 例えば X 0.0056356 0.00141 0.00281 0.00703 0.0141 Y 0.0113 0.0354 0.0842 0.269 0.792 のような形で出題される場合です。 できれば作図無しで求められる方法がいいです。 もし詳しい方がいましたら教えてください。
- ベストアンサー
- 数学・算数
- 数III 曲線の長さ
条件(1)(2)をみたす曲線cの方程式y=f(x) (x≧0)を求めよ。 (1) 点(0,1)を通る。 (2) 点(0,1)から曲線c上の任意の点(x,y)までの曲線の長さLがL=e^(2x)+y-2で与えられる。 よろしくお願いします。
- ベストアンサー
- 数学・算数
- 近似曲線の使い方について
Excel2007(Win版)を使っているのですが、 現在、近似式をデータを選択してグラフに直線(自分の場合は1次式ですので)描くことはできたんですが、データ以外の範囲は表示されなくて困っています。 もっと、具体的にいうと現在y=5x+20という近似式の直線が書かれているのですが、基になるデータがx=5,y=45 x=10,y=70 という二つのデータから近似曲線を描いたとすると、直線はxは5~10まで、yは45~70までの範囲でしか書かれていません。 これをなんとかx=0~100 y=0~100までの範囲で書きたいのですが、何か良い方法はないものでしょうか? お返事お待ちしております。
- ベストアンサー
- その他MS Office製品
補足
g.drawlineは直線を引いてくれるものと勘違いしていました。 なるほど、自動でやってくれるというものではないのですね。 下の0.02でプロットしていくとのアドバイスですが、プロットはg.DrawEllipseで円を書くのを利用してしていく感じで(もっといい方法があったら教えていただきたいですが)、それをループしていけばいいのですが、VB2010では座標は整数値でしか扱えないですよね・・・。当然drawEllipseもinteger型しか引数に受け付けませんし。 1ずつプロットだとひどい精度になってしまいそうですが、これが精一杯って感じになってしまうのでしょうか?よろしくお願いします。