C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: cからVB6に移植お願い


(過去ログ 94 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■56203 / inTopicNo.1)  cからVB6に移植お願い
  
□投稿者/ かめ (1回)-(2011/01/04(Tue) 21:24:25)

分類:[C#] 

2011/01/05(Wed) 20:22:03 編集(投稿者)
2011/01/05(Wed) 20:21:37 編集(投稿者)
2011/01/05(Wed) 20:21:18 編集(投稿者)

<pre><pre>この掲示板の使い方がよく解らない。
自分なりにやってみます。ありがとうございました。

皆さんへ!!!!!
人工衛星の打ち上げシュミレーションプログラムを作成中、Cは少し理解できるのですが、RV2ELは、以下ソースの逆を行うプログラムですが、Cは少し理解できるのですが、ベクトル演算のようです。

Private Sub Form_Load()


A = 7278.165905 'km
E = 0.000444115
Inc = 99.114282 '(度)
Peri = 284.209888 '(度)
Node = 272.722924 '(度)
Ma = 168.026666 '(度)
End sub

Private Sub Command1_Click()
CalcKeplar 'TLE→Pos,Vel
RVel Pos, Vel'Pos,Vel→TLE
End Sub

’標準モジュール
Public A#, B#, Inc#, E#, Peri#, Node#, Ma#, MMo#

'ケプラリアン軌道要素からPos、Velを求める。
Public Sub CalcKeplar()

Dim Rad#, Pi#
Pi = 3.14159265358979
Rad = 0.0174532925

Dim Mk#, Ek#, Ec#

Mk = Ma * Rad

'衛星軌道面の離心近点角の計算 Ek (rad)
'ケプラーの方程式 Mk = Ek - E * SIN(Ek)
Ec = Mk + E * Sin(Mk)
KepLoop:
Ek = Mk + E * Sin(Ec)
If Abs(Ec - Ek) > 0.000000000001 Then
Ec = Ek
GoTo KepLoop
End If




Dim CosEk#, SinEk#
CosEk = Cos(Ek)
SinEk = Sin(Ek)

'衛星軌道面の真近点角の計算
Dim VK#
VK = Atn((1 - E ^ 2) ^ 0.5 * Sin(Ek) / (Cos(Ek) - E))
If (Cos(Ek) - E) < 0 Then
VK = VK + Pi
End If
If VK < 0 Then
VK = 2 * Pi + VK
End If


'離心近点角Ekから動径Pkを求める(動径Rkは地球重心から衛星までの距離)
Dim Rk#
Rk = A * (1 - E * Cos(Ek))

'動径Rkと真近点角Vkから衛星のxy座標を求める
'衛星軌道面の位置直交座標の計算
' Xk,Yk (m)
Dim Xk As Double, Yk As Double
Xk = Rk * Cos(VK)
Yk = Rk * Sin(VK)


Form1.List2.Clear
Form1.List2.AddItem "離心近点角(度): " & Ek / Rad
Form1.List2.AddItem "真近点角(度): " & VK / Rad
Form1.List2.AddItem "動径(km): " & Rk
Form1.List2.AddItem "x座標(km): " & Xk
Form1.List2.AddItem "y座標(km): " & Yk

B = A * Sqr(1 - E ^ 2) '軌道短半径計算

Dim AXNSL#, AYNSL#, XL#
AXNSL = E * Cos(Peri * Rad)
AYNSL = E * Sin(Peri * Rad)


'INTERMEDIATE QUANTITIES(中間値)
Dim ECosE#, ESinE#, EL2#, PL#, PL2#
ECosE = AXNSL * CosEk + AYNSL * SinEk
ESinE = AXNSL * SinEk - AYNSL * CosEk
EL2 = AXNSL * AXNSL + AYNSL * AYNSL
PL = A * (1# - EL2)
PL2 = PL * PL


Dim R#, Rdot#, RVdot#
R = A * (1# - ECosE)
Rdot = XKE * Sqr(A) / R
RVdot = XKE * Sqr(PL) / R

Dim NodeK#, IncK#
NodeK = Node * Rad
IncK = Inc * Rad


'*Orientation VECTORS
Dim SinUK#, CosUK#, SinNoK#, CosNoK#, SinIK#, CosIK#

SinUK = Sin(VK)
CosUK = Cos(VK)

SinNoK = Sin(NodeK)
CosNoK = Cos(NodeK)

SinIK = Sin(IncK)
CosIK = Cos(IncK)

Dim XMX#, XMY#, XMZ#
XMX = -SinNoK * CosIK
XMY = CosNoK * CosIK
XMZ = SinIK


Form1.List2.AddItem ""
Form1.List2.AddItem "XMX: " & XMX
Form1.List2.AddItem "XMY: " & XMY
Form1.List2.AddItem "XMZ: " & XMZ


Dim UX#, UY#, UZ#
UX = XMX * SinUK + CosNoK * CosUK
UY = XMY * SinUK + SinNoK * CosUK
UZ = SinIK * SinUK

Dim VX#, VY#, VZ#
VX = XMX * CosUK - CosNoK * SinUK
VY = XMY * CosUK - SinNoK * SinUK
VZ = SinIK * CosUK


'*POSITION AND VELOCITY
Dim x#, y#, z#, Xdot#, Ydot#, Zdot#

x = Rk * UX '* Xkmper
y = Rk * UY '* Xkmper
z = Rk * UZ '* Xkmper

Xdot = Rdot * UX
Ydot = Rdot * UY
Zdot = Rdot * UZ

Xdot = RVdot * VX + Xdot
Ydot = RVdot * VY + Ydot
Zdot = RVdot * VZ + Zdot


Form1.List2.AddItem ""
Form1.List2.AddItem "x: " & x
Form1.List2.AddItem "y: " & y
Form1.List2.AddItem "z: " & z
Pos(0) = x
Pos(1) = y
Pos(2) = z


Form1.List2.AddItem ""
Form1.List2.AddItem "Vx: " & Xdot
Form1.List2.AddItem "Vy: " & Ydot
Form1.List2.AddItem "Vz: " & Zdot
Vel(0) = Xdot
Vel(1) = Ydot
Vel(2) = Zdot


End Sub
</pre></pre>
引用返信 編集キー/
■56204 / inTopicNo.2)  Re[1]: cからVB6に移植お願い
□投稿者/ επιστημη (2584回)-(2011/01/04(Tue) 21:51:42)
επιστημη さんの Web サイト
> 誰か移植できる方、お願いできませんか?

移植が正しいか検証するためのテストコードを提供していただけますか?

引用返信 編集キー/
■56219 / inTopicNo.3)  Re[2]: cからVB6に移植お願い
□投稿者/ マサヤ (198回)-(2011/01/05(Wed) 09:40:06)
計算式のところで0が消えてるみたいですが、これってC++じゃないでしょうか?
>VB6でないと読めない。
とは、かめさんのことですよね?「私はVB6以外は理解できません」、とした方がわかりやすいです。
C++からc#に移植をしたい、と。
それで、工数はいかほどでしょうか?
引用返信 編集キー/
■56222 / inTopicNo.4)  Re[3]: cからVB6に移植お願い
□投稿者/ shu (341回)-(2011/01/05(Wed) 12:26:14)
/*


*/
これは複数行のコメント


