- ベストアンサー
三角形の辺の長さ・・・
こんにちは。 描画メソッドというのでしょうか、lineto()などを使い、三角形を作りました。 3点ABCのx座標、y座標はそれぞれAx,Ay,Bx・・・と言う変数に代入してあり、3点ABCはそれぞれ自由に移動させる事が出来ます。 要するに、3点の座標だけが判明している状態です。 しかし、力が及ばず、この長さを求める方法で詰まってしまいました。 3点の座標から辺の長さを求める方法はありますでしょうか。 あれば、その計算方法、参考サイトを教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ほとんど #1 と #2 の方の補足です。 辺とは単なる線分(区切られた直線)です。 始点と終点の座標さえわかれば,長さはその2点から求められます。 多角形 (ご質問の場合は三角形) の辺がいくつあってもそれは変わりません。 と言いますか, 多角形(三角形)の辺の長さ などとは考えない方が良いです。 単に2点間の距離を求めるだけです。 (太郎君の家と花子さんの家の間の距離を調べるのに, ワシントンやケネディやブッシュの家がどこにあっても関係ない。) 方法もいくつかあります。 ◎方法1 三平方の定理を使う [要:中学レベル数学] (Flash 5 以上 AS1.0) 「三平方の定理」 http://contest.thinkquest.jp/tqj2002/50027/page182.html 上のページより c^2 = a^2 + b^2 ↓変形↓ c×c = a×a + b×b c = √(a×a + b×b) ↓座標を当てはめる↓ c = √{(Bx-Ax)×(Bx-Ax) + (By-Ay)×(By-Ay)} ↓ActionScript に変換する↓ c = Math.sqrt((Bx-Ax)*(Bx-Ax)+(By-Ay)*(By-Ay)); 次のスクリプトを _root などのフレームに書いて, 「制御」→「ムービープレビュー」 で確かめられます。 ---例----------------------------------- // 点O,A,B の x-y座標 を設定 Ox = -2; Oy = 1; Ax = 1; Ay = -3; Bx = 6; By = 9; // OA 間の距離 dstOA を求める dstOA = Math.sqrt((Ax-Ox)*(Ax-Ox)+(Ay-Oy)*(Ay-Oy)); // AB 間の距離 dstAB を求める dstAB = Math.sqrt((Bx-Ax)*(Bx-Ax)+(By-Ay)*(By-Ay)); // BO 間の距離 dstBO を求める dstBO = Math.sqrt((Ox-Bx)*(Ox-Bx)+(Oy-By)*(Oy-By)); // 検証 trace("OA間の距離は"+dstOA); trace("AB間の距離は"+dstAB); trace("BO間の距離は"+dstBO); ---------------------------------------- ◎方法2 三角関数(atan2 と sin)を使う [要:高校レベル数学] (Flash 5 以上 AS1.0) 「[228615]角度と座標の計算-Flash の三角関数を使う」 http://support.adobe.co.jp/faq/faq/qadoc.sv?228615+002 ---例----------------------------------- // 点O,A,B の x-y座標 を設定 Ox = -2; Oy = 1; Ax = 1; Ay = -3; Bx = 6; By = 9; // OA の角度(ラジアン) radOA を求める radOA = Math.atan2(Ay-Oy, Ax-Ox); // AB の角度(ラジアン) radAB を求める radAB = Math.atan2(By-Ay, Bx-Ax); // BO の角度(ラジアン) radBO を求める radBO = Math.atan2(Oy-By, Ox-Bx); // OA 間の距離 dstOA を求める dstOA = (Ay-Oy)/Math.sin(radOA); // AB 間の距離 dstAB を求める dstAB = (By-Ay)/Math.sin(radAB); // BO 間の距離 dstBO を求める dstBO = (Oy-By)/Math.sin(radBO); // 検証 trace("OA間の距離は"+dstOA); trace("AB間の距離は"+dstAB); trace("BO間の距離は"+dstBO); ---------------------------------------- ◎方法3 Point クラスの distance メソッドを使う [AS さえわかれば 数学は小学算数レベル] (Flash 8 以上 AS2.0) ActionScript 2.0 リファレンスガイド (Flash8ヘルプ) 「distance (Point.distance メソッド) 」 http://livedocs.adobe.com/flash/8_jp/main/00002595.html ---例----------------------------------- // Point クラスをインポート import flash.geom.Point; // 点O,A,B の x-y座標 を設定 var Ox:Number = -2; var Oy:Number = 1; var Ax:Number = 1; var Ay:Number = -3; var Bx:Number = 6; var By:Number = 9; // 各座標の Pointインスタンス を作成 var pointO:Point = new Point(Ox, Oy); var pointA:Point = new Point(Ax, Ay); var pointB:Point = new Point(Bx, By); // OA 間の距離 dstOA を求める var dstOA:Number = Point.distance(pointO, pointA); // AB 間の距離 dstAB を求める var dstAB:Number = Point.distance(pointA, pointB); // BO 間の距離 dstBO を求める var dstBO:Number = Point.distance(pointB, pointO); // 検証 trace("OA間の距離は"+dstOA); trace("AB間の距離は"+dstAB); trace("BO間の距離は"+dstBO); ---------------------------------------- ※なお,上のURL(ヘルプ)にも書いていますが, Pointクラス自体は AS1.0 で使用可能です。 import が AS2.0 以上でしか使えないので上の例では AS2.0 にしただけです。 ◎方法3:補足 Point クラスの distance メソッドを使う (Flash 8 以上 AS1.0) ---例----------------------------------- // 点O,A,B の x-y座標 を設定 Ox = -2; Oy = 1; Ax = 1; Ay = -3; Bx = 6; By = 9; // 各座標の Pointインスタンス を作成 pointO = new flash.geom.Point(Ox, Oy); pointA = new flash.geom.Point(Ax, Ay); pointB = new flash.geom.Point(Bx, By); // OA 間の距離 dstOA を求める dstOA = flash.geom.Point.distance(pointO, pointA); // AB 間の距離 dstAB を求める dstAB = flash.geom.Point.distance(pointA, pointB); // BO 間の距離 dstBO を求める dstBO = flash.geom.Point.distance(pointB, pointO); // 検証 trace("OA間の距離は"+dstOA); trace("AB間の距離は"+dstAB); trace("BO間の距離は"+dstBO); ---------------------------------------- ※ AS3.0 バージョンが必要な場合は 私は回答できませんので調べてみてください。 方法1(三平方の定理) が一番オーソドックスな方法だと思います。 方法3(Point.distance) でも場合によっては良いと思います。 方法2(三角関数) は「こんな方法もあるよ」という意味で書いてみただけです。 ご質問のような場合には普通使いません。他のときに使えると思います。
その他の回答 (2)
- cspl
- ベストアンサー率83% (55/66)
描かれる三角形が直角三角形でなくても、一つ一つの辺の長さをそれぞれ出すのであれば三平方の定理でも求めることができますが、Player8以上であればPointクラスを使用するのも一つの手です。 2点間の距離を求める場合、Point.distance()を使用すれば簡単に辺の長さを求めることができます。使い方はヘルプなどを参考にしてみてください。
お礼
回答ありがとうございます。 ご指摘の通り、三平方の定理により距離を算出する事が出来ました。 ヘルプを身ながらPoint.distanceを使ったところ求める事も出来たのですが、今回は三平方の定理を利用することにしました。 中学時代では「直角三角形において・・・」と習っていた為、考えてもみなかったのですが、これは様々な三角形に言える事なのですね。 勉強不足でした。
- yamoriClub
- ベストアンサー率16% (1/6)
昔々に習った「三平方の定理」で出せるように思います。 http://www.geisya.or.jp/~mwm48961/math/m3pita02.htm A~Bのラインでしたら、 AとBの Ax - Bx を1辺、Ay - By を1辺、間の角度は90度とする直角三角形になりますので、 残りの辺の長さを求めれば良いのではないでしょうか? 平方根は Math.sqrt(n); で出せるようです。 ご参考までに。。
お礼
回答ありがとうございます。 ご指摘いただいた三平方の定理なのですが、点ABCはそれぞれ自由に移動が可能であり、「三角形ABCは直角三角形」とは言えないのです。 角度が分かれば正弦定理なども使えるかと思ったのですが・・・。
お礼
大変丁寧な回答ありがとうございます。 三平方の定理が一番見やすいので、これを利用させて頂くことにしました。 Point.distanceの存在は全く知らなかったので驚きです。(グーグルでも調べ方が下手なのか、解説がほとんど出てきませんでした) また、考え方も時には単純な方がいいと言う事も分かりました。 これからも場合によっては問題を細かくして考える、単純にして考えて見ようと思います。