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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.56203 の関連記事表示

<< 0 >>
■56203  cからVB6に移植お願い
□投稿者/ かめ -(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>
親記事 /過去ログ94より / 関連記事表示
削除チェック/

■56204  Re[1]: cからVB6に移植お願い
□投稿者/ επιστημη -(2011/01/04(Tue) 21:51:42)
>
    > 誰か移植できる方、お願いできませんか?

    移植が正しいか検証するためのテストコードを提供していただけますか?
記事No.56203 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56219  Re[2]: cからVB6に移植お願い
□投稿者/ マサヤ -(2011/01/05(Wed) 09:40:06)
    計算式のところで0が消えてるみたいですが、これってC++じゃないでしょうか?
    >VB6でないと読めない。
    とは、かめさんのことですよね?「私はVB6以外は理解できません」、とした方がわかりやすいです。
    C++からc#に移植をしたい、と。
    それで、工数はいかほどでしょうか?
記事No.56203 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56222  Re[3]: cからVB6に移植お願い
□投稿者/ shu -(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 とだいたい同じ


    ざっと見てこれだけ分かればなんとかなるんじゃないかな?
記事No.56203 のレス /過去ログ94より / 関連記事表示
削除チェック/

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

    掲示板の使い方が分からなければ書き換える前に新しいトピックで
    使い方を確認する内容を書き込めば良いかと思います。よくある掲示板と
    書き方が異なるとも思えませんが。
記事No.56203 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56237  Re[5]: cからVB6に移植お願い
□投稿者/ マサヤ -(2011/01/06(Thu) 12:33:21)
    何を作りたいか、設計されてますか?
    【人工衛星の打ち上げシュミレーションプログラム】
    必要な情報
    ・発射地点の緯度、経度
    ・打ち上げ方位
    ・打ち上げ角度
    ・打ち上げ速度
    などなど

    で、それらの情報をもとに、衛星軌道面の真近点角の計算とか衛星軌道面の離心近点角の計算とかするのですよね?
    リプレース元の設計書がなかったらご自分で詳細設計をなさることをお勧めします。
    その上で、メソッドの書き方など不明な点がございましたらご質問願います。
    どこまで理解して、どこがわからないかを明記願います。
記事No.56203 のレス /過去ログ94より / 関連記事表示
削除チェック/

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

    書き込まれた内容からすると何とか読めたのかのカナと思いますので
    頑張ってプログラムを仕上げられてください。
    まるっと移植お願いしますではなくて、この部分が分からないのですかなら
    それなりにレスもつくと思います。
    自分なりに解釈してやって見た結果と一緒に相談されると良いかなと思います。
記事No.56203 のレス /過去ログ94より / 関連記事表示
削除チェック/

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

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


    マサヤ様へ

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

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










記事No.56203 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56270  Re[8]: cからVB6に移植お願い
□投稿者/ 魔界の仮面弁士 -(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


    > から、ルンゲタック法等を引用しました。
    ルンゲ・クッタ法の事?
記事No.56203 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56277  Re[9]: cからVB6に移植お願い
□投稿者/ かめ -(2011/01/07(Fri) 15:09:34)
    No56270 (魔界の仮面弁士 さん) に返信


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

    >>から、ルンゲタック法等を引用しました。
    > ルンゲ・クッタ法の事?
    あまり聞き慣れない計算法なので、間違いばかりでした。
    すみませんでした。
記事No.56203 のレス /過去ログ94より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -