• ベストアンサー

三角形の辺の長さ・・・

こんにちは。 描画メソッドというのでしょうか、lineto()などを使い、三角形を作りました。 3点ABCのx座標、y座標はそれぞれAx,Ay,Bx・・・と言う変数に代入してあり、3点ABCはそれぞれ自由に移動させる事が出来ます。 要するに、3点の座標だけが判明している状態です。 しかし、力が及ばず、この長さを求める方法で詰まってしまいました。 3点の座標から辺の長さを求める方法はありますでしょうか。 あれば、その計算方法、参考サイトを教えてください。

noname#77303
noname#77303
  • Flash
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.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(三角関数) は「こんな方法もあるよ」という意味で書いてみただけです。 ご質問のような場合には普通使いません。他のときに使えると思います。

noname#77303
質問者

お礼

大変丁寧な回答ありがとうございます。 三平方の定理が一番見やすいので、これを利用させて頂くことにしました。 Point.distanceの存在は全く知らなかったので驚きです。(グーグルでも調べ方が下手なのか、解説がほとんど出てきませんでした) また、考え方も時には単純な方がいいと言う事も分かりました。 これからも場合によっては問題を細かくして考える、単純にして考えて見ようと思います。

その他の回答 (2)

  • cspl
  • ベストアンサー率83% (55/66)
回答No.2

描かれる三角形が直角三角形でなくても、一つ一つの辺の長さをそれぞれ出すのであれば三平方の定理でも求めることができますが、Player8以上であればPointクラスを使用するのも一つの手です。 2点間の距離を求める場合、Point.distance()を使用すれば簡単に辺の長さを求めることができます。使い方はヘルプなどを参考にしてみてください。

noname#77303
質問者

お礼

回答ありがとうございます。 ご指摘の通り、三平方の定理により距離を算出する事が出来ました。 ヘルプを身ながらPoint.distanceを使ったところ求める事も出来たのですが、今回は三平方の定理を利用することにしました。 中学時代では「直角三角形において・・・」と習っていた為、考えてもみなかったのですが、これは様々な三角形に言える事なのですね。 勉強不足でした。

回答No.1

昔々に習った「三平方の定理」で出せるように思います。 http://www.geisya.or.jp/~mwm48961/math/m3pita02.htm A~Bのラインでしたら、 AとBの Ax - Bx を1辺、Ay - By を1辺、間の角度は90度とする直角三角形になりますので、 残りの辺の長さを求めれば良いのではないでしょうか? 平方根は Math.sqrt(n); で出せるようです。 ご参考までに。。

noname#77303
質問者

お礼

回答ありがとうございます。 ご指摘いただいた三平方の定理なのですが、点ABCはそれぞれ自由に移動が可能であり、「三角形ABCは直角三角形」とは言えないのです。 角度が分かれば正弦定理なども使えるかと思ったのですが・・・。

