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