3Dプログラミング講座・その17:ケプラー方程式カプセルライブラリ使用法


実際の使用例

太陽系惑星軌道計算シミュレーターフォーム by javascript

太陽系惑星軌道計算シミュレーターフォーム by javascript.zip

相対性理論衛星軌道計算シミュレーターフォーム by javascript

相対性理論衛星軌道計算シミュレーターフォーム by javascript.zip

占星術

占星術.zip


horoscope.htm


var BirthPlace = [
['アディスアベバ エチオピア', 9.022736, 38.746799], 
['アテネ ギリシャ共和国', 37.973620, 23.718989], 
['アビジャン コートジボワール', 5.336318, -4.027751], 
['アレキサンドリア エジプト', 31.228000, 29.957718], 
['アンマン ヨルダン', 31.949381, 35.932911], 
['イスタンブール トルコ共和国', 41.065960, 29.006069], 
['ウィーン オーストリア', 48.201841, 16.364571], 
['ウラジオストック ロシア連邦', 43.125469, 131.886398], 
['ウランバートル モンゴル国', 47.921378, 106.905540], 
['エルサレム イスラエル', 31.773750, 35.225220],
['オークランド ニュージーランド', -36.904148, 174.760498], 
['大阪 日本', 34.4112, 135.2946],
['オタワ カナダ', 45.411572, -75.698194], 
['カイロ エジプト', 30.064742, 31.249509], 
['カサブランカ モロッコ', 33.605381, -7.631949], 
['カブール アフガニスタン', 34.528455, 69.171703], 
['カラカス ベネズエラ・ボリバル共和国', 10.491016, -66.902061],
['キエフ ウクライナ', 50.453629, 30.503828], 
['キンシャサ コンゴ民主共和国', -4.320836, 15.298660], 
['グアテマラシティ グアテマラ', 14.624795, -90.532818], 
['クアラルンプール マレーシア', 3.150210, 101.707703], 
['クウェート クウェート国', 29.329404, 48.003930], 
['クライストチャーチ ニュージーランド', -43.523529, 172.638199], 
['ケープタウン 南アフリカ共和国', -33.924788, 18.429916], 
['コペンハーゲン デンマーク王国', 55.692829, 12.554125], 
['コルカタ インド', 22.543539, 88.334221], 
['コロンボ スリランカ', 6.927468, 79.848358], 
['サラエボ ボスニア・ヘルツェゴビナ連邦', 43.856430, 18.413420], 
['サンタフェデボゴタ コロンビア', 4.609866, -74.082050], 
['サンパウロ ブラジル', -23.581301, -46.622898],
['サンプトペテルブルグロシア連邦', 59.951889, 30.453329], 
['サンフランシスコ アメリカ合衆国', 37.775000, -122.418330], 
['サンホセ コスタリカ', 9.927128, -84.082012], 
['シアトル アメリカ合衆国', 47.606390, -122.330830], 
['シカゴ アメリカ合衆国', 41.850000, -87.650000], 
['シドニー オーストラリア', -33.891576, 151.241709], 
['ジブチ ジブチ共和国', 11.588599, 43.145850], 
['ジャカルタ インドネシア', -6.211544, 106.845172], 
['上海 中華人民共和国', 31.247869, 121.472702], 
['シンガポール シンガポール', 1.298828, 103.824898], 
['スコピエ マケドニア共和国', 42.003812, 21.452246], 
['ストックホルム スウェーデン', 59.286948, 18.072977], 
['ソウル 韓国', 37.532308, 126.957440], 
['ソフィア ブルガリア', 42.710543, 23.323827], 
['台北 台湾', 25.035089, 121.506699], 
['ダカール セネガル', 14.686680, -17.451920], 
['タシケント ウズベキスタン', 41.305229, 69.268967], 
['ダッカ バングラデシュ', 23.709921, 90.407143], 
['ダブリン アイルランド共和国', 53.341560, -6.257347], 
['ダマスカス シリア・アラブ共和国', 33.519299, 36.313450], 
['チュニス チュニジア共和国', 36.818810, 10.165960], 
['テヘラン イラン', 35.696216, 51.422945], 
['東京 日本', 35.41, 139.45],
['ドゥシャンベ タジキスタン', 38.565356, 68.775835], 
['ドバイ アラブ首長国連邦', 25.281892, 51.517541], 
['トビリシ グルジア', 41.709981, 44.792998], 
['トリポリ リビア', 32.876174, 13.187507], 
['ナイロビ ケニア共和国', -1.274359, 36.813106], 
['ニューデリー インド', 28.637690, 77.205824], 
['ニューヨーク アメリカ合衆国', 40.714170, -74.006390], 
['パース オーストラリア', -31.932854, 115.861940], 
['バグダッド イラク共和国', 33.332480, 44.418399], 
['パナマ パナマ共和国', 8.994269, -79.518792], 
['ハノイ ベトナム', 21.024250, 105.854694], 
['ハバナ キューバ', 23.116800, -82.388557], 
['パリ フランス', 48.852840, 2.349857], 
['バルセロナ スペイン', 41.384855, 2.172164], 
['バンクーバー カナダ', 49.242609, -123.099399], 
['バンコク タイ王国', 13.730780, 100.521004], 
['ビサウ ギニア・ビザウ共和国', 11.863980, -15.598210], 
['ビシュケク キルギス共和国', 42.870022, 74.587883], 
['平壌 北朝鮮', 39.031859, 125.753765], 
['ブエノスアイレス アルゼンチン', -34.611781, -58.417309],
['ブカレスト ルーマニア', 44.430481, 26.122980], 
['釜山 韓国', 35.157871, 129.054703], 
['ブダペスト ハンガリー', 47.490812, 19.080970], 
['プノンペン カンボジア', 11.558831, 104.917445], 
['ブラザビル コンゴ共和国', -4.280772, 15.283650], 
['プラハ チェコ共和国', 50.078816, 14.437635], 
['プリマス イングランド', 50.378535, -4.139914], 
['ブリュッセル ベルギー', 50.837051, 4.367612], 
['ベオグラード セルビア', 44.802416, 20.465601], 
['北京 中華人民共和国', 39.904491, 116.391468], 
['ヘルシンキ フィンランド共和国', 60.160791, 24.952548], 
['ベルリン ドイツ連邦共和国', 52.524268, 13.406290], 
['ホーチミン(旧名サイゴン) ベトナム', 10.759180, 106.662498], 
['香港 中華人民共和国', 22.278381, 114.174287], 
['マドリード スペイン', 40.422319, -3.704289], 
['マニラ フィリピン', 14.600657, 120.982150], 
['マルセイユ フランス', 43.291413, 5.375633], 
['ミュンヘン ドイツ', 48.139743, 11.560050], 
['ミラノ イタリア', 45.471156, 9.185727], 
['メキシコシティ メキシコ', 19.410636, -99.130588], 
['メルボルン オーストラリア', -37.809575, 144.965186], 
['モスクワ ロシア連邦', 55.746455, 37.631895], 
['モナコ モナコ公国', 43.739190, 7.427498], 
['モンテビデオ ウルグアイ', -34.8939, -56.15684],
['ヤンゴン ミャンマー連邦', 16.783656, 96.156831], 
['ラパス ボリビア', -16.49901, -68.146248],
['リオデジャネイロ ブラジル', -22.90937, -43.214998],
['リスボン ポルトガル', 38.727486, -9.148677], 
['リマ ペルー共和国', -12.093084, -77.046491],
['リヤド サウジアラビア', 24.640151, 46.724893], 
['ルアンダ アンゴラ共和国', -8.813513, 13.237476], 
['ローマ イタリア', 41.899344, 12.493110], 
['ロサンゼルス アメリカ合衆国', 34.052220, -118.242780], 
['ロンドン イギリス', 51.508967, -0.126127], 
['ワシントン アメリカ合衆国', 38.894561, -77.009571], 
['ワルシャワ ポーランド', 52.244949, 21.011881], 
['ンジャメナ チャド', 12.104797, 15.044506]]; 


