Обработка решения треугольника в Ruby

Как лучше всего создать программу на 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

По сути, в итоге я получаю список всех возможных способов решения, перебираю их и выбираю первый решаемый. Затем снова выполните цикл и повторите попытку, пока решения не будут найдены. Но это совсем не СУХОЕ.

Как бы вы на это напали?


person Noah Clark    schedule 22.12.2011    source источник
comment
Решите, что для различных треугольников?   -  person sawa    schedule 22.12.2011
comment
Углы и стороны @sawa, следовательно, AAS = Angle, Angle Side и т. д.   -  person Noah Clark    schedule 22.12.2011
comment
Да, я это посмотрел и понял, но какой вопрос надо решить?   -  person sawa    schedule 22.12.2011
comment
Наверное, я пытаюсь сделать его более СУХИМ. Может быть, нет способа сделать это. Сегодня вечером набросал кое-что на бумаге, завтра попробую.   -  person Noah Clark    schedule 22.12.2011


Ответы (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

т. решить

[62, 35, 83]

[7, 4.054866015928188, 9.170357476093628]

person seph    schedule 22.12.2011