Langleyの問題をJavaで解いてみた。

 Langley(ラングレー)の問題をJavaで解いてみました。(^_^;
 ずっと前、三角関数を使って導いた公式を使って、プログラムを作ってみました。始めから公式を使うと、誤差が目立つので、まず、代入法で整数解を探しています。(^_^;
 四角形ABCDにおいて、 ∠ABD=a, ∠DBC=b, ∠BCA=c, ∠ACD=d, ∠CDB=e, ∠BAC=f, ∠ADB=x, ∠DAC=y のとき、x, y を求めます。

●LangleyProb01.java

/* 
 * LangleyProb01.java
 * 
 *     ・y    x・
 *      f      e
 * 
 *   a             d
 * ・ b           c・
 * 
 * x+y=b+c … ①
 * 
 * sin[a]*sin[c]*sin[e]*sin[y]
 * --------------------------- = 1 … ②
 * sin[b]*sin[d]*sin[x]*sin[f]
 * 
 * 連立方程式①,②を使って解く。ただし、e=180-(b+c+d), f=180-(a+b+c)
 * 
 * 変数部分と定数部分に分けるために次のように変形して、①',②'の定数部分をそれぞれP,Qとおく。
 * 
 * x+y=b+c=P … ①'
 * 
 * sin[y]   sin[b]*sin[d]*sin[f]
 * ------ = -------------------- = Q … ②'
 * sin[x]   sin[a]*sin[c]*sin[e]
 * 
 * このとき、
 *           sin[P]               sin[P]   
 * tan[x] = -------- , tan[y] = ---------- 
 *          cos[P]+Q            cos[P]+1/Q 
 * 
 */

public class LangleyProb01 {
    static double  sinD(double x) { return(Math.sin( Math.toRadians(x))); }
    static double  cosD(double x) { return(Math.cos( Math.toRadians(x))); }
    static double atanD(double x) { return(Math.toDegrees(Math.atan(x))); }
    
    static double Langley(double a,double b,double c,double d) {
        double p=b+c;
        double e=180.0-(p+d), f=180.0-(a+p);
        double q=(sinD(b)*sinD(d)*sinD(f))/(sinD(a)*sinD(c)*sinD(e));
        double x;
        
        if(e<=0 || f<=0) return -1.0;   // エラーの時は、-1.0を返す。
        // 代入法で整数解を探してみる。
        for(x=1.0; x< p; x++)
            if(sinD(p-x)/sinD(x)==q) return x;
        
        // 整数解が見つからなかったら、公式を使ってみる。
        return (x=atanD(sinD(p)/(cosD(p)+q))) >=0 ? x : x+180.0;
    }
    
    public static void main(String[] args) {
        double a = 20.0, b = 60.0, c = 50.0, d = 30.0;
        double x, y;
        
        x = Langley(a,b,c,d);
        y = (b+c)-x;
        System.out.println("x="+x);
        System.out.println("y="+y);
    }
}

●実行結果

x=30.0
y=80.0

※参考URL
http://q.hatena.ne.jp/1349700436
算数で解けるラングレーの問題|受験算数に挑戦!
ラングレーの問題、整角四角形
Langleyの問題を三角関数で解いてみた。
Langleyの問題を三角関数で解いてみた。(2)
半整数角四角形の問題を解いてみた。
sin(3°)系列
sin(3°)系列 (2)

ラングレーの問題にトドメをさす!―4点の作る小宇宙完全ガイド

ラングレーの問題にトドメをさす!―4点の作る小宇宙完全ガイド