var imgstr =['', 'sun.png','moon.png','mercury.png','venus.png','mars.png','jupiter.png','saturn.png','uranus.png','neptune.png',
               'pluto.png','ceres.png','pallas.png','juno.png','vesta.png','chiron.png','lilith.png','dragonhead.png','dragontail.png','asc.png','mc.png',
               'aries.png','taurus.png','gemini.png','cancer.png','leo.png','virgo.png',
               'libra.png','scorpio.png','sagittarius.png','capricorn.png','aquarius.png','pisces.png',
                'conjunction.png','sextile.png','square.png','trine.png','opposition.png',
                'semisextile.png','semisquare.png','quintile.png','biquintile.png','quincunx.png','sesquiquadrate.png','parallel.png'];






var TMan = new N6LTimerMan();  //タイマーマネージャー
var width = 540;
var height = 1440;
var planetnum = 32;



var dres;
var log = [0,0];
var img = [];

var bBBB;
var bRunning = false;
var bWaiting = false;
var Speed = 1.0;
var CCLWay = 0;
var fFst = 1;
var dat;
var time;
var dt;
var imgRead = 1;
var bRead = false;
var bLAM = false;
var intvl = 50;

var CNST_AU = 1.49597870700e+11;

var planet = [new Array(), new Array()];


function enter() {

  createOption(0);
  createOption(1);

  onNOW();
  onOO();
  init(0);

  TMan.add();
  Loop(0);  //初回実行

}

function Loop(id) {
  if(bWaiting || 0 < fFst) onWaiting();
  if(bRunning) onRunning();
  TMan.timer[id].setalerm(function() { Loop(id); }, intvl);  //メインループ再セット
}

function onNOW() {
  var dt = new Date();
  setday(dt);
  onSTP();
}

function onOO() {
  T41.value = 0;
  T51.value = 0;
  T61.value = 0;
  onSTP();
}

function onSTP() {
  bRunning = false;
  init(0);
}

function onREV() {
  init(-1);
}

function onRUN() {
  init(1);
}

function setday(dt) {
  var year = dt.getFullYear();
  var month = dt.getMonth() + 1;
  var day = dt.getDate();
  var hour = dt.getHours();
  var minute = dt.getMinutes();
  var second = dt.getSeconds();
  T11.value = year;
  T21.value = month;
  T31.value = day;
  T41.value = hour;
  T51.value = minute;
  T61.value = second;
}

function createOption(n){
 var elm = document.getElementById('BP' + n);
  for(var i = 0; i < 109; i++){
    var option = document.createElement('option');
    option.value = "BPOPT"+ n + '_' + i;
    option.textContent = BirthPlace[i][0];
    elm.appendChild(option);
  }
  elm.value = "BPOPT"+ n + "_52";
  chgbp(n);
}

function chgbp(n){
  var elm = document.getElementById('BP' + n);
  var num = Number(elm.value.substr(7));
  elm = document.getElementById('TN' + n);
  elm.value = BirthPlace[num][1];
  elm = document.getElementById('TE' + n);
  elm.value = BirthPlace[num][2];
  log[n] = BirthPlace[num][2];
}

function init(b) {
  bBBB = b;
  if(0 <= b) Speed = Number(SPD.value);
  else Speed = Number(SPD.value) * -1;

  var radioList = document.getElementsByName("CCL");
  for(i = 0; i<radioList.length; i++){
      if(radioList[i].checked){
          CCLWay = Number(radioList[i].value);
          break;
      }
  }

  for(i = 1; i < imgstr.length; i++){
    img[i] = new Image();
    img[i].src = "./img/horoscope/" + imgstr[i];
    img[i].onload = function(){
      imgRead++;
    }
  }

  bWaiting = false;
  InitKepler();
  onWaiting();
}

function onWaiting() {
  if(!bWaiting) {
    fFst = -1;
    if(bBBB) bRunning = true;
  }
//  dispplnt();
}

