計算の仕方を知りたいです。例えば、x=13、y=6とした場合に、それを47度回転したらば、xとyはいくつになるか、その計算式を教えて下さい。更にそれをJavaScriptやActionScript等でMathクラスなどを使って記す場合には、どのような書き方になるかも教えていただけると嬉しいです。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/10/08 22:59:01
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:ttamo No.1

回答回数175ベストアンサー獲得回数29

ポイント23pt

平方根を sqrt, 累乗を pow, 逆正接を atan2, 円周率を PI とすると、

x = sqrt(pow(x,2)+pow(y,2)) * cos((atan2(6/13)) + (47*180/PI))

y = sqrt(pow(x,2)+pow(y,2)) * sin((atan2(6/13)) + (47*180/PI))

だと思いますので、JavaScript では atan2(6/13) を atan2(6,13) にすればいけるんじゃないでしょうか。

あと、それぞれ Math.sqrt とかにするんですか? JavaScript 知らないのですが、これでどうでしょう。

x = Math.sqrt(Math.pow(x,2)+Math.pow(y,2)) * Math.cos((Math.atan2(6,13)) + (47*180/Math.PI))

y = Math.sqrt(Math.pow(x,2)+Math.pow(y,2)) * Math.sin((Math.atan2(6,13)) + (47*180/Math.PI))

id:matikori

JavaScriptをご存知ないとしても、全然参考になりましたよ!ありがとうございます。

2007/10/08 22:56:02

その他の回答3件)

id:ttamo No.1

回答回数175ベストアンサー獲得回数29ここでベストアンサー

ポイント23pt

平方根を sqrt, 累乗を pow, 逆正接を atan2, 円周率を PI とすると、

x = sqrt(pow(x,2)+pow(y,2)) * cos((atan2(6/13)) + (47*180/PI))

y = sqrt(pow(x,2)+pow(y,2)) * sin((atan2(6/13)) + (47*180/PI))

だと思いますので、JavaScript では atan2(6/13) を atan2(6,13) にすればいけるんじゃないでしょうか。

あと、それぞれ Math.sqrt とかにするんですか? JavaScript 知らないのですが、これでどうでしょう。

x = Math.sqrt(Math.pow(x,2)+Math.pow(y,2)) * Math.cos((Math.atan2(6,13)) + (47*180/Math.PI))

y = Math.sqrt(Math.pow(x,2)+Math.pow(y,2)) * Math.sin((Math.atan2(6,13)) + (47*180/Math.PI))

id:matikori

JavaScriptをご存知ないとしても、全然参考になりましたよ!ありがとうございます。

2007/10/08 22:56:02
id:GoldenDawn No.2

回答回数426ベストアンサー獲得回数81

ポイント23pt

JavaScript での記述例だけ

with (Math) {
  var x = 13, y = 6 ;      // 初期位置
  var deg = atan2(y, x) ;  // 初期角度
  deg += 47 * PI / 180 ;   // 47度足す (ラジアンに変換)
  r = sqrt(x*x + y*y) ;    // 原点からの距離

  var x2 = r * cos(deg) ;  // 変換後の位置
  var y2 = r * sin(deg) ;
}
id:matikori

こちらもありがとうございます!

2007/10/08 22:52:34
id:Mook No.3

回答回数1314ベストアンサー獲得回数393

ポイント23pt

\large\left(\begin{array}x^\'\\y^\'\end{array}\right)=\large\left(\begin{array}cos(47)&-sin(47)\\sin(47)&cos(47)\end{array}\right)\large\left(\begin{array}x\\y\end{array}\right)


x^\'=cos(47)x-sin(47)y

y^\'=sin(47)x+cos(47)y


なので、例示の場合


x^\'=4.477856

y^\'=13.59959

になります。



JavaScrip の場合下記が参考になるでしょうか。

<HTML>
<HEAD>
<SCRIPT language="Javascript" type="text/javascript">
function rotation() {
    var r = document.myForm.r.value;
    var x = document.myForm.x.value;
    var y = document.myForm.y.value;

    var res = document.getElementById("res");
    var rr = Math.PI * r / 180;

    var x2 = Math.cos( rr ) * x - Math.sin( rr ) * y;
    var y2 = Math.sin( rr ) * x + Math.cos( rr ) * y;

    document.myForm.x2.value = x2;
    document.myForm.y2.value = y2;
}
</SCRIPT>
</HEAD>
<BODY>
  <FORM name="myForm">
    <TABLE>
    <TR>
        <TD colspan="2">回転角度</TD><TD colspan="4"><input type="text" name="r"></TD>
    </TR>
    <TR>
        <TD>変換前座標</TD><TD>X</TD><TD><INPUT type="text" name="x"></TD><TD>Y</TD><TD><INPUT type="text" name="y"></TD></tr>
    </TR>
    <TR>
        <TD colspan="5" align="right"><INPUT type="button" value="計算" onClick="rotation();"></TD></tr>
    </TR>
    <TR>
        <TD>変換後座標</TD><TD>X</TD><TD><INPUT type="text" name="x2"></TD><TD> Y</TD><TD><INPUT type="text" name="y2"></TD>
    </TR>
    </TABLE>
  </FORM>
</BODY>
</HTML>
id:matikori

丁寧に書いていただいてありがとうございます!

2007/10/08 22:53:42
id:Bookmarker No.4

回答回数191ベストアンサー獲得回数34

ポイント23pt

回転行列で計算するとわかり易いと思います。

X = x * cosθ − y * sinθ
Y = x * sinθ + y * cosθ
#!ruby

class Vector2
  def initialize(x = 0.0, y = 0.0)
    @x = x
    @y = y
  end

  attr_accessor :x, :y

  def rotate(angle)
    x = @x * Math.cos(angle) - @y * Math.sin(angle)
    y = @x * Math.sin(angle) + @y * Math.cos(angle)
    self.class.new(x, y)
  end
end

x = 13.0
y = 6.0
angle_degree = 47.0

angle = angle_degree * Math::PI / 180.0
org_vec = Vector2.new(x, y)
new_vec = org_vec.rotate(angle)
p new_vec.x # => 4.47785647109746
p new_vec.y # => 13.5995882814242
id:matikori

こちらもわかりやすいですね。ありがとうございます。

皆さん色んな書き方をしてくれて大変参考になります!

2007/10/08 22:54:53

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

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

トラックバック

  • matrix ライブラリーの使い方 **question:1191841779 matrix ライブラリーの使い方が少しわかったので、それを使って書き直してみた。 require ’matrix’ class Vector2 &lt; Vector DIMENSION = 2 def self.[](*array) sel
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

回答リクエストを送信したユーザーはいません
${title} {{if price }}
${price}円
{{/if}}