ただ建築が好きな走るエンジニア、

日系某メーカーを辞めて外資系に転職。資格、建築デザイン、転職と来て今はひたすらす走ってます。2020別大2:49:13。

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その3)

2014-09-08 23:53:29 | 電気

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その3)


         public Image resizeImage(Image jpg, int resizeHeight)      //画像サイズ変換
        {
            int resizeWidth = (int)(jpg.Width * ((double)resizeHeight / (double)jpg.Height));
            Bitmap resizeBmp = new Bitmap(resizeWidth, resizeHeight);
            Graphics g = Graphics.FromImage(resizeBmp);
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.DrawImage(jpg, 00, resizeWidth, resizeHeight);
            g.Dispose();
            return resizeBmp;
        }
        public int[] matY(int imageHeight)              //平面→球面投影座標変換Y配列
        {
            int[] ymat = new int[imageHeight - 1];

            for (int i = 0; i < imageHeight - 1; i++)
            {
                ymat[i] = (int)((double)imageHeight / Math.PI * Math.Acos(1 - 2 * i / (double)imageHeight));
            }
            return ymat;
        }
        public int[,] matX(int[] ymat, int iH)          //平面→球面投影座標変換X配列
        {
            int[,] xmat = new int[iH - 1, iH - 1];
            double f;
            for (int i = 0; i < iH - 1; i++)
            {
                for (int j = 0; j < iH - 1; j++)
                {
                    xmat[j, i] = iH + 1;
                    double ch = (double)(Math.Sqrt((i - iH / 2) * (i - iH / 2) + (j - iH / 2) * (j - iH / 2)));
                    if (ch < iH / 2)
                    {
                        f = (1 - 2 * (double)j / (double)iH) / Math.Sin((double)ymat[i] * Math.PI / (double)iH);
                        if (f > 0.99)
                            f = 0.99;
                        if (f < -1)
                            f = -1;
                        xmat[j, i] = (int)((double)iH / Math.PI * Math.Acos(f));
                    }
                }
            }
            return xmat;
        }


 次の記事へ続く。

 

Comment

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その2)

2014-09-08 23:51:09 | 電気

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その2)


        private void timer3_Tick(object sender, EventArgs e)    //昼夜再描画タイマー
        {
            marble();
        }
        private void timer4_Tick(object sender, EventArgs e)    //地球回転再描画タイマー
        {
            orbital_sphere();
        }
        private Bitmap makeBmp_desktop(string filename)         //ビットマップ読み込み&サイズ変換
        {
            Bitmap bmp = new Bitmap(h + h, h);
            System.Drawing.Image jpg;
            try
            {
                jpg = System.Drawing.Bitmap.FromFile(filename);
                jpg = resizeImage(jpg, h);
                bmp = new Bitmap(jpg);
                bmpGetTry = true;
            }
            catch (System.IO.FileNotFoundException)
            {
                string eMsg = "File not found";
                this.label2.Text = eMsg;
                bmpGetTry = false;
            }
            return bmp;
        }
        private Bitmap makeBmp(string url, string filename)         //ビットマップ読み込み&サイズ変換
        {
            Bitmap bmp = new Bitmap(h + h, h);
            WebClient wc = new WebClient();
            System.Drawing.Image jpg;
            Stream st2 = wc.OpenRead(url);
            jpg = new Bitmap(st2);
            jpg.Save(filename);
            jpg = resizeImage(jpg, h);
            bmp = new Bitmap(jpg);
            st2.Close();
            return bmp;
        }
        private double telDate()                        //TLE形式シリアル日時計算
        {
            DateTime pDate = DateTime.UtcNow;
            double cuday2 = pDate.DayOfYear;
            cuday2 = cuday2 + (double)(pDate.Hour * 3600 + pDate.Minute * 60 + pDate.Second) / 24 / 3600;
            double cu = (pDate.Year - 2000) * 1000 + cuday2;
            return cu;
        }
        private TLEdata ISStle(string url)              //TLEデータ読み込み
        {
            double cu = telDate();                      //現在日時設定
            WebClient wc = new WebClient();             //webからTLE読み込み・抽出
            TLEdata t;
            t = new TLEdata();
            try
            {
                Stream st = wc.OpenRead(url);
                StreamReader sr = new StreamReader(st, Encoding.GetEncoding("Shift_JIS"));
                Boolean readstatus = false;
                while (readstatus == false)
                {
                    string cText0 = sr.ReadLine();
                    if (cText0 == null)
                        readstatus = true;
                    if (cText0.Length == 7)
                    {
                        string wordPick = cText0.Substring(43);
                        if (wordPick == "ISS")
                        {
                            string cText1 = sr.ReadLine();
                            string cText2 = sr.ReadLine();
                            double ep = double.Parse(cText1.Substring(2214));
                            double incc = double.Parse(cText2.Substring(128));
                            double ra = double.Parse(cText2.Substring(218));
                            t.ec = double.Parse(cText2.Substring(307)) / 10000000;
                            double ap = double.Parse(cText2.Substring(388));
                            t.mk = double.Parse(cText2.Substring(478));
                            t.mm = double.Parse(cText2.Substring(5611));
                            if (ep > cu - 1)
                                readstatus = true;
                            incc = incc / 180 * Math.PI;
                            ra = ra / 180 * Math.PI;
                            ap = ap / 180 * Math.PI;
                                                        //JD translation for Epoch
                            Dtime epc;
                            int[] mday = { 0312831303130313130313031 };
                            epc.Year = (int)(ep / 1000) + 2000;
                            double epday2 = ep - (epc.Year - 2000) * 1000;
                            int rep = epc.Year % 4;
                            if (rep == 0)
                                mday[2] = 29;
                            epc.Month = 0;
                            epc.Day = 0;
                            int i = 0;
                            while (epday2 > 0)
                            {
                                epc.Month++;
                                epc.Day = (int)epday2;
                                epday2 = epday2 - mday[++i];
                            }
                            epday2 = epday2 + mday[i];
                            epc.Hour = (int)((epday2 - (int)epday2) * 24);
                            epc.Minute = (int)((epday2 - (int)epday2 - (double)epc.Hour / 24) * 24 * 60);
                            epc.Second = (int)((epday2 - (int)epday2 - (double)epc.Hour / 24
                                - (double)epc.Minute / 24 / 60) * 24 * 60 * 60);
                            t.tjdep = tjdCalc(epc);
                                                        //地心赤道直交座標変換用係数
                            t.sx1 = Math.Cos(ra) * Math.Cos(ap) - Math.Sin(ra) * Math.Cos(incc) * Math.Sin(ap);
                            t.sx2 = Math.Cos(ra) * Math.Sin(ap) + Math.Sin(ra) * Math.Cos(incc) * Math.Cos(ap);
                            t.sy1 = Math.Sin(ra) * Math.Cos(ap) + Math.Cos(ra) * Math.Cos(incc) * Math.Sin(ap);
                            t.sy2 = Math.Sin(ra) * Math.Sin(ap) - Math.Cos(ra) * Math.Cos(incc) * Math.Cos(ap);
                            t.sz1 = Math.Sin(incc) * Math.Sin(ap);
                            t.sz2 = Math.Sin(incc) * Math.Cos(ap);
                        }
                    }
                }
                sr.Close();
                st.Close();
            }
            catch (System.IO.FileNotFoundException)
            {
                string eMsg = "File not found";
                this.label2.Text = eMsg;
            }
            return t;
        }


次の記事へ続く。

 

Comment

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その1)

2014-09-08 23:47:18 | 電気

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その1)

ソースの備忘録です。