//〜
これはここから行末までコメント


rr1[3]
これは大きさ3の配列(インデックスは0〜2)
代入、参照はrr1[0]のように書く


void Satellite :: rv2el(double* rr, double* vv)
これは Subだと思えばいい、::の前はクラス名なのであまり考えなくてもよい。
double* rr => Byref rr as doubleまたはByRef rr() as doubleと考えればよい
今回は配列なので後者


if (〜) 〜;
これは if 〜 then 〜 と同じ(1行if文)


if (〜) {


}
複数行のif文


for(int i = 0; i < 2; i++)
{


}
for i = 0 to 1 '<--- 2でなく1
Next
と同じ


n[0] == 0. && n[1] == 0.
== で等しいか判断しているVBでは=
&& は and と同じ
0. は 0.0 と同じ


xnodek += twopi
はxnodek = xnodek + twopi と同じ
i++, ++i は i= i+1 とだいたい同じ


ざっと見てこれだけ分かればなんとかなるんじゃないかな?

引用返信 編集キー/
■56232 / inTopicNo.5)  Re[4]: cからVB6に移植お願い
□投稿者/ shu (342回)-(2011/01/06(Thu) 08:40:14)
もとの内容を全部書き換えたらなんだか分かりませんよ。

掲示板の使い方が分からなければ書き換える前に新しいトピックで
使い方を確認する内容を書き込めば良いかと思います。よくある掲示板と
書き方が異なるとも思えませんが。
引用返信 編集キー/
■56237 / inTopicNo.6)  Re[5]: cからVB6に移植お願い
□投稿者/ マサヤ (201回)-(2011/01/06(Thu) 12:33:21)
何を作りたいか、設計されてますか?
【人工衛星の打ち上げシュミレーションプログラム】
必要な情報
・発射地点の緯度、経度
・打ち上げ方位
・打ち上げ角度
・打ち上げ速度
などなど

