处理Ruby中的三角形求解

时间:2011-12-22 01:18:32

标签: ruby geometry

在Ruby中构建程序的最佳方法是什么,它可以解决不同类型的三角形:特别是AAS,ASA,SAS,SSA和SSS三角形。

只有三种不同的解决方案:使用正弦定律,余弦定律和所有角度加起来为180.

我一直在玩这个不同的实现,但我找不到一个很好的干净方法来使这个很好和干。

我现在正在做这样的事情:

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

基本上我最终要做的就是列出所有可能的方法来解决它,循环遍历它们并抓住第一个可解决的方法。然后再次循环并再次刺入它直到找不到解决方案。但它根本不是DRY。

你会怎么攻击这个?

1 个答案:

答案 0 :(得分:1)

好的,这是一个更完整的解决方案 - 但没有循环:

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 !@sides[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:alpha => 62,:beta => 35,:a => 7

t.solve

[62,35,83]

[7,4.054866015928188,9.170357476093628]