ザ・ワールドの相対論的実装

時を止めて自分だけ動く、とかは物理的におかしくて、服は自分なのか、持ったナイフは自分なのか、とかいろいろ矛盾がでます。しかし、時間空間のある限られた領域で時間の進みが速くなる、ということにすればなんとかなりそうです。

時空間で楕円で表される領域で例えば時間が1000倍の速さで進むとします。この結界ははじめディオを中心にぶわーっと広がって、しばらく経って「時は動き出す」というディオの言葉と共に収縮します。中にいるディオの主観時間は5秒だけど、外から見ると5/1000秒しか経たない。で、この結界がギリギリ承太郎の手前で終わるようにしてナイフを投げれば、結界内部では外の1000倍のスピードでナイフが飛んで承太郎の目の前まで行き、そこで結界を出て普通に飛んで承太郎に刺さります。チェックメイトだッ!承太郎から見れば突然目の前にナイフが現れて飛んでくるように見えます。
ただし!結界の中に入られると相手も同じスピードで動けるので打撃攻撃である無駄無駄ラッシュはできません。仮に結界を越えてパンチを出したら、外は時間が進まないので拳が動かなくなり身動きとれません。というわけで無駄無駄は無理だけどチェックメイトだ!とか承太郎の真上に結界の境界を持って来て中でロードローラーを落とす、などは出来ます。上院議員へのいたずらは出来ません。

結界がどう見えるか。ディオの視点だと、外から来る光は全て赤方変位してるので、太陽光のうち外の物体に当たったγ線などが可視光となって見えることになります。そういった波長の反射特性は可視光と異なるので、外の物体は変な色に見えることになります。一方内部の物体は、外のγ線などが可視光となって入って来たものが可視光として反射され目に入ることになります。可視光の反射を可視光として見るので色はあまり変わりません。外から入ってくる光のスペクトルは太陽光の短波長側にずれるので、色温度が変化して色付照明で物を見る感じになります。というわけで、アニメの描写はだいたい正しいことになります。http://www.youtube.com/watch?v=YetEjfsVMW0

外から見ると、結界は一瞬で現れて消えるのでまあ見えません。見えたとして、それを目で追うことができたら「貴様ッ!見ているなッ!」と言われます。

では実際にそういう時空で物体がどういう運動をするか計算してみます。まず結界内部で時間のモノサシが1/10になり、境界では急激かつなめらかに1にもどるような適当な関数(tanh)を使って時空を設定し、運動の方程式を解きます。

青い線が光の経路です。内部では外の10倍速で進み、結界を出ると外の光速ですすみます。ここまではOK。緑の線は光速より遅い速度で投げたナイフです。結界に近づくとともに急激に加速し、外に出ると光速で飛んでいきます。これでは承太郎に当たって核爆発してしまいます。強すぎ。

緑の線は結界が出現する領域にあった静止していた物体の軌跡を示しています。結界に弾き飛ばされて内部に入れずに光速で爆散していきます。結界はディオを中心に発生するので、これではディオが爆散してしまいます。やれやれだぜ。

というわけで、天下りですが今度は時間のモノサシを1/10にして、同時に空間のモノサシを10倍にしてみます。

今度は緑の線が爆散せずにすみました。青がナイフの線です。これもはじめの目論見どおり飛んでいます。めでたしめでたし。
しかし!空間のモノサシを10倍にしたということは、体が10倍に巨大化しないといけないことになります。緑の線はあくまで時空から受ける力であって、原子同士の反発は別に受けることになります。うまくやらないと内圧で爆散です。時間を1000倍速にしようとおもったら1000倍に巨大化。半径1kmほどの結界が必要です。しかも1000倍程度なら素のスタープラチナで対応されそうです。やれやれだぜ。

以下は方程式を解くコード
ただし、こういう時空を作るには対応した質量を配置しないといけないけど、そもそも対応する配置が存在するのか知りません。その辺は考えてません。だれか考察してくれないかな。アインシュタイン方程式を解くことになります。

// Calc Geodecics: The World
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


/*
Lagrangean: L= gxx(x(l),t(l)) vx^2 + gtt(x(l),t(l)) vt^2
vx = dx(l)/dl
vt = dt(l)/dl

Euler-Lagrange Eq.
d(2 vx gxx)/dl = vx^2 gxx,x + vt^2 gtt,x
d(2 vt gtt)/dl = vx^2 gxx,t + vt^2 gtt,t

gtt = f(x,t)
gxx = h = -1/f(x,t)

ax = d vx/dl = -(0.5 hx vx vx + ht vx vt)/h
at = d vt/dl = -(0.5 ft vt vt + fx vx vt)/f

hx = fx /f^2
ht = ft /f^2

 */

// Edge sharpness in tanh(SH*x)
#define SH 10.0
//accerelation factor inside
#define WFAC 10.0
//time duration
#define CFAC 10.0


void c_acc(double x, double t,
	double vx, double vt,
	double *ax, double *at, double *dsdl)
{
#if 1
    //ver.2
    double r2 = (1- x*x - t*t/CFAC/CFAC)*SH;
    double f = 1.0+  (WFAC-1.0) * 0.5*(1+tanh(r2));

    double r2x = -SH*2*x;
    double r2t = -SH*2*t/CFAC/CFAC;
    double fr2 = (WFAC-1.0)*0.5/(cosh(r2)*cosh(r2));

    double fx =  fr2 *r2x;
    double ft =  fr2 *r2t;

    double h = -1.0/f;
    double hx = fx/(f*f);
    double ht = ft/(f*f);

    *ax = -(0.5* hx* vx*vx + ht*vx*vt)/h;
    *at = -(0.5* ft* vt*vt + fx*vx*vt)/f;

    *dsdl = sqrt(f*vt*vt + h*vx*vx);
#else
    //ver.1
    double r2 = (1- x*x - t*t/CFAC/CFAC)*SH;
    double f = 1.0+  (WFAC-1.0) * 0.5*(1+tanh(r2));

    double r2x = -SH*2*x;
    double r2t = -SH*2*t/CFAC/CFAC;
    double fr2 = (WFAC-1.0)*0.5/(cosh(r2)*cosh(r2));

    double fx =  fr2 *r2x;
    double ft =  fr2 *r2t;
    *ax = -0.5* fx *vt*vt;
    *at = -(fx*vt*vx + 0.5*ft*vt*vt)/f;
    *dsdl = sqrt(f*vt*vt - vx*vx);

#endif

}


int  main(int argc, char **argv)
{
    int i;

    if (argc!=4)
    {
	fprintf(stderr, "world x t v\n");
	exit(1);
    }

    double x = atof(argv[1]);
    double t= CFAC*atof(argv[2]);
    double r2 = (1- x*x - t*t/CFAC/CFAC)*SH;
    double f = 1.0+  (WFAC-1.0) * 0.5*(1+tanh(r2));

    double vt = 1.0;
    double vx = atof(argv[3])*vt*sqrt(f);// initial verocity in unit of c

    double tobj=0.0;
    double to_last= 0.0;
    double lastx=-1000;
    double lastt=-1000;


    while(1)
    {
#define INC 0.00001
#define TTIC (CFAC*0.1)
        double ax, at, aa, vv, ds_dl;
	double dl = INC;
	vv = sqrt(vx*vx+vt*vt);
	vx/=vv;
	vt/=vv;
	c_acc(x,t,vx,vt,&ax,&at, &ds_dl);

	aa=sqrt(ax*ax+at*at);
	if (aa*dl > INC) dl = INC/aa;

	x += dl*vx;
	t += dl*vt;
	tobj += ds_dl * dl;

	vx += dl*ax;
	vt += dl*at;

	if ( fabs(x -lastx)> 1e-2 || fabs(t-lastt)>1e-2)
	{
	    printf("%f %f %f",x,t, tobj);
	    if (tobj> to_last+TTIC)
	    {
		// tics for objective time
		printf(" T");
		to_last+=TTIC;
	    }
	    printf("\n");
	    lastx= x;
	    lastt = t;
	}
	if ( fabs(x)>3.0 || t > CFAC*3) break;
    }
    printf("\n");
}