class Pulo::Triangle

Attributes

angles[R]
lengths[R]

Public Class Methods

new(angles: [], lengths: [], area: nil) click to toggle source
# File lib/pulo/figure/figure2d.rb, line 94
def initialize(angles: [], lengths: [], area: nil)
  quantity_check [area,Area] ,[angles,Array] , [lengths,Array]

  raise 'Need more arguments for triangle' unless (
        ((not area) && angles.count+lengths.count>=3 && lengths.count>0) ||
        (area && (angles.count>=2 || lengths.count>=2 || (lengths.count==1 && angles.count>0)))
  )
  while lengths.count<3; lengths<<nil; end
  while angles.count<3; angles<<nil; end

  lengths_count=lengths.compact.count
  angles_count=angles.compact.count
  if area
    #area=area.value if area.is_a?(Area)
    if angles_count==2
      while angles[0].nil?
        angles=angles.unshift(angles.last).take(3)
        lengths=lengths.unshift(lengths.last).take(3)
      end
      angles[2]=Angle.pi-angles[0]-angles[1]
      k=((area*2)/(Math.sin(angles[0])*Math.sin(angles[1])*Math.sin(angles[2]))).rt(2)
      lengths[0]=k*Math.sin(angles[0])
      lengths[1]=k*Math.sin(angles[1])
      lengths[2]=k*Math.sin(angles[2])
    else
      if lengths_count==2
        while lengths[0].nil? or lengths[1].nil?
          lengths=lengths.unshift(lengths.last).take(3)
          angles=angles.unshift(angles.last).take(3)
        end
        angles[0]=angle_from_area(area,lengths[0],lengths[1])
        lengths[2]=length_from_cosine(lengths[0],lengths[1],angles[0])
        angles[1]=angle_from_sine(lengths[0],lengths[2],angles[0])
        angles[2]=Angle.pi-angles[0]-angles[1]
      else
        while lengths[0].nil?
          lengths=lengths.unshift(lengths.last).take(3)
          angles=angles.unshift(angles.last).take(3)
        end
        if not angles[0].nil?
          lengths[1]=length_from_area(area,lengths[0],angles[0])
          lengths[2]=length_from_cosine(lengths[0],lengths[1],angles[0])
          angles[1]=angle_from_sine(lengths[0],lengths[2],angles[0])
          angles[2]=Angle.pi-angles[0]-angles[1]
        elsif not angles[1].nil?
          #assume isosceles
          angles[0]=angles[2]=(Angle.pi-angles[1])/2
          lengths[1]=length_from_area(area,lengths[0],angles[0])
          lengths[2]=length_from_cosine(lengths[0],lengths[1],angles[0])
        else
          lengths[2]=length_from_area(area,lengths[0],angles[2])
          lengths[1]=length_from_cosine(lengths[0],lengths[2],angles[2])
          angles[0]=angle_from_sine(lengths[2],lengths[1],angles[2])
          angles[1]=Angle.pi-angles[0]-angles[2]
        end
      end
    end

    @area=area
  else
    if lengths_count==3
      angles[0]=angle_from_cosine(lengths[2],lengths[0],lengths[1])
      angles[1]=angle_from_sine(lengths[0],lengths[2],angles[0])
      angles[2]=Angle.pi-angles[0]-angles[1]
    elsif lengths_count==2
      while lengths[0].nil? or lengths[1].nil?
        lengths=lengths.unshift(lengths.last).take(3)
        angles=angles.unshift(angles.last).take(3)
      end
      if not angles[0].nil?
        lengths[2]=length_from_cosine(lengths[0],lengths[1],angles[0])
        angles[1]=angle_from_sine(lengths[0],lengths[2],angles[0])
        angles[2]=Angle.pi-angles[0]-angles[1]
      elsif not angles[1].nil?
        angles[2]=angle_from_sine(lengths[1],lengths[0],angles[1])
        angles[0]=Angle.pi-angles[1]-angles[2]
        lengths[2]=length_from_sine(lengths[0],angles[0],angles[1])
      else
        angles[1]=angle_from_sine(lengths[0],lengths[1],angles[2])
        angles[0]=Angle.pi-angles[1]-angles[2]
        lengths[2]=length_from_sine(lengths[0],angles[0],angles[1])
      end
    else
      while angles[0].nil? or angles[1].nil?
        lengths=lengths.unshift(lengths.last).take(3)
        angles=angles.unshift(angles.last).take(3)
      end
      angles[2]=Angle.pi-angles[0]-angles[1]
      if not lengths[0].nil?
        lengths[1]=length_from_sine(lengths[0],angles[2],angles[1])
        lengths[2]=length_from_sine(lengths[0],angles[0],angles[1])
      elsif not lengths[1].nil?
        lengths[0]=length_from_sine(lengths[1],angles[1],angles[2])
        lengths[2]=length_from_sine(lengths[0],angles[0],angles[1])
      elsif not lengths[2].nil?
        lengths[0]=length_from_sine(lengths[2],angles[1],angles[0])
        lengths[1]=length_from_sine(lengths[0],angles[2],angles[1])
      end
    end
    @area=0.5*lengths[2]*lengths[0]*Math.sin(angles[2])
  end
  @angles=angles
  @lengths=lengths
  @perimeter=@lengths[0]+@lengths[1]+@lengths[2]
end

Public Instance Methods

angle_from_area(area,a,b) click to toggle source
# File lib/pulo/figure/figure2d.rb, line 204
def angle_from_area(area,a,b); Math.asin(2*area/(a*b)); end
angle_from_cosine(a,b,c) click to toggle source
# File lib/pulo/figure/figure2d.rb, line 200
def angle_from_cosine(a,b,c); Math.acos((b**2+c**2-a**2)/(2*b*c)); end
angle_from_sine(a,b,ang_b) click to toggle source
# File lib/pulo/figure/figure2d.rb, line 202
def angle_from_sine(a,b,ang_b); Math.asin(a*Math.sin(ang_b)/b); end
extrusion_figure() click to toggle source
# File lib/pulo/figure/figure2d.rb, line 91
def extrusion_figure
  Prism
end
length_from_area(area,b,ang_c) click to toggle source
# File lib/pulo/figure/figure2d.rb, line 203
def length_from_area(area,b,ang_c); (2*area)/(b*Math.sin(ang_c)); end
length_from_cosine(b,c,ang_a) click to toggle source
# File lib/pulo/figure/figure2d.rb, line 199
def length_from_cosine(b,c,ang_a); Math.sqrt(b**2+c**2-(2*b*c*Math.cos(ang_a))); end
length_from_sine(b,ang_a,ang_b) click to toggle source
# File lib/pulo/figure/figure2d.rb, line 201
def length_from_sine(b,ang_a,ang_b); b/Math.sin(ang_b)*Math.sin(ang_a); end