で、それらの情報をもとに、衛星軌道面の真近点角の計算とか衛星軌道面の離心近点角の計算とかするのですよね?
リプレース元の設計書がなかったらご自分で詳細設計をなさることをお勧めします。
その上で、メソッドの書き方など不明な点がございましたらご質問願います。
どこまで理解して、どこがわからないかを明記願います。

引用返信 編集キー/
■56239 / inTopicNo.7)  Re[6]: cからVB6に移植お願い
□投稿者/ PATIO (76回)-(2011/01/06(Thu) 13:51:16)
たぶん、一番下の所に返信用のフォームがある事に気がついていないのかなと思います。

書き込まれた内容からすると何とか読めたのかのカナと思いますので
頑張ってプログラムを仕上げられてください。
まるっと移植お願いしますではなくて、この部分が分からないのですかなら
それなりにレスもつくと思います。
自分なりに解釈してやって見た結果と一緒に相談されると良いかなと思います。

引用返信 編集キー/
■56264 / inTopicNo.8)  Re[7]: cからVB6に移植お願い
□投稿者/ かめ (2回)-(2011/01/07(Fri) 09:28:36)
No56239 (PATIO さん) に返信
> たぶん、一番下の所に返信用のフォームがある事に気がついていないのかなと思います。
>
> 書き込まれた内容からすると何とか読めたのかのカナと思いますので
> 頑張ってプログラムを仕上げられてください。
> まるっと移植お願いしますではなくて、この部分が分からないのですかなら
> それなりにレスもつくと思います。
> 自分なりに解釈してやって見た結果と一緒に相談されると良いかなと思います。
>

ありがとうございます。
掲示板の使用法に関して、まだうといのでご勘弁を・・・。
「自分なりに」移植してやってみました。E(離心率)のところで1以上となりオープンオービットでexitしてしまいました。何処がおかしいのかわからない。公開ソースには、エラーが有るのかな?


マサヤ様へ

打ち上げシュミレーションですが、http://homepage3.nifty.com/kubota01/BallisticMissile01.htm
から、ルンゲタック法等を引用しました。こんな知識のある方は
「はやぶさ」なんか簡単にシュミレートできるでしょうから、平和的なプログラムを公開してくらないですかね。
私のプログラムではアポジペリジでの加速又は減速による軌道変更も出来るようになりました。
準天頂衛星軌道擬き、なんかも表示する事が出来ました。
で、周回軌道中の飛翔体の軌道要素を算出表示したいと思っていました。
空間座標及びベクトルが既知ですので、これからケプラー軌道要素を算出するつもりでした。
ここで、引っかかってしまったわけです。

将来、どれくらい先になるのかわかないけど、
■打ち上げ時の空気抵抗を加味する。
■打ち上げ時の重量と比推力をより細かにシュミレートする。
■宇宙での発生推力を細かにシュミレートするため他のロケットも考える。
■2段ロケットで周回軌道に乗ったけど、今後の燃料を考え3段にする。
■地球脱出速度まで加速、また、スイングバイなんかも計算させて、
■太陽系の他の天体までの軌道変更シュミレートする。
とコツコツと、やっていきたいと考えています。
又面白いMathがでてきたら、寄り道してしまうけどね・・。
JAXAは、完璧な打ち上げ、軌道変更、大圏再突入なんか出来ているんでしょうけど、
その知識を少し公開してくれないかなと思ったりしています(笑)。











