LANGUAGE | スカ友 | 俺、関東の国王だけど 人類の品種 言葉の起源 虫は宇宙人です 日本語は海豚の言葉に由来します ペンギン(ウルトラマン) 日本語と中国語との同源語 関東無政府主義国へようこそ! simulationライブラリで純粋な関数式プログラミングを もっと見る
 1 2 3 4 5 ... 50
万有引力シミュレーション(太陽系など)
0   Γεντευ      2012年3月18日 日 11:32


//Test02.cpp
#include "stdafx.h"

using namespace std;
using namespace takaku;
using namespace takaku::_2d;


typedef double2 Vec;


bool g_bExit = false;
SmartPtr<CGameWnd> g_pWnd;
SmartPtr<CBuffer> g_pBuf;
SmartPtr<CSurf> g_pSurf;
SmartPtr<CFont> g_pFont;


void Wnd_WndProc(UINT msg,WPARAM wparam,LPARAM lparam);
void InitLogic();
void Update1();
void Flush1();
void Update2();
void Flush2();
void OnReset(){}
void Init();
void Destroy(){}
bool MsgLoop();

void Init()
{
   g_pWnd = new CGameWnd(L"[keys] C: clear; A/Z/Q: zoom; N/M/B: time zoom; 0-9: follow with an object(0: reset)");
   g_pWnd->SetCallback(&Wnd_WndProc);
   g_pWnd->Show();
   g_pWnd->Activate();

   CGraphics::CreateGraphics(g_pWnd->GetHWnd(), 800, 600);

   g_pBuf = CGraphics::GetGraphics()->GetBackBuffer();
   g_pSurf = new CSurf(new CSimpleSurfCreator(g_pBuf->GetW(), g_pBuf->GetH(), Rgb(0,0,0)));
   g_pSurf->SetColorKey(Rgb(0,0,0));
   g_pFont = new CFont(L"Arial");

   InitLogic();
}

double zoom = 1.0;
double t_zoom = 1.0;
int follow = -1;

void Wnd_WndProc(UINT msg,WPARAM wparam,LPARAM lparam)
{
   switch(msg)
   {
   case WM_KEYDOWN:
       if (wparam=='C')
           g_pSurf->FillRect(0, 0, g_pSurf->GetW(), g_pSurf->GetH(), Rgb(0,0,0));
       else if (wparam=='A')
           zoom *= 2;
       else if (wparam=='Z')
           zoom /= 2;
       else if (wparam=='Q')
           zoom = 1.0;
       else if (wparam=='N')
           t_zoom *= 2;
       else if (wparam=='M')
           t_zoom /= 2;
       else if (wparam=='B')
           t_zoom = 1.0;
       else if (wparam >= '0' && wparam <= '9')
           follow = FromWString<int>(ToWString(wchar(wparam))) - 1;
       break;
   case WM_LBUTTONDOWN:
       break;
   case WM_DESTROY:
       g_bExit=true;
       break;
   }
}

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
   Init();

   while(1)
   {
       try
       {
           if(MsgLoop()) break;
       }
       catch (...) { }
   }

   Destroy();

   return 0;
}

double g_dTime1 = 0;
double g_dTime2 = 0;

bool MsgLoop()
{
   if(g_bExit) return true;

   ::MSG msg = {};
   while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
   {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
   }

   const int N = 1000;

   static int t1 = timeGetTime();
   int t2 = timeGetTime();
   if (t2 - t1 < 1)
   {
       while (t2 - t1 < 1)
       {
           ::Sleep(1);
           t2 = timeGetTime();
       }
   }
   g_dTime2 = MIN(t2-t1, 100) / 1000.0;
   g_dTime1 = g_dTime2 / N;
   t1 = t2;

   for (int i=0; i<N; i++)
   {
       Update1();
       Flush1();
   }
   
   Update2();
   Flush2();

   return false;
}

/////////////////////////////////////////////////////////////////

const double _GameSecPerRealSec = 1;
double GameSPerRealS() { return _GameSecPerRealSec * t_zoom; }
double t = 0;
double dt() { return g_dTime1 * GameSPerRealS(); }

__forceinline byte3 MyGetRgb(dword color){ return byte3(GetR(color), GetG(color), GetB(color)); }
__forceinline dword MyRgb(byte3 rgb){ return Rgb(rgb(0), rgb(1), rgb(2)); }

const double KmPerAU = 149597870.691; // km
const double G = 6.67300e-20; // km3*kg-1*s-2
const double k = 1.3806503e-17; // km2*kg*s-2*K-1

const double m_sun = 1.98892e30; // kg

const double m_mercury = 3.3022e23; // kg
const double d_mercury = 57910000; // avg, km
const double v_mercury = 47.8725; // avg, km/s

const double m_venus = 4.8685e24; // kg
const double d_venus = 108208930; // avg, km
const double v_venus = 35.0214; // avg, km/s

const double m_earth = 5.9742e24; // kg
const double d_earth = 149597870.7; // avg, km
const double v_earth = 29.780; // avg, km/s

const double m_moon = 7.347673e22; // kg
const double d_moon = 384400; // avg, km
const double v_moon = 1.022; // avg, km/s

const double m_mars = 6.4185e23; // kg
const double d_mars = 227936640; // avg, km
const double v_mars = 24.1309; // avg, km/s

class CObject;

vector<SmartPtr<CObject>> AllObjects;

class CObject : public virtual IRefCount
{
public:
   Vec s, v;
   double m;

   CObject(Vec _s, Vec _v, double _m) { s = _s; v = _v; m = _m; }

   Vec f_g(const CObject *o) const
   {
       GENTEU_ASSERT(o != this);

       Vec D_s = o->s - s;
       double norm_D_s = Norm(D_s);
       return G * o->m * D_s / (norm_D_s * norm_D_s * norm_D_s);
   }

   Vec g_total() const
   {
       Vec ret;
       for(int i=0; i<AllObjects.size(); i++)
           if (this != AllObjects[i])
               ret += f_g(AllObjects[i]);
       return ret;
   }

   virtual Vec f_F_others(const CObject *o) const { return Vec(); }

   Vec F_others_total() const
   {
       Vec ret;
       for(int i=0; i<AllObjects.size(); i++)
           if (this != AllObjects[i])
               ret += f_F_others(AllObjects[i]);
       return ret;
   }

   Vec a_total() const { return g_total() + F_others_total() / m;}

   Vec v_next() const { return v + (a_total()) * dt(); }
   Vec s_next() const { return s + v * dt(); }

   //Vec _s_next;
   //Vec _v_next;


   virtual void Update()
   {
       //_s_next = s_next();
       //_v_next = v_next();

       s = s_next();
       v = v_next();
   }

   //virtual void Flush()
   //{
   //    s = _s_next;
   //    v = _v_next;
   //}

};

class CObjectX : virtual public CObject
{
public:
   wstring name;
   int radius;
   dword color;
   
   CObjectX(wstring _name, Vec _s, Vec _v, double _m, int _radius, dword _color)
       : CObject(_s, _v, _m)
   {
       name = _name;
       radius = _radius;
       color = _color;
   }
};

double Fps1() { return 1.0 / g_dTime1; }
double Fps2() { return 1.0 / g_dTime2; }

Vec Dir(double angle) { return Vec(cos(angle), sin(angle)); }

void InitLogic()
{
   SmartPtr<CObjectX> pSun = new CObjectX(
       L"sun",
       Vec(0, 0),
       Vec(0, 0),
       m_sun,
       15,
       0xFFFFFF);
   AllObjects.push_back(pSun.GetPtr());

   SmartPtr<CObjectX> pMercury = new CObjectX(
       L"mercury",
       pSun->s + d_mercury * Dir(0),
       pSun->v + v_mercury * Dir(-PI/2),
       m_mercury,
       5,
       0x00FFFF);
   AllObjects.push_back(pMercury.GetPtr());

   SmartPtr<CObjectX> pVenus = new CObjectX(
       L"venus",
       pSun->s + d_venus * Dir(0),
       pSun->v + v_venus * Dir(-PI/2),
       m_venus,
       8,
       0xFFBB00);
   AllObjects.push_back(pVenus.GetPtr());

   SmartPtr<CObjectX> pEarth = new CObjectX(
       L"earth",
       pSun->s + d_earth * Dir(0),
       pSun->v + v_earth * Dir(-PI/2),
       m_earth,
       8,
       0x0000FF);
   AllObjects.push_back(pEarth.GetPtr());

   SmartPtr<CObjectX> pMoon = new CObjectX(
       L"moon",
       pEarth->s + d_moon * Dir(0),
       pEarth->v + v_moon * Dir(-PI/2),
       m_moon,
       2,
       0xFFFF00);
   AllObjects.push_back(pMoon.GetPtr());

   AllObjects.push_back(GENTEU_NEW(CObjectX,
       L"tmp",
       pEarth->s + 8000 * Dir(0),
       pEarth->v + 9.91 * Dir(-PI/2),
       10.0,
       1,
       0x00FF00).GetPtr());

   SmartPtr<CObjectX> pMars = new CObjectX(
       L"mars",
       pSun->s + d_mars * Dir(0),
       pSun->v + v_mars * Dir(-PI/2),
       m_mars,
       5,
       0xFF0000);
   AllObjects.push_back(pMars.GetPtr());
}

void Update1()
{
   for (int i=0; i<AllObjects.size(); i++)
       AllObjects[i]->Update();
}

void Flush1()
{
   t += dt();

   //for (int i=0; i<AllObjects.size(); i++)
   //    AllObjects[i]->Flush();

}

/////////////////////////////////////////////////////////////////

Vec s_view() { return (follow >= 0 && follow < AllObjects.size()) ? AllObjects[follow]->s : Vec(0, 0); }

Vec WorldToView(Vec world) { return world - s_view(); }
Vec ViewToWorld(Vec view) { return view + s_view(); }

const double _AUPerBufH = 3.5;
double KmPerBufH() { return _AUPerBufH * KmPerAU / zoom; }
double KmPerBufPx() { return KmPerBufH() / g_pBuf->GetH(); }

Vec ViewToBuf(Vec world) { return Vec(double(world(0)/KmPerBufPx() + g_pBuf->GetW()*0.5), double(g_pBuf->GetH()*0.5 - world(1)/KmPerBufPx())); }
Vec BufToView(Vec buf) { return Vec(double(buf(0)*KmPerBufPx() - g_pBuf->GetW()*0.5), double(- buf(1)*KmPerBufPx() - g_pBuf->GetH()*0.5)); }

void RenderStars(CSurfBase *surf, bool bLocus)
{
   for (int i = 0; i < AllObjects.size(); i++)
   {
       SmartPtr<CObjectX> pTmp = dynamic_cast<CObjectX *>(AllObjects[i].GetPtr());
       if (pTmp)
       {
           Vec s_buf = ViewToBuf(WorldToView(AllObjects[i]->s));
           if (bLocus)
           {
               surf->DrawPoint(s_buf(0), s_buf(1), pTmp->color);
           }
           else
           {
               surf->FillEllipse(s_buf(0), s_buf(1), pTmp->radius, pTmp->radius, pTmp->color);
               surf->DrawText(pTmp->name, s_buf(0) - g_pFont->GetStringWidth(pTmp->name) / 2, s_buf(1) - pTmp->radius - 20, g_pFont, 0x00FF00);
           }
       }
   }
}

void Update2()
{
   try
   {
       RenderStars(g_pSurf, true);

       g_pBuf->FillRect(0,0,g_pBuf->GetW(),g_pBuf->GetH(),Rgb(0,0,0));

       g_pBuf->Blt(0, 0, g_pSurf, 0, 0, g_pSurf->GetW(), g_pSurf->GetH());
       RenderStars(g_pBuf, false);

       // coord axises
       g_pBuf->DrawLine(g_pBuf->GetW()/2, 0, g_pBuf->GetW()/2, g_pBuf->GetH(), Rgb(0,255,0));
       g_pBuf->DrawLine(0, g_pBuf->GetH()/2, g_pBuf->GetW(), g_pBuf->GetH()/2, Rgb(0,255,0));
       g_pBuf->DrawLine(g_pBuf->GetW()/2, 0, g_pBuf->GetW()/2-8, 16, Rgb(0,255,0));
       g_pBuf->DrawLine(g_pBuf->GetW()/2, 0, g_pBuf->GetW()/2+8, 16, Rgb(0,255,0));
       g_pBuf->DrawLine(g_pBuf->GetW(), g_pBuf->GetH()/2, g_pBuf->GetW()-16, g_pBuf->GetH()/2-8, Rgb(0,255,0));
       g_pBuf->DrawLine(g_pBuf->GetW(), g_pBuf->GetH()/2, g_pBuf->GetW()-16, g_pBuf->GetH()/2+8, Rgb(0,255,0));

       g_pBuf->DrawText(wstring(L"Kernel FPS = ") + ToWString((int)(Fps1())), 2, 0, g_pFont, Rgb(0,255,0), 1);
       g_pBuf->DrawText(wstring(L"Shell FPS = ") + ToWString((int)(Fps2())), 2, 16, g_pFont, Rgb(0,255,0), 1);
       g_pBuf->DrawText(wstring(L"Space Scale = 100% : ") + ToWString(KmPerBufH()) + L" m (" + ToWString(KmPerBufH()/KmPerAU) + L" AU)",
           2, 32, g_pFont, Rgb(0,255,0), 1);
       g_pBuf->DrawText(wstring(L"Time Scale = 1s : ") + ToWString(GameSPerRealS()) + L" s (" + ToWString((double)GameSPerRealS()/3600/24) + L" day)",
           2, 48, g_pFont, Rgb(0,255,0), 1);
       g_pBuf->DrawText(wstring(L"Time = ") + ToWString(t) + L"s (" + ToWString(t/3600/24) + L" day)", 2, 64, g_pFont, Rgb(0,255,0), 1);

       //--------------------------------------------------------------------
       
       CGraphics::GetGraphics()->Present();
   }
   catch (C2DErr e)
   {
       if (e.Type == C2DErr::DX_ERR && e.HR == DDERR_SURFACELOST)
       {
           try
           {
               CGraphics::GetGraphics()->Reset();
               OnReset();
           }
           catch (C2DErr) { }
       }
   }
}

void Flush2()
{
}


3D版 http://x0000.net/topic.aspx?id=3609-0
この記事は 2019年8月28日 水 22:55 に作者によって編集されました
1   valium      2012年3月31日 土 2:32
http://www.diazepamshoponline.com/ valium online - buy valium without prescriptions
2   cialis      2012年3月31日 土 7:01
http://www.storetadalafilonline.com/ buy cheap cialis - order cialis
3   oxycodone      2012年4月9日 月 3:32
http://www.johnbrockingtonfoundation.org/jbf/statistics/ generic oxycontin online - cheap oxycodone online
4   oxycontin      2012年4月9日 月 7:50
http://www.johnbrockingtonfoundation.org/jbf/statistics/ buy oxycontin without prescriptions - oxycodone online
5   adderall      2012年4月9日 月 12:05
6   buy adderall      2012年4月9日 月 16:35
7   buy xanax      2012年4月11日 水 10:15
http://www.zackuidl.com/about.html alprazolam - buy xanax 2mg
8   valium      2012年4月11日 水 14:30
9   buy valium      2012年4月11日 水 18:41
10   buy phentermine      2012年4月12日 木 0:40
http://www.johnhersey.com/ buy phentermine no prescription - buy phentermine 37.5
11   buy ambien      2012年4月12日 木 3:02
http://www.joshkimball.com/bio.html buy ambien without prescriptions - buy ambien
12   buy xanax      2012年4月13日 金 7:18
13   buy propecia      2012年4月13日 金 7:22
http://www.einsurancecalifornia.com/auto-insurance.php propecia - buy propecia without prescriptions
14   buy valium      2012年4月13日 金 11:23
http://www.un-aesthetic.net/audio/audio.html valium cheap - valium generic
15   buy ambien      2012年4月13日 金 15:32
http://larryfagin.com/teacher.html generic ambien online - ambien cheap
16   buy zithromax      2012年4月16日 月 3:03
17   buy cialis      2012年4月16日 月 3:04
http://joshkimball.com/ cialis generic - buy cialis online
18   buy lasix      2012年4月16日 月 8:40
http://www.lambda-cro.com/events.html lasix buy - buy lasix online no prescription
19   buy accutane      2012年4月16日 月 13:48
http://www.northcoast-realestate.com/cars.html order accutane - cheap accutane
 1 2 3 4 5 ... 50
ヒント: こんな日本語の文字を考案しました(画像有り)