はい、アルゴリズムと称したただの数学復習メモです。
サイン、コサイン、タンジェント、、あーやったなー以外何も覚えてませんでした。
というわけで手っ取り早くなんだっけ?ってわかるためには下記記事がわかりやすかったです
2辺の長さが与えられてるとします(a, b)
この場合の公式は下記です.
S = a * b * sin(d) / 2
となります。
sin()は、高さを h とすると、 h / b となり、hの値を取得したいので両辺にb
をかけたら、b * sinθ = h / b * b
すなわち、 bsinθ = h
となります
よって、あとはbsinθ * a * 1/2
を行うと面積がだせるってことになりますね...(これは普通の三角形の面積の求め方ですね)
実はこのbsinθ
は高さです
というわけでいきなりぶっこみますが
まとめ: 三角形の高さの求め方
斜辺 * sin(θ)
となります。
例だと、b*sin(d)
となります
まーこれをプログラミングに落とし込むとすると、Math.sin()
をjavaでは使うわけですが、
これの引数がdoubleのradianなわけです。
Radianって何?
次はこれに進むわけですねw
ラジアンとは、「円(扇形)の孤の長さ(L)÷円の半径(r)」によって求められる値のこと
juken-mikata.net
とあります。よくわからんw
下記には、
円の弧の長さが分かれば,角度が求まる
この方法で角度を求める方法を「弧度法」といいます.
また,この方法によって定まった角度の単位を「ラジアン」といいます.
なるほど、平たく言うと角度の単位のことか。。
角度をラジアンに変換する
これは、
rad = θ * (π / 180)
で求まるようです。
ちなみに、2π = 360°
ちなみに、1π = 180°です
三角形の面積の求め方
まとめ: 三角形の面積をJavaで求めるには
double aLength = 2.0; double bLength = 4.0; double degree = 30.0; double square = aLength * bLength * (sin(degree * (Math.PI / 180)) / 2);
となりました。。!
ちなみに、円周率は、Math.PI
を使えばよいです。
blog.java-reference.com
追記7/1
ラジアンですが、下記で簡単に求められるみたい...
Math.toRadians(degrees);
三角形の辺の求め方
はい、ラスボスです。非常にコード的にはややこしくなります。
これには余弦定理ってものが新しくでてきます...(やばいもう頭パンパン)
三角形 ABC について、点 A,B,C の内角をそれぞれ角 A,B,C とおき 点 A の反対側にある線分 BC の長さを a 点 B の反対側にある線分 CA の長さを b 点 C の反対側にある線分 AB の長さを c とおいたときに、以下の3つの式が成り立つことを余弦定理と言います。
このc
を求めたい...
余剰定理の方式に当てはめると...
c^2 = a^2 + b^2 - 2ab * cosC
となっているので...
また、cosは a/b
になりますので、
しかし、JavaのMath.cos()
ももちろん引数はradianなので....
Math.pow(aLength,2) + Math.pow(bLength,2) - 2 * aLength * bLength * Math.cos(degree * (Math.PI / 180))
となりますね!!!!
しかし、上記の値はc2になるので、さらに平方根で解いてあげないといけません。ってことで
double cLength = Math.sqrt(Math.pow(aLength,2) + Math.pow(bLength,2) - 2 * aLength * bLength * Math.cos(degree * (Math.PI / 180)));
長い旅路でした。。。。。。
サンプル
import java.util.Scanner; class Main150{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); double a = sc.nextDouble(); double b = sc.nextDouble(); double C = sc.nextDouble(); System.out.println(a*b*Math.sin(C*Math.PI/180.0)/2); System.out.println(a+b+Math.sqrt(Math.pow(a,2)+Math.pow(b,2)-2*a*b*Math.cos(C*Math.PI/180.0))); System.out.println(b*Math.sin(C*Math.PI/180.0)); } }