function onRunning() {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;

  if(fFst != 0) {
    fFst = 0;
    time = 0.0;
    dt = Speed * msecPerDay;
  }
 
  //メインループ
  UpdateFrameKepler();
}

function InitKepler() {
  if(!bRead) fFst = 1;
  dat = new Date();
  PlanetInit(dat);
}

function UpdateFrameKepler() {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;

  var dat1;
  var day = time / msecPerDay;
  var tm = dt;
  if(dt != 0.0) {
    time = time + tm;
    var datt = dat.getTime();
    var dat1t = datt + time;
    var dat1 = new Date(dat1t);

    PlanetInit(dat1);    //新しい日時で惑星初期化

    dispplnt();
    setday(dat1);
  }
}


//惑星初期化
function PlanetInit(dat) {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;
  var Add = [log[0] / 180.0, log[1] / 180.0];
  var i;
  var j;
  if(0 < fFst) {
    //データファイル読み込み
    if(!bWaiting) {
      bWaiting = true;
      readCSV('./javascripts/nas6lib/PData001.txt', 'analyzeCSV', 'readedCSV');
    }
    return;
  }
  else {


    if(imgRead < imgstr.length){
      setTimeout(function(){ PlanetInit(dat); }, 500);
      return;
    }




    for(var i = 0; i < planetnum; i++) {

      var PlanetName = dres[i][0];
      var PlanetNo = Number(dres[i][1]);
      var EpochYY = Number(dres[i][2]);
      var EpochMM = Number(dres[i][3]);
      var EpochDD = Number(dres[i][4]);
      var Epochh = Number(dres[i][5]);
      var Epochm = Number(dres[i][6]);
      var Epochs = Number(dres[i][7]);
      var a = Number(dres[i][8]);
      var e = Number(dres[i][9]);
      var m0 = Number(dres[i][10]);
      var npd = Number(dres[i][11]);
      var ra = Number(dres[i][12]);
      var rb = Number(dres[i][13]);
      var p = Number(dres[i][14]);
      var ss = Number(dres[i][15]);
      var ii = Number(dres[i][16]);
      var ww = Number(dres[i][17]);
      var m = Number(dres[i][18]);
      var r = Number(dres[i][19]);
      var mv = Number(dres[i][20]);

      var dat0 = new Date(EpochYY, EpochMM - 1, EpochDD, Epochh, Epochm, Epochs);
      var datt = dat.getTime();
      var dat0t = dat0.getTime();

      var ddat;

      for (var j = 0; j < 2; j++){

        if(j == 0){
          var dat000 = new Date(T10.value,T20.value-1,T30.value,T40.value,T50.value,T60.value);
          var datt000 = dat000.getTime();
          ddat = (datt000 - dat0t) / msecPerDay - Add[j];
        }
        else {
          ddat = (datt - dat0t) / msecPerDay - Add[j];
        }

        //惑星初期化
        planet[j][i] = new N6LPlanet();
        if(i == 0){
          planet[j][i].CreateEarth(PlanetNo, PlanetName, ddat, dat0, a, e, m0, npd, ra, rb, p, ss, ii, ww, m, r);
        }
        else if(i == 2){
          planet[j][i].CreateMoon(PlanetNo, PlanetName, ddat, dat0, Add[j], planet[j][0], true);
        }
        else if(i < 16){
          planet[j][i].CreatePlanet(PlanetNo, PlanetName, ddat, dat0, a, e, m0, npd, ra, rb, p, ss, ii, ww, m, r, planet[j][0]);
        }
        else if(i < 21){
//          planet[j][i].CreateConfig(PlanetNo, PlanetName, ddat, dat0, i - 16, planet[j][0]);
        }
        else{
//          planet[j][i].CreateEtc(PlanetNo, PlanetName, ddat, dat0, m0, planet[j][0]);
        }
      }
    }
    planet[0][0].asc(dat);
    planet[0][0].house(planet[0][0].m_asc);
    dispplnt();
  }
}

function readedCSV(res) {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;
  bWaiting = false;
  bRead = true;
  fFst = -1;
  dres = res;
  PlanetInit(dat);
  return true;
}


function dispplnt() {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;

 var canvas = document.getElementById('cnv0');
 if (canvas.getContext) {
  var context = canvas.getContext('2d');
  context.fillStyle = 'rgb(255,255,255)';
  context.fillRect(0,0,width,height);

  context.strokeStyle = 'rgb(0,0,0)'; 
  context.lineWidth = 3;
  context.beginPath();
  context.arc(width / 2, width / 2, 260, 0, Math.PI*2, false);
  context.stroke();


  var vecWK = new N6LVector([1, 0]);
  var nasc = -planet[0][0].m_asc * Math.PI / 180.0;
  var nlog = log * Math.PI / 180.0;
  var datt = dat.getTime();
  var days = Math.floor(datt / msecPerDay);
  var dayt = (datt / msecPerDay) - days;
  var dayth = dayt * Math.PI * 2;
  var i;
  for(i = 1; i <16 ; i++){

    var nel = planet[1][i].m_el * Math.PI / 180.0;

    vecWK = new N6LVector([1, 0]);
    vecWK = vecWK.Rot2D(nel);
//    vecWK = vecWK.Rot2D(dayth);
//    vecWK = vecWK.Rot2D(nasc);
//    vecWK = vecWK.Rot2D(nlog);

      context.drawImage(img[i], -vecWK.x[0] * 250 + width / 2 - 16, vecWK.x[1] * 250 + width / 2 - 16, 32, 32);
  }
 }
}




NAS6LIBを用います
NAS6LIB

ヘッダーに入れるもの
<script src="./javascripts/nas6/common.js"></script>
<script src="./javascripts/nas6lib/timer.js"></script>
<script src="./javascripts/nas6lib/vector.js"></script>
<script src="./javascripts/nas6lib/matrix.js"></script>
<script src="./javascripts/nas6lib/quaternion.js"></script>
<script src="./javascripts/nas6lib/planet.js"></script>

マルチスレッドを実現するためにタイマーマネージャーを用います
var TMan = new N6LTimerMan(); //タイマーマネージャー
で実体を宣言して
エントリー関数で
TMan.add();
としてタイマーを追加します
またメインループを初回実行します
Loop(0); //初回実行

//メインループ
function Loop(id) {

//...省略...

 TMan.timer[id].setalerm(function() { Loop(id); }, intvl); //メインループ再セット
}
メインループにはこのようにしてメインループを再セットして連続で呼び出します
実行制御は戻していますのでwhile(true)文を回すようには固まりません
intvlはミリ秒で再呼び出し間隔です