関連するQ&A

  • matlab初心者です。

    どなたかアドバイスよろしくお願いいたします。 2点の座標(ax1,ay1),(bx1,by1)が与えられた時、2点の座標を結ぶ線分とy軸とのなす角を求めたい場合、 atan2(by1-ay1,bx1-ax1)で良いのでしょうか。 また、この2点が時系列上で変化する{(axn,ayn),(bxn,byn)のように座標が多くある}場合、コードを簡略化することはできないでしょうか。 恐縮ですがどなたかよろしくお願いいたします。

  • 式の展開?について教えてください。

    式の展開?について教えてください。 (X-ax)^2+(Y-ay)^2=r^2 (X-bx)^2+(Y-by)^2=r^2 の式を使って X=~ Y=~ ax=~ ay=~ と式を展開?変換?したいのです。 円弧の中心座標と円弧の始点座標を取得したいのですが、 数学の知識がなく、展開・変換?ができなくて困っています。 どなたか教えていただけないでしょうか。 X,Y=円弧の中心点 ax,ay=円弧の始点 bx,by=円弧の終点 可能であれば、展開の方法をわかりやすく説明して頂きたいです。 又、数学のどこを勉強すればいいか、参考になる書籍があれば教えてください。 よろしくお願い致します。

  • 交差する2線分の交点座標の求め方

    2つの線分が交差する場に交点の座標を求めようと思っています。 アドバイスを頂けないでしょうか? 入力値:(aX1, aY1)(aX2, aY2)     (bX1, bY1)(bX2, bY2) 出力値:(X, Y) よろしくお願いします。

  • 座標の和に関する証明

    原点をo(0,0)とし、a(ax,ay),b(bx,by)という点を取ります。 このとき、cという点を四角形oacbが平行四辺形になるように取ると、cは、c(ax+bx,ay+by)という、座標を取りますが、cが必ず、このような座標を取ることは、どの様に証明したら良いのでしょうか? どなたか解答お願いします。

  • 三角形OABの面積を求めるプログラム

    三角形OABの面積を求めるプログラムを作りました(課題ですがw)。が、うまく動かないんです。 どこが間違っているか教えてください。(VC++6.0) /*三角形OABの面積を求めるプログラム*/ #include <stdio.h> #include <math.h> void main(){ float ax,ay,bx,by,s; printf("点Aの座標を入力してください。\n"); scanf("%f%f",&ax,&ay); printf("点Bの座標を入力してください。\n"); scanf("%f%f",&bx,&by); s=(1/2)*abs(ax*by-ay*bx); printf("三角形OABの面積は%fです。\n",s); } ◇点A(ax,ay) 、点B(bx,by) 面積の公式s=(1/2)*|ax*by-bx*ay| と与えられています。 また、警告の意味もわからないんで、できればお願いします。

  • 2線の交わる角度を求める式

    2線の交わる角度を求める式で、0での除算が発生しない方法を教えて下さい。 座標 線a ax1 = 0 , ay1 = 0 : ax2 = 12 , ay2 = 13 線b bx1 = 6 , by1 = 15: bx2 = 6 , by2 = 2 A=(y13-y0)/(x12-x0) B=(y2-y15)/(x6-x6)   0で除算が発生 2線の交わる角度 tanθ=(A-B)/(1+AB) 片方の線が垂直だと0で除算が発生しまい、うまく計算できません。 なにか他によい方法はないでしょうか。

  • 関数の問題です。

    解答がないので解き方がわかりません。 x軸に(-3、0)で接し点(-1、8)を通る放物線とY軸との交点の座標を求めなさい。 y=ax~2+bx+c に代入して放物線の式を求める・・・ 解き方がわかりません。

  • 三角関数の問題です。

    質問をさせていただきます。 二次元平面上に△ABCがあり、頂点の座標はそれぞれ (Ax,Ay)、(Bx,By)、(Cx,Cy)となっています。 また辺ACと辺BCの長さは等しく、二等辺三角形となっています。 (∠ACBの角度×1/4)の正接の値をTとした場合、 Cx、Cyの値をそれぞれ求めたいのですが、 どのようにすればよいでしょうか。 (ちなみに全ての辺は、X軸やY軸に必ず平行というわけではありません) Cx=~、Cy=~ といった形でご回答頂けると幸いです。 よろしくお願いいたします。

  • 2線の交点を座標値で求める式で、0での除算が発生しない方法を教えて下さい。

    2線の交点を座標値で求める式で、0での除算が発生しない方法を教えて下さい。 座標 線a ax1 = 0 , ay1 = 0 : ax2 = 12 , ay2 = 13 線b bx1 = 6 , by1 = 15: bx2 = 6 , by2 = 2 A=(y13-y0)/(x12-x0) B=(y2-y15)/(x6-x6) 0で除算が発生 X=(A*x0-y0-B*x2+y15)/(A-B) Y={A*y15-B*Y0+AB*(x0-x2)}/(A-B) 片方の線が垂直だと0で除算が発生してしまいます。

  • 座標A(X,Y)の線分(aX,aY)(bX,bY)に対称な座標の求め方

    VBで図形を入力した線分に対称に反転した図形と書こうとしています。 その為に必要な座標A(X,Y)の線分(aX,aY)(bX,bY)に対称な 座標B(X',Y')の求め方についてご教授お願いいたします。