2011-12-22 16 views
1

さまざまな種類の三角形を解決するRubyプログラムを構築する最良の方法は、具体的にはAAS、ASA、SAS、SSA、SSS三角形です。Rubyでの三角解法の扱い

のみ三つの異なるソリューションがあります。正弦定理を使用して、余弦とあらゆる角度の法則は、私がこれの異なる実装で遊んでてきた180

まで追加、しかし、私は見つけることができませんこの素敵なDRYを作る良いクリーンな方法。

は、私は現在、このような何かをやっている:

def solve 
     #AA 
     !self.A && self.B && self.C ? self.A = 180 - (self.B + self.C) : false 
     !self.B && self.A && self.C ? self.B = 180 - (self.A + self.C) : false 
     !self.C && self.B && self.A ? self.C = 180 - (self.B + self.A) : false 

     #AAS 

     !self.a && self.A && self.C && self.c ? self.a = (self.c * Math.sin(self.A.degrees))/Math.sin(self.C.degrees) : false 
     !self.b && self.B && self.C && self.c ? self.b = (self.c * Math.sin(self.B.degrees))/Math.sin(self.C.degrees) : false 
end 

基本的に私はそれらを介して、ループを、それを解決し、解決できるで最初のものをつかむためにすべての可能な方法のリストを持っていることに終わるものを。その後、再びループスルーし、解決策が見つからなくなるまで2回目の刺しを行います。しかし、それは全くドライではありません。

これをどのように攻撃しますか?

+0

異なるトリア何を解きますどうか? – sawa

+0

@sawaの角度と辺、したがってAAS =角度、角度のサイドなど –

+0

はい、私はそれを見て理解しましたが、解決すべき問題は何ですか? – sawa

答えて

0

さて、ここでより完全な解決策ではない - ないループはしかし:

class Triangle 
    def initialize(options) 
    @angles = [options[:alpha], options[:beta], options[:gamma]] 
    @sides = [options[:a], options[:b], options[:c]] 
    end 

    def solve 
    # AA 
    if @angles.one?(&:nil?) 
     @angles[@angles.index(nil)] = 180 - @angles.compact.inject(&:+) 
    end 

    # AAS 
    (0..2).each do |i| 
     if [email protected][i] && @angles[i] 
     (0..2).each do |j| 
      if @angles[j] && @sides[j] 
      @sides[i] = (@sides[j] * Math.sin(@angles[i]).abs)/Math.sin(@angles[j]).abs 
      end 
     end 
     end 
    end 

    # ... 

    puts @angles.to_s 
    puts @sides.to_s 
    end 
end 

T = Triangle.new:アルファ=> 62:ベータ=> 35、:A => 7

t.solve

[62、35、83]

[7、4.054866015928188、9.170357476093628]