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


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

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

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2007/02/13 01:28:29
  • 終了:2007/02/13 16:27:02

ベストアンサー

id:susie-t No.2

susie-t回答回数99ベストアンサー獲得回数182007/02/13 16:03:48

ポイント35pt

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

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

id:huruyosi

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

2007/02/13 16:25:59

その他の回答(1件)

id:susie-t No.1

susie-t回答回数99ベストアンサー獲得回数182007/02/13 15:45:26

ポイント35pt

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

  • 関数calc
    • 引数
      • 第一引数:始点X座標(数値)
      • 第ニ引数:始点Y座標(数値)
      • 第三引数:終点X座標(数値)
      • 第四引数:終点Y座標(数値)
      • 第五引数:移動量(数値(絶対値を使用))
    • 返却値
      • 次の形式の配列:[[始点X座標,始点Y座標],[途中X座標,途中Y座標],...,[終点X座標,終点Y座標]]
      • 終点を超える場合は終点を設定
      • エラー時はfalseを返却

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

<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

id:susie-t No.2

susie-t回答回数99ベストアンサー獲得回数182007/02/13 16:03:48ここでベストアンサー

ポイント35pt

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

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

id:huruyosi

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

2007/02/13 16:25:59

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません