六帖のかたすみ

DVを受けていた男性。家を脱出して二周目の人生を生きています。自閉症スペクトラム(受動型)です。http://rokujo.org/ に引っ越しました。

デバッグと今後の予定

六帖webアプリ
kickzone/TrainNavi2 · GitHub
用事を済ませてからデバッグ。一応、動作するようになった。今回のデバッグで、よーく覚えておかなければいけないことは、
・EaselJSでテキストオブジェクトを扱う際は、オブジェクト自体の大きさに気を付けること。点と点を結んだ直線と比べると、同じ座標にオブジェクトを置いても、getMeasuredWidth()/2, getMeasuredHeight()/2の分だけ、右下にずれる。これは、四角形などのShapeにも言えること。
・さらに、右下、ということに気が付いてなかった。そう、パソコンのXY軸は、ふつーの数学で使うXY座標軸とは違う。Y軸が180度反転している。ここでハマった。左90度回転のベクトルを作ろうと思ったら、通常の座標系でいう、右90度回転と同じ計算をしなければいけない。ベクトルの計算例で作成したコードを載せておきます。

//ベクトルの長さを計算
function norm(p){
	return Math.sqrt(Math.pow(p.x, 2) + Math.pow(p.y, 2));
}
//p1p2, p3p2の角の二等分線を単位ベクトルで得る
function calcBisectUnitVector(p1, p2, p3)
{
	//単位ベクトル同士を足すと出来上がり
	var p1p2 = {x: p2.x - p1.x, y: p2.y - p1.y};
	var nrmp1p2 = norm(p1p2);
	var p3p2 = {x: p2.x - p3.x, y: p2.y - p3.y};
	var nrmp3p2 = norm(p3p2);
	var bisect = {x: p1p2.x/nrmp1p2 + p3p2.x/nrmp3p2, y: p1p2.y/nrmp1p2 + p3p2.y/nrmp3p2};
	if(bisect.x == 0 && bisect.y == 0){
		//1直線上に3点があった場合、打ち消しあって0になってしまう
		//このときはp1p2の法線をリターン
		return calcNormalUnitVector(p1, p2);
	}
	var nrmBisect = norm(bisect);
	bisect.x /= nrmBisect;
	bisect.y /= nrmBisect;

	//p1p2の左側に二等分線が来るようにしたい
	//p1p2と外積をとって、正なら反転させる
	var cp = p1p2.x * bisect.y - p1p2.y * bisect.x;
	if(cp > 0){
		bisect.x = -bisect.x;
		bisect.y = -bisect.y;
	}
	return bisect;
}

//p1p2の法線単位ベクトルを得る
//左90度回転
function calcNormalUnitVector(p1, p2)
{
	//(x, y)の左90度回転ベクトルは(-y, x)
	//しかしながら、PCの座標系はyが反転しているので、(y, -x)にしないといけない
	var normalVec = {x: p2.y - p1.y, y: p1.x - p2.x};
	var nrmNormal = norm(normalVec);
	normalVec.x /= nrmNormal;
	normalVec.y /= nrmNormal;
	return normalVec;
}

前回のTrainNaviと比べると、JSONをやめて、サーバーとの通信の冗長性をひたすらなくしたことで、ローカルでさえ10秒ほどかかっていたローディングが、無料サーバー経由でもほんの1秒ほどで済むようになった。自分でもびっくり。一方、描画はのろい。行先表示もまだ未実装だというのに、15fpsでもCPU使用率が20%台をキープしている。非常に簡単なオブジェクトしか描画してないんだから、もっと軽くできるはずだ。例えば列車はテキストじゃなくてShapeにした方がいいかも。キャッシュ機能も使うべきかもしれない。

今後の予定:(優先順)

  • 行先表示
  • 拡大縮小、スクロール
  • DB拡充
  • 駅名表示(どこに表示するかが問題)
  • パッケージファイルの読み込み
  • 動作速度の改善

追加したい機能(優先順)

  • スクロールに合わせた画面表示をする。画面にないオブジェクトを削除して動作を軽くする。スクロールして画面内に入ってきたところではじめて表示する。
  • 通過点のエディット機能、ベジェ曲線で完璧な線路を引くためのGUI作成。ベジェ曲線 - diary 六帖
  • GoogleMapと連携する。地図上を列車が走る。
  • スキン機能。あらゆる路線図を作れるようにする。
  • ターゲットとなる列車を決めて、強調表示する。今どのあたりを走っているかが分かる。
  • 駅をクリックしたら情報を表示する。あと何分で電車が来るとか、目的地を決めたらそこまでかかる時間とか。
  • 列車をクリックしたら情報を表示する。現在速度とか表定速度とか、次はどこに止まるかとか。
  • 運賃を表示できるようにする。FareMap(自作)の機能を全部移植する。
  • 時刻表を自動生成する。
  • この際、NAVITIMEみたいな最短経路・最安経路生成機能も付けてしまう。