三角形の解法
<1> 3辺 a,b,c を入力し、対角 A,B,C を求める。
画像1
∴ A = cos-1( b2 + c2 - a2 )
2・b・c

<2> 2辺挟角 a,b,C を入力し、C の対辺 c の長さを求める。
画像2
∴ c = √( a2 + b2 - 2・a・b・cos( C ) )
<3> 2角挟辺 A,B,c を入力し、残りの辺 a,b の長さを求める。

画像3

∴ a = - c・sin(A)/D
∴ b = - c・sin(B)/D
  但し、D = - cos(A)・sin(B) - sin(A)・cos(B)
<4> 3辺 a,b,c を入力し、各辺から対角までの高さと面積を求める。

画像4

 s = ( a + b + c ) / 2 とすると、

∴ 面積 S = √( s・(s - a)・(s - b)・(s - c) )
∴ 高さ Ha = 2・S / a
∴ 高さ Hb = 2・S / b
∴ 高さ Hc = 2・S / c

sorc 三角形の解法
// (1) 3辺 a,b,c が既知の3角形の
//     ・各辺の対角 A,B,C を求める
// (2) 2辺挟角が既知の3角形の
//     ・挟角の対辺の長さを求める
// (3) 2角挟辺が既知の3角形の
//     ・両辺の長さを求める

com a = b = c = 0;     // 各辺の長さ
com aa = bb = cc = 0;  // 各辺の対角
const zero = 0.000001;

//=========================
prog 凾R辺→対角
{
    prts( "-- 凾R辺→対角 --" );
    prts( "3辺の長さ abc を入力し" );
    prts( "対角 ABC を求めます." );

again:
    prts( "-----" );
    inp( "長さa",a,
         "長さb",b,
         "長さc",c );

    aa = ang3l( a,b,c );
    bb = ang3l( b,c,a );
    cc = ang3l( c,a,b );

    prt( "角度A", aa );
    prt( "角度B", bb );
    prt( "角度C", cc );
}

//-------------------------
// 3辺 u,v,w から
// 辺 u の対角を求める
//-------------------------
func ang3l( u,v,w )
{
    tmp = (v*v+w*w-u*u)/(2*v*w);
    ang = acos( tmp );
    ret ang;
}
    
//=========================
prog 凾Q辺挟角→対辺の長さ
{
    prts( "-- 凾Q辺挟角→対辺の長さ --" );
    prts( "2辺 ab と挟角 C を入力し" );
    prts( "挟角の対辺 c の長さを求めます." );

again:
    prts( "-----" );
    inp( "長さa",a,
         "長さb",b,
         "挟角C", cc );
    c = sqrt(a*a+b*b
        -2*a*b*cos(cc));
    prt( "長さc", c );
}


//=========================
prog 凾Q角挟辺→両辺の長さ
{
    prts( "-- 凾Q角挟辺→両辺の長さ --" );
    prts( "2角 AB と挟辺 c を入力し" );
    prts( "2角の対辺 ab の長さを求めます." );

again:
    prts( "-----" );
    inp( "角度A", aa,
         "角度B", bb,
         "挟辺c", c );

    s0=sin(aa);
    c0=cos(aa);
    s1=sin(bb);
    c1=-cos(bb);
    dd=-c0*s1+s0*c1;
    if ( abs(dd) < zero ){
        prts( "答えが求まらない." );
    }else{
        b=-c*s1/dd;
        a=-c*s0/dd;
        prt( "長さa", a );
        prt( "長さb", b );
    }
}

//=========================
prog 凾R辺→高さ・面積
{
    prts( "-- 凾R辺→高さ・面積 --" );
    prts( "3辺 a,b,c を入力し、" );
    prts( "各辺から対角までの垂直距離と" );
    prts( "面積を求めます." );

again:
    prts( "-----" );
    inp( "長さa",a,
         "長さb",b,
         "長さc",c );

    if ( a < zero || b < zero || c < zero ){
        ss = ha = hb = hc = 0;
    }else{
        s = ( a+b+c ) / 2;
        ss = sqrt( s*(s-a)*(s-b)*(s-c));
        ha = 2*ss / a;
        hb = 2*ss / b;
        hc = 2*ss / c;
    }
    prt( "高さHa", ha );
    prt( "高さHb", hb );
    prt( "高さHc", hc );
    prt( "面積",   ss );
}