//惑星初期化
function PlanetInit(dat) {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;
  var Add = [log[0] / 180.0, log[1] / 180.0];
  var i;
  var j;
  if(0 < fFst) {
    //データファイル読み込み
    if(!bWaiting) {
      bWaiting = true;
      readCSV('./javascripts/nas6lib/PData001.txt', 'analyzeCSV', 'readedCSV');
    }
    return;
  }
  else {


    if(imgRead < imgstr.length){
      setTimeout(function(){ PlanetInit(dat); }, 500);
      return;
    }


    for(var i = 0; i < planetnum; i++) {

      var PlanetName = dres[i][0];
      var PlanetNo = Number(dres[i][1]);
      var EpochYY = Number(dres[i][2]);
      var EpochMM = Number(dres[i][3]);
      var EpochDD = Number(dres[i][4]);
      var Epochh = Number(dres[i][5]);
      var Epochm = Number(dres[i][6]);
      var Epochs = Number(dres[i][7]);
      var a = Number(dres[i][8]);
      var e = Number(dres[i][9]);
      var m0 = Number(dres[i][10]);
      var npd = Number(dres[i][11]);
      var ra = Number(dres[i][12]);
      var rb = Number(dres[i][13]);
      var p = Number(dres[i][14]);
      var ss = Number(dres[i][15]);
      var ii = Number(dres[i][16]);
      var ww = Number(dres[i][17]);
      var m = Number(dres[i][18]);
      var r = Number(dres[i][19]);
      var mv = Number(dres[i][20]);

      var dat0 = new Date(EpochYY, EpochMM - 1, EpochDD, Epochh, Epochm, Epochs);
      var datt = dat.getTime();
      var dat0t = dat0.getTime();

      var ddat;

      for (var j = 0; j < 2; j++){

        if(j == 0){
          var dat000 = new Date(T10.value,T20.value-1,T30.value,T40.value,T50.value,T60.value);
          var datt000 = dat000.getTime();
          ddat = ((datt000 - dat0t) / msecPerDay) - Add[j];
        }
        else {
          ddat = ((datt - dat0t) / msecPerDay) - Add[j];
        }

        //惑星初期化
        planet[j][i] = new N6LPlanet();
        if(i == 0){
          planet[j][i].CreateEarth(PlanetNo, PlanetName, ddat, dat0, a, e, m0, npd, ra, rb, p, ss, ii, ww, m, r);
        }
        else if(i == 2){
          planet[j][i].CreateMoon(PlanetNo, PlanetName, ddat, dat0, Add[j], planet[j][0], true);
        }
        else if(i < 16){
          planet[j][i].CreatePlanet(PlanetNo, PlanetName, ddat, dat0, a, e, m0, npd, ra, rb, p, ss, ii, ww, m, r, planet[j][0]);
        }
        else if(i < 21){
//          planet[j][i].CreateConfig(PlanetNo, PlanetName, ddat, dat0, i - 16, planet[j][0]);
        }
        else{
//          planet[j][i].CreateEtc(PlanetNo, PlanetName, ddat, dat0, m0, planet[j][0]);
        }
      }
    }
    planet[0][0].asc(dat);
    planet[0][0].house(planet[0][0].m_asc);
    dispplnt();
  }
}


惑星軌道定数CSVデータ
nas6lib/PData000.txt
は太陽中心用
nas6lib/PData001.txt
は地球中心用です

readCSV('./javascripts/nas6lib/PData001.txt', 'analyzeCSV', 'readedCSV');
で惑星軌道定数データを読み込みます

if(i == 0){
 planet[j][i].CreateEarth(PlanetNo, PlanetName, ddat, dat0, a, e, m0, npd, ra, rb, p, ss, ii, ww, m, r);
}
else if(i == 2){
 planet[j][i].CreateMoon(PlanetNo, PlanetName, ddat, dat0, Add[j], planet[j][0], true);
}
else if(i < 16){
 planet[j][i].CreatePlanet(PlanetNo, PlanetName, ddat, dat0, a, e, m0, npd, ra, rb, p, ss, ii, ww, m, r, planet[j][0]);
}

で惑星を設定します

太陽中心ならばnas6lib/PData000.txtロードして

planet[j][3].CreateEarth(PlanetNo, PlanetName, ddat, dat0, a, e, m0, npd, ra, rb, p, ss, ii, ww, m, r);

で地球を作ってから

if(i < 16){
 planet[j][i].CreatePlanet(PlanetNo, PlanetName, ddat, dat0, a, e, m0, npd, ra, rb, p, ss, ii, ww, m, r, planet[j][3]);
}

でいいのかな

planet[0][0].asc(dat);
アセンダントを設定します
planet[0][0].house(planet[0][0].m_asc);
ハウスを設定します


//planet//惑星
class N6LPlanet {

