人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

線分上を移動する点の座標を求めるプログラムを探しています。

線分A-Bの上を点Aから出発して点Bに到着するまでの点Pの座標を求めたいと思っています。
線分A-Bの上を移動するときの移動量は任意に指定でき、点Aから点Bまで連続して点Pが移動していきます。

JavaScriptで書かれたものであれば最良ですが、C,Java,VBAも可です。


●質問者: huruyosi
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Java JavaScript VBA プログラム 連続
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● susie-t
●35ポイント

以下でどうでしょう。たぶんあってると思うのですが・・・。

※コード中の「&」は「&」に読み替えてください。(回答時に置換されてしまうようです)

<html>
<head>
<title></title>
<script>
<!--
function calc(fx, fy, tx, ty, move){
 fx = parseFloat(fx);
 fy = parseFloat(fy);
 tx = parseFloat(tx);
 ty = parseFloat(ty);
 move = parseFloat(move);
 if(isNaN(fx) || isNaN(fy) || isNaN(tx) || isNaN(ty) || isNaN(move)){
 return false;
 }
 move = Math.abs(move);
 var dx = tx - fx;
 var dy = ty - fy;
 var length = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
 if(length == 0) return false;
 var per = move / length;
 if(per == 0) return false;
 var mx = dx * per;
 if(mx == 0) return false;
 var my = dy * per;
 if(my == 0) return false;
 var ary = [];
 var cx = fx;
 var cy = fy;
 while(true){
 if((dx > 0 &amp;&amp; cx > tx)
 || (dx < 0 &amp;&amp; cx < tx)){
 cx = tx;
 }
 if((dy > 0 &amp;&amp; cy > ty)
 || (dy < 0 &amp;&amp; cy < ty)){
 cy = ty;
 }
 ary.push([cx, cy]);
 if(cx == tx &amp;&amp; cy == ty) break;
 cx += mx;
 cy += my;
 }
 return ary;
}
function test(btn){
 var fm = btn.form;
 var result = calc(fm.fx.value, fm.fy.value, fm.tx.value, fm.ty.value, fm.move.value);
 document.getElementById('result').innerHTML = inspect(result);
}
function inspect(ary){
 if(!(ary instanceof Array)){
 return ary.toString();
 }
 var str = '[';
 for(var i = 0; i < ary.length; i++){
 if(i != 0) str += ', ';
 if(ary[i] instanceof Array){
 str += arguments.callee(ary[i]);
 }else{
 str += ary[i].toString();
 }
 }
 str += ']';
 return str;
}
//-->
</script>
</head>
<body>
<form onsubmit="return false;">
from x:<input type="text" name="fx"/><br/>
from y:<input type="text" name="fy"/><br/>
to x:<input type="text" name="tx"/><br/>
to y:<input type="text" name="ty"/><br/>
move:<input type="text" name="move"/><br/>
<button onclick="test(this);">TEST</button><br/>
<div id="result"></div>
</form>
</body>
</html>

注意点として、JavaScriptの制限により、小数点の値は誤差が発生します。

参考になれば幸いです。

ダミー:http://q.hatena.ne.jp


2 ● susie-t
●35ポイント ベストアンサー

コメントが付けられないので回答で失礼します。

1の回答で一点間違いがありました。

:

if(mx == 0) return false;

:

if(my == 0) return false;

:

の部分をそれぞれ以下に修正してください。

:

if(mx == 0 && dx != 0) return false;

:

if(my == 0 && dy != 0) return false;

:

失礼しました。(もし他に不具合を見つけたら、クローズ後にコメントさせていただきます)

ダミー:http://q.hatena.ne.jp

◎質問者からの返答

ありがとうございます。希望のものができました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