![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
form1上に button1 と textbox1 を張り付けてください。
辺の長さ r1,r2,r3 が同じになるはずですがなりません。どなたか。助けて下さい。
私は、dimの integer,singleか、パソコンの解像度の問題か?とも思いますが?
よろしくお願いします。
pblic Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim g As Graphics = Me.CreateGraphics
Dim x1, y1 As Integer '点A の座標
Dim x2, y2 As Integer ' 点B の座標
Dim x3, y3 As Integer '点Cの座標 点Aの周りにABを60度回転した点。
Dim r1, r2, r3 As Integer
Dim rd As Single = 60 * 3.14159 / 180 '60度回転
x1 = 500 : y1 = 400 ' ' 点A
x2 = 550 : y2 = 450 '点B
g.DrawLine(Pens.Black, x1, y1, x2, y2) ' 直線 AB
r1 = Math.Sqrt((x2 - x1) ^ 2 + (y2 - y1) ^ 2) 'r1=AB
x3 = 500 + r1 * Math.Cos(rd)
y3 = 400 - r1 * Math.Sin(rd)
r2 = Math.Sqrt((x3 - x2) ^ 2 + (y3 - y2) ^ 2) ' r2=BC
r3 = Math.Sqrt((x3 - x1) ^ 2 + (y3 - y1) ^ 2) ' r3=AB
TextBox1.Text &= "x3=" & x3 & vbCrLf
TextBox1.Text &= "y3=" & y3 & vbCrLf
TextBox1.Text &= "r1=" & r1 & vbCrLf
TextBox1.Text &= "r2=" & r2 & vbCrLf
TextBox1.Text &= "r3=" & r3 & vbCrLf
End Sub
End Class
No.1ベストアンサー
- 回答日時:
ざっとコードを見ただけですが,回転する角度が間違っているようです。
X軸と直線ABの角度分だけ回転する角度から補正してやらないと,各頂点のなす角が60度になりません。
通常は,回転行列を掛けた式を展開ものを利用します。
http://ja.wikipedia.org/wiki/%E5%9B%9E%E8%BB%A2% …
yune-kichi さんありがとうございました。張り付けて下さったwikipedia ページのおかげで思い出しました。ずーと昔の公式、行列の計算めんどうなですよね、掛け算、逆行列のあたり。回答者お二人のおかげでなんとか、それらしい三角形がかけましたが、三辺が等しくなりません許容範囲ですか?
こう結論してもいいですか? A(x1,y1),B(x2,y2)がある。線分ABを点Aの周りにラジアン角θだけ 回転したとき点B(x2,y2)は 点C(x3,y3)に移動する。
x3=(x2-x1)*cosθ-(y2-y1)*sinθ+x1
y3=(x2-x1)*sinθ+(y2--y1)*sinθ+y1
残された問題はx2とx1,y2と,y1の大小関係でどう変わのかが私は理解できていません。
ご指導お願いします。お二人に感謝します。グラヒックスの最初の難関です。
今後ともよろしくお願い。
No.3
- 回答日時:
(1)コンピュータの計算は有限の桁しか使えないので、どうしても誤差が出ます。
(特に√やπのような無理数)
(2)座標には整数型を使っているので、この時点で実数→整数の変換による誤差があります。
小数点以下を丸めるため、 |e|<1.0 の誤差があります。
例えば
r1 = Math.Sqrt((x2 - x1) ^ 2 + (y2 - y1) ^ 2) 'r1=AB
中のSqrtの中の計算は、整数同士の加減乗算だけなので(桁溢れになるほどの大きな値でなければ)正確です。
ですが、 Sqrtで計算した段階で、 真の√((x2 - x1) ^ 2 + (y2 - y1) ^ 2) とは違います。(1)
これをIntegerの変数r1に代入するので、Single→Integerの型変換が行われます。このときに小数点以下が切り捨てられます(2)
x3 = 500 + r1 * Math.Cos(rd)
同様にrdは誤差を含みます。60π/360 を正確に表わすことはできません。
角度の誤差とCos(rd)自体の丸め誤差とが加わります。
その誤差を含むcos(rd)に、誤差を含むr1を掛けています。
これをx3に入れるので、また小数点以下が切り捨てられます。
と、たったこれだけの計算でも、誤差の発生が沢山あります。
詳しい対策は、「浮動小数点数 誤差 対策」とでも検索してみてください。
ひとまず、簡単なものは
○Singleではなく、有効数字の大きい Double型を使う。
現在のPCでの計算なら、Singleを使う意味はありません(メモリサイズ以外)
座標のx1,y1等もDoubleにします。
○内部の計算用と、画面座標とを分けて考える
変数x1,y1をDoubleにしましたが、DrawLineでは整数です。
このような場合は、DrawLineに指定するときだけCInt等を使って整数にします。
○定数は、用意されているがあったら使う
πとして3.14159を使っていますが、これを 3.141592 とするだけで、cos,sinの値も結構変ってきます。なので、できるだけ誤差の少ないπを使いたいものです。
https://msdn.microsoft.com/ja-jp/library/system. …
そこで、Math.PIを使うと、Doubleで表現したときに最もPiに近い値が既に用意されています。
丁寧な説明ありがとうございます。integer,single,double,で何を使うか、いい加減にやっいぇきたの
が、いけなかっのです。
No.2
- 回答日時:
x3 = 500 + r1 * Math.Cos(rd)
y3 = 400 - r1 * Math.Sin(rd)
これは、 (500,400)を中心に、(500+r1,400+0)の点から60度回転させた座標になります。
B点は(550,450)ですから、(500+r1,400+0)ではありません。
x4 = 500 + r1 * Math.Cos(0.0)
y4 = 400 - r1 * Math.Sin(0.0)
とでもして、0度の点がどこにあるのか、見てください
kmee さんありがとうございました。平行移動の事をきずきました。
二人のおかげで何とかそれらしい正三角形ができましたが、三3辺が微妙にちがうのです。
これはしかたないのでしょうか?あと、点Aと点Bの位置関係によって点Cの位置が違うのでは
という疑問です。このあたりについて、またご指導いただきたいのですが。
それらしくできたコードを投稿しますから、よろしくお願いします。
実は、kmee さんへのおれいを3時ごろかいて、そのあとno1の yune-kichi さんっへのお礼を
書いて全体を見るとkmee さんへのお礼が消えているのです。なんで?
数字おーばーだったということか?
今後ともよろしくお願いします。投稿はこの2月が初めてなのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:13
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- その他(プログラミング・Web制作) ボールの動きがスムーズに動いてかつ目盛り線描画を維持するためには 4 2023/05/31 10:01
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Visual Basic(VBA) エクセル VBAについて教えてください 2 2023/04/26 13:25
- その他(プログラミング・Web制作) Pythonによる物理の斜方投射の位置座標表示について 2 2023/06/05 12:46
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
3次元空間上の2つの座標から...
-
ワード上Shapeの位置情報を統一...
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
複数の回転する長方形の衝突判定
-
WM_NCHITTESTの流れ
-
タッチパッドのタッチ座標取得
-
VBで、開いているExcelシートの...
-
始点、終点の二つの座標と半径...
-
抽出した特徴点の座標を取得し...
-
選択範囲の座標値の抽出
-
空間座標(3次元)を平面座標(2次...
-
エクセルで回転する座標の出し方
-
内積を用いた移動する線分と円...
-
プログラミングの問題について...
-
任意軸回転を、XYZ軸回転の...
-
シーケンサー(PLC?)で制...
-
ダイアログ内コントロールの位...
-
ASP.NET フォーム上でp...
-
弧の角度から座標を求めるには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
3次元空間上の2つの座標から...
-
エクセルである点からの距離で...
-
エクセルで回転する座標の出し方
-
ワード上Shapeの位置情報を統一...
-
始点、終点の二つの座標と半径...
-
閉図形の座標の配列が右回りか...
-
シーケンサー(PLC?)で制...
-
C言語 配列で座標
-
Excel VBA で自在に図形を変化...
-
多角形の内部かどうか判定する方法
-
以下のプログラムは重心を求め...
-
交差する2線分の交点座標の求め方
-
ダイアログ内コントロールの位...
-
ガウシアンフィルタのCプログラム
-
空間上の二点を結ぶ直線上に任...
-
スクリーン座標からワールド座...
-
回転する矩形同士の当たり判定...
-
PPTのVBA スライド右下端の座...
おすすめ情報
昔20年も前、vb6.0 を有償で買って参考書を頼りに勉強していたのですが
回転の公式を思い出して2点を指定して正三角形を描くプログラム((?)を作ろうとしたのですが
やはりできません。ここで再び挫折か!という心境です。見苦しい泣き言でした。
それなりのコード(プログラムというのも恥ずかしいので)が、できたのですが
点Aではなく、点Bの周りの回転になっているようです。(0,0)がformの右上にあることは知っているのですが、数学上公式とVBで使う定義式は違うのでしょうね。もうしばらく時間をください。