  constructor(rh) {

    this.typename = "N6LPlanet";
    this.m_earth;             //earth//地球

    this.m_pno;               //planet no.//惑星番号
    this.m_pname;             //planet name//惑星名前
    this.m_dat0 = new Date(); //datetime//日時
    this.m_nday;
    this.m_a;                 //semi-major axis//軌道長半径
    this.m_e;                 //eccentricity//離心率
    this.m_l0;                //epoch//元期
    this.m_nperday;           //mean motion//1日の角度
    this.m_ra;                //perihelion//近日点
    this.m_rb;                //aphelion//遠日点
    this.m_t;                 //orbital period//公転周期
    this.m_s;                 //longitude of the ascending node//昇交点黄経
    this.m_i;                 //orbital inclination//軌道傾斜
    this.m_w;                 //perihelion celestial longitude//近日点黄経
    this.m_mv;                //velocity rate//速度倍率

    this.m_m;                 //mass//惑星質量
    this.m_r;                 //radius//惑星半径

    this.x0 = new N6LVector();   //position//座標
    this.v0 = new N6LVector();   //velocity//速度
    this.ex = new N6LVector();   //geocentric coordinates//地心座標

    this.m_el;                //celestial longitude//黄経
    this.m_d;                 //aberration//光行差

    this.m_asc;               //ascendant//アセンダント
    this.m_hs = new Array();  //house//ハウス

    this.m_rev;               //reverse//逆行

//...省略...
}

planetクラスのメンバはこうなっています


動かすにはこうします

function UpdateFrameKepler() {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;

  var dat1;
  var day = time / msecPerDay;
  var tm = dt;
  if(dt != 0.0) {
    time = time + tm;
    var datt = dat.getTime();
    var dat1t = datt + time;
    var dat1 = new Date(dat1t);

    PlanetInit(dat1);    //新しい日時で惑星初期化

    dispplnt();
    setday(dat1);
  }
}


planet[].m_elに黄経が入っているので地球中心で表示するときはこれを参照します
planet[].x0,planet[].v0に座標、軌道速度が入っているので太陽中心で表示するときはこれを参照します
物理エンジンなどはPlanetInit()を1回やって初期日時の初期座標と初期速度を取得して
物理計算をやればいいです
1周の軌道の概形を求めたかったらplanet[].m_t公転周期を36分割でもして
それ毎にPlanetInit()をすれば1周の概形が求められます
planet[].exに地心座標が入っているのでプラネタリウム的なものはこれを参照します

と簡単にケプラー方程式をカプセル化しています





 ■■■ 3Dプログラミング入門講座 ■■■ 
NAS6LIB
ポリゴンテスト解説・x3dom使い方
その1:ベクトル
その2:行列
その3:クォータニオン
その4:基本総復習・実践
その5:応用その1・メッシュアニメーション、動的テクスチャ
その6:応用その2・GLSL、カスタムシェーダー、キーボード、ファイル
その7:応用その3・ゲームプログラミング、タグの動的追加
その8:応用その4・GLSL、シェーダー、その2
その9:物理演算その1・電卓で相対性理論を解く方法
その10:物理演算その2・相対性理論的ニュートン力学
その11:物理演算その3・ケプラー方程式で惑星軌道シミュレーターを作る

その12:物理演算その4・ルンゲクッタ法で作った 相対性理論的ニュートン力学物理エンジンで惑星軌道シミュレーターを作る

その13:経路探索(A*:A-STAR)&巡回セールスマン問題 : 巨大サイズ : くろにゃんこ

その14:プログラミングにおける配列テーブルテクニック
その15:javascriptのクラス活用法
その16:透視射影公式テスト

その17:ケプラー方程式カプセルライブラリ使用法
その18:CSVファイル処理
その19:物理演算その5・重力多体問題
その20:同次座標について(3D座標系の基本の基本)
その21:おさらいコモンクラスの宣言
その22:物理エンジンライブラリ解説(ケプラー方程式・ルンゲクッタ・相対論的万有引力)


 ■■■ THREE.JSプログラミング講座 ■■■ 
THREE.JSテスト解説・THREE.JS使い方
THREE.JS examplesをいじってみた(フレネル反射透過シェーダー)

THREE.JS (半透明シェーダー)

THREE.JS 3D演算で必要な計算(具体例)★とても重要★
THREE.JS THREE-VRM をいじってみた



<<prev 透視射影公式テスト : CSVファイル処理 next>>





戻る