using System;                                           //My sphere with ISS orbital 2014/09/05
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private int xl, mx;                             //マウス移動量
        private Boolean mb = false;                     //マウス状態
        private Boolean mb2 = false;                    //マウス状態
        private Boolean bmpGetTry = true;               //画像有無ステータス
        private Point mMousePoint;                      //マウス座標
        private double expandSize = 0.9;                //球体拡大率
        private int keido = 135;                        //経度初期値(日本)
        private const int h = 500;                      //画像縦サイズ
        private const int h2 = h / 2;
        private const int w = 2 * h;
        private const int w2 = h;
        private Bitmap bmp1 = new Bitmap(h + h, h);     //昼画像
        private Bitmap bmp2 = new Bitmap(h + h, h);     //夜画像
        private Bitmap bmp3 = new Bitmap(h + h, h);     //昼夜ミックス
        private int[] y = new int[h];                   //平面→球面変換配列Y
        private int[,] x = new int[h, h];               //平面→球面変換配列X
        public struct Dtime                             //Datetime同等構造体
        {
            public int Year;
            public int Month;
            public int Day;
            public int Hour;
            public int Minute;
            public int Second;
        }
        public class TLEdata                            //2行フォーマット
        {
            public double ec;                           //離心率(Eccentricity)
            public double mk;                           //平均近点角(Mean anomaly)
            public double mm;                           //平均運動(Mean motion)
            public double sx1;
            public double sx2;
            public double sy1;
            public double sy2;
            public double sz1;
            public double sz2;
            public double tjdep;                        //元期(Epoch)
        }
        private TLEdata t1;                             //ISSのTLEデータ派生クラス

        public Form1()
        {
            InitializeComponent();
            this.MouseDown += new MouseEventHandler(Form1_MouseDown);
            this.MouseMove += new MouseEventHandler(Form1_MouseMove);
            orbital_main();
        }
        private void orbital_main()
        {
                                                        //TLE読み込み(下記NASA URLから1日以内前のTLEを抽出する)
            string tle = "http://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/orbit/ISS/SVPOST.html";
            t1 = ISStle(tle);

            string loadurlname;
            string loadfilename = @"earth_noon.jpg";    //昼画像読み込み(from Desktop)
            bmp1 = makeBmp_desktop(loadfilename);
            if (bmpGetTry == false)
            {
                loadurlname                            //(from NASA;Desktopになかった場合)
                    = "http://eoimages.gsfc.nasa.gov/images/imagerecords/73000/73801/world.topo.bathy.200409.3x5400x2700.jpg";
                bmp1 = makeBmp(loadurlname, loadfilename);
            }
            loadfilename = @"earth_night.jpg";          //夜画像読み込み(from Desktop)
            bmp2 = makeBmp_desktop(loadfilename);
            if (bmpGetTry == false)
            {
                loadurlname                            //(from NASA;Desktopになかった場合)
                    = "http://eoimages.gsfc.nasa.gov/images/imagerecords/55000/55167/earth_lights_lrg.jpg";
                bmp2 = makeBmp(loadurlname, loadfilename);
            }
            y = matY(h);                                //平面→球面投影配列準備
            x = matX(y, h);
            marble();
            //タイマーセット
            timer3.Interval = 600000;                    //昼夜画像書き換え
            timer3.Start();
            timer4.Interval = 100;                      //地球回転
            timer4.Start();
        }


次の記事に続く。

Comment

聖ステパノ学園

2014-09-07 20:22:51 | 建築
今日の昼間は大磯駅前にあるステパノ学園の
学園祭(ステパノ祭り)に行ってきました。

ステパノ学園については下記参考に。
http://ja.wikipedia.org/wiki/エリザベス・サンダースホーム

高低差のある敷地にシンプルで心地良い建築が並びます。



一番高い(標高40mくらい)ところにある「海の見えるホール」。
卒業制作でホール設計するときにだいぶ意識しました。



これは山を下りるときに見える校舎の屋根。
ジグザグの1つ1つが教室です。
光の取り入れ方やシークエンスが好きです。
実はこれもだいぶ参考にしました。



最後にこれはチャペルです。
古いけどいい感じです。

山の上の校舎では鉄道模型の展示があり、
長男と二女は大喜びでした。

最後はやきそばと美味しいコーヒーで
お昼を取り、家に帰りました。

Comment

ビルの下の非日常

2014-09-03 22:44:44 | 日記


所用で都内へ。
少し時間があったので少し散歩です。

いつも見慣れたビルでも
裏側やその周辺を歩くと新しい発見
だらけです。

人工の森と遊歩道で憩う人々。

いきなり開ける視界、
ガラス張りのスタジオでヨガに耽る集団。

電車の横ではきれいな人工芝で
フットサルに熱中する子供たち。

とてもビジネス空間とは思えない。

Comments (2)

ISS(国際宇宙ステーション)

2014-09-03 00:55:49 | 電気



どうしてもここまではやっておきたかった。

先日作った地球儀アプリに国際宇宙ステーション(ISS)の
現在位置表示を追加しました。

人工衛星の軌道要素は下記から直接読み込みます。

http://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/orbit/ISS/SVPOST.html

2行フォーマット(TLE)と呼ばれるもので、
これだけで大よその位置を計算することができます。

大よそと言うのは、人工衛星は頻繁に軌道修正を
行う場合もあるので。

あと計算は空気抵抗による減速項などは入れていないので、
TLEの元期1日以内でも1°程度の誤差は生じる様です。
(1°って100km近いですからね。上空400kmを飛ぶISSを
きっちり見るためには微妙な誤差です)

さすがに処理が重くなったので言語をVBからC#に切り替えました。
これだけで同じ処理が5~10倍速くなるから大したものです。
(ソースもそのうち整理して残そうと思います)

ということですっきりしたので、明日は製図の直しをします。
(先日の最終課題で立面図の間違いに気付き、少しショックです)

製図の試験終わったら秋の夜空にISSを探します。

 

ソースは次の記事で。


 


 

Comment