引用返信 編集キー/
■56270 / inTopicNo.9)  Re[8]: cからVB6に移植お願い
□投稿者/ 魔界の仮面弁士 (2013回)-(2011/01/07(Fri) 11:11:31)
2011/01/07(Fri) 11:12:48 編集(投稿者)
No56264 (かめ さん) に返信
>> cからVB6に移植お願い
>> 分類:[C#] 
C# と C と C++ は別の言語ですよ。
今回の場合、分類として [C#] を選択するのではなく、
[C/C++]、[VB6 以前] あたりの方が良かったかも。


>> Private Sub Command1_Click()
>>   CalcKeplar 'TLE→Pos,Vel
>>   RVel Pos, Vel 'Pos,Vel→TLE
>> End Sub

この手のプログラムを書くのであれば、各モジュールの先頭には
『Option Explicit』宣言を必ずつけておくことをお奨めします。

グローバル変数があちこちで使われた Coding Horror な状況ですが、
コメントから予想すると、
 Pos → position、x,y,zの位置を表す 0〜2の配列?
 Vel → velocity、位置vector座標を表す 0〜2の配列?
 TLE → Two-line elements フォーマットのこと?
でしょうか? (違うかも)


> Public Sub CalcKeplar()
>   Dim Rad#, Pi#
>   Pi = 3.14159265358979
>   Rad = 0.0174532925
有効桁数の揺れが気になりますが、それはさておき。

これらは固定値でしょうから、Const にした方が良いかと思います。

あるいは、Sub Main あたりで
 Pi = 4 * Atn(1)
 Rad = Pi / 180
として事前に算出しておく手もありますが。


> 掲示板の使用法に関して、まだうといのでご勘弁を・・・。
投稿前に、掲示板の利用規約を読んでおいてください。半角カナの利用は禁止されていますよ。
http://bbs.wankuma.com/index.cgi?mode=man


> E(離心率)のところで1以上となりオープンオービットでexitしてしまいました。
状況がさっぱり伝わってきません。(^^;

No56203 の VB6コード(2011/01/05 20:22:03 編集)を見ながら読んでみましたが、
 ・Command1_Click 内で呼び出されている RVel プロシージャが、その中で
  どのような処理を行っているのか不明なので、第三者が問題点を再現できません。
 ・No56264 で書かれた『E(離心率)』というのは、変数 E の事を指しているのだろうか?
  しかし、これが変数 E が 1.0 以上の値になってしまうという意味だと仮定しても、
  この変数への代入は、Form の Load イベントで行われているのみであり、
  値が書き換えられている様子は無いので、1 以上になる状況を想像しにくい。
  (掲載されていない部分で書き換えられているかも知れませんが…)
 ・ここでいうところの『オープンオービット』の意味が説明されていない。
 ・ここでいうところの『exit』が何を意味しているのか曖昧である。
  (Exit Sub/Exit Functionステートメントの意味? それとも何かの用語?)
という感じで、質問文の様相を呈していないように見えます。


> 何処がおかしいのかわからない。
アルゴリズムを理解できていないという事でしょうか?
それとも、計算方法は分かっているが、それを自力で VB6 のコードにできない状況でしょうか?
あるいは、とりあえずコーディングできたが、期待と異なる動作をしているのでしょうか?


> 公開ソースには、エラーが有るのかな?
元のコードに不具合があるかどうかは、事前に調査されていないのでしょうか?

そのような状況であれば、元のソースコードの各行がどのような処理を意図しているのか、
それぞれの意味を理解してから移植を進めた方が良いと思いますよ。そうしないと、
移植作業に問題があったのか、元コードのアルゴリズムに問題があったのか、あるいは
それ以外の要因(演算誤差等)なのかを判断できないでしょうし。


> 打ち上げシュミレーションですが、
     シミュレーション
http://www.tt.rim.or.jp/~rudyard/kaego002.html


> から、ルンゲタック法等を引用しました。
ルンゲ・クッタ法の事?
引用返信 編集キー/
■56277 / inTopicNo.10)  Re[9]: cからVB6に移植お願い
□投稿者/ かめ (3回)-(2011/01/07(Fri) 15:09:34)
No56270 (魔界の仮面弁士 さん) に返信


>>打ち上げシュミレーションですが、
>      シミュレーション
> http://www.tt.rim.or.jp/~rudyard/kaego002.html
なんですね。驚きました。

>>から、ルンゲタック法等を引用しました。
> ルンゲ・クッタ法の事?
あまり聞き慣れない計算法なので、間違いばかりでした。
すみませんでした。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -