' P '

whatever I will forget

三角形の面積、周の長さ、高さの求め方

onlinejudge.u-aizu.ac.jp

はい、アルゴリズムと称したただの数学復習メモです。
サイン、コサイン、タンジェント、、あーやったなー以外何も覚えてませんでした。
というわけで手っ取り早くなんだっけ?ってわかるためには下記記事がわかりやすかったです

integraldx.info

f:id:mankozooyork:20200611232553p:plain

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なわけです。

www.geeksforgeeks.org

Radianって何?

次はこれに進むわけですねw

ラジアンとは、「円(扇形)の孤の長さ(L)÷円の半径(r)」によって求められる値のこと
juken-mikata.net

とあります。よくわからんw

下記には、

円の弧の長さが分かれば,角度が求まる
この方法で角度を求める方法を「弧度法」といいます.
また,この方法によって定まった角度の単位を「ラジアン」といいます.

kenyu-life.com

なるほど、平たく言うと角度の単位のことか。。

角度をラジアンに変換する

これは、

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つの式が成り立つことを余弦定理と言います。

atarimae.biz

f:id:mankozooyork:20200611224023p:plain
このcを求めたい...

余剰定理の方式に当てはめると... c^2 = a^2 + b^2 - 2ab * cosCとなっているので...
また、cosは a/bになりますので、
しかし、JavaMath.cos()ももちろん引数はradianなので....

www.geeksforgeeks.org

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));
    }
}