2012年3月25日日曜日

JavaScript(学術計算用)

下記のソースコードはJavaScriptで書かれたものです。目的は、
3次元内の2直線上の任意の2点(計4点)の座標から2直線のなす角を求めることです。
普通にコピーしてメモ帳などに貼り付けてhtml形式で保存するとそのまま使えます。
これはある国立の医学研究科に所属しているエリートくんが研究目的のために作ってくれと
頼まれて同じ研究仲間としてどこでも計算できるようJavaScriptで頑張って作成したものです。
高校時代からの付き合いだったので、無償で提供してこっそりとGoogleのHPにもアップして、
使い方のメモまで載せたのですが、あまりにメールのやり取りが粗末なので、いつも心の中で
医学の研究者である前に医者だろうと僕の書痙のことも相談したのですが、それは心の問題と
言われてしまい、さすがにがっかりしてしまいました。
しかし、毎日徹夜で研究していた彼に高校時代から僕は殆ど何もしてあげられなかったので、
せめて、研究に関して数学の問題を解決するくらいの援助はしてあげたいと思っていますし、
メールで「以前、作ってくれたアプリ?がかなり役に立ってるよ、ありがとう。」と報告を受けた
ときは非常に嬉しかったことを覚えています。

■ソースコード(2011年7月作成)※4点のそれぞれのx,y,z座標を入力すると角度が求まります。
JavaScriptです。セキュリティブロックは解除してください。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>Untitled</title>

<script type = "text/javascript">
<!--
function GetKakudo(f) {
var n1s = f.p1x.value;
var n2s = f.p1y.value;
var n3s = f.p1z.value;
var n1t = f.p2x.value;
var n2t = f.p2y.value;
var n3t = f.p2z.value;
var m1s = f.q1x.value;
var m2s = f.q1y.value;
var m3s = f.q1z.value;
var m1t = f.q2x.value;
var m2t = f.q2y.value;
var m3t = f.q2z.value;
var an = n1t - n1s;
var bn = n2t - n2s;
var cn = n3t - n3s;
var am = m1t - m1s;
var bm = m2t - m2s;
var cm = m3t - m3s;
var uenodan = an*am + bn*bm + cn*cm;
var sitanodan1 = Math.sqrt(an*an + bn*bn + cn*cn);
var sitanodan2 = Math.sqrt(am*am + bm*bm + cm*cm);
var sitanodan0 = sitanodan1 * sitanodan2;
var cosx = uenodan / sitanodan0;
var ansr = Math.acos(cosx);
var ansd = 360*(ansr)/Math.PI/2;
alert('ans='+ansr+'(rad)\n'+ansd+'(do)');
}

//-->
</script>


</head>

<body>
<p>直線P上と直線Q上の各2つずつの頂点の座標を入力してください。</p>
<p>lineP:p1(x,y,z),p2(x,y,z) and lineQ:q1(x,y,z),q2(x,y,z)</p>
<form>
<dl>
<dt>点P1のx座標</dt>
<dd><input type = "text" name = "p1x" /></dd>
<dt>点P1のy座標</dt>
<dd><input type = "text" name = "p1y" /></dd>
<dt>点P1のz座標</dt>
<dd><input type = "text" name = "p1z" /></dd>
<dt>点P2のx座標</dt>
<dd><input type = "text" name = "p2x" /></dd>
<dt>点P2のy座標</dt>
<dd><input type = "text" name = "p2y" /></dd>
<dt>点P2のz座標</dt>
<dd><input type = "text" name = "p2z" /></dd>
<dt>点Q1のx座標</dt>
<dd><input type = "text" name = "q1x" /></dd>
<dt>点Q1のy座標</dt>
<dd><input type = "text" name = "q1y" /></dd>
<dt>点Q1のz座標</dt>
<dd><input type = "text" name = "q1z" /></dd>
<dt>点Q2のx座標</dt>
<dd><input type = "text" name = "q2x" /></dd>
<dt>点Q2のy座標</dt>
<dd><input type = "text" name = "q2y" /></dd>
<dt>点Q2のz座標</dt>
<dd><input type = "text" name = "q2z" /></dd>

</dl>
<input type = "button" value = "答えはこちら" onclick = "GetKakudo(this.form);" />
</form>

</body>
</html>