pulo 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/pulo.rb +28 -0
- data/lib/pulo/exceptions.rb +6 -0
- data/lib/pulo/figure/figure2d.rb +248 -0
- data/lib/pulo/figure/figure3d.rb +166 -0
- data/lib/pulo/formatting.rb +140 -0
- data/lib/pulo/frames/frame.rb +289 -0
- data/lib/pulo/frames/frame_cell.rb +83 -0
- data/lib/pulo/frames/frame_column.rb +149 -0
- data/lib/pulo/frames/frame_row.rb +87 -0
- data/lib/pulo/helpers.rb +1 -0
- data/lib/pulo/machine/hydraulics/pipe.rb +71 -0
- data/lib/pulo/machine/machines.rb +10 -0
- data/lib/pulo/machine/mechanics/moments_of_inertia.rb +64 -0
- data/lib/pulo/machine/steam/boiler.rb +61 -0
- data/lib/pulo/machine/steam/boiler_deaerator.rb +64 -0
- data/lib/pulo/machine/steam/deaerator.rb +37 -0
- data/lib/pulo/machine/steam/desuperheater.rb +29 -0
- data/lib/pulo/machine/steam/header.rb +20 -0
- data/lib/pulo/machine/steam/if97.rb +378 -0
- data/lib/pulo/machine/steam/steam_process.rb +27 -0
- data/lib/pulo/machine/steam/steam_turbine.rb +42 -0
- data/lib/pulo/machine/steam/water_steam.rb +229 -0
- data/lib/pulo/material/water.rb +34 -0
- data/lib/pulo/quantity/dimension.rb +63 -0
- data/lib/pulo/quantity/numeric_overloads.rb +217 -0
- data/lib/pulo/quantity/quantity.rb +285 -0
- data/lib/pulo/quantity/quantity_builder.rb +185 -0
- data/lib/pulo/quantity/quantity_definitions.rb +8 -0
- data/lib/pulo/quantity/quantity_definitions/area_volume.rb +73 -0
- data/lib/pulo/quantity/quantity_definitions/basic.rb +157 -0
- data/lib/pulo/quantity/quantity_definitions/electric.rb +22 -0
- data/lib/pulo/quantity/quantity_definitions/energy.rb +50 -0
- data/lib/pulo/quantity/quantity_definitions/fluids.rb +23 -0
- data/lib/pulo/quantity/quantity_definitions/force_power.rb +82 -0
- data/lib/pulo/quantity/quantity_definitions/rotation.rb +49 -0
- data/lib/pulo/quantity/quantity_definitions/value.rb +65 -0
- data/lib/pulo/quantity/quantity_definitions/velocity_acc_flow.rb +66 -0
- data/lib/pulo/quantity/quantity_groups/quantity_groups.rb +36 -0
- data/lib/pulo/quantity/unit.rb +45 -0
- data/lib/pulo/quantity_checker.rb +13 -0
- data/lib/pulo/tables/density.rb +10 -0
- data/lib/pulo/tables/melting_temperature.rb +9 -0
- data/lib/pulo/tables/specific_energy.rb +10 -0
- data/lib/pulo/tables/speed_of_sound.rb +9 -0
- data/lib/pulo/tables/tables.rb +104 -0
- data/lib/pulo/tables/tensile_strength.rb +10 -0
- data/lib/pulo/tables/yield_strength.rb +10 -0
- data/lib/pulo/version.rb +3 -0
- metadata +51 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3cd821eca19f9a4d1a19906109e39c39077b3d3
|
4
|
+
data.tar.gz: 7287a0e64e3f40f0f90b074a20bb30a4730ec0a3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e9bfeff6d877d31741b238b137a86830e2b29568d86db2fcf07532b0c73007edbbd0d4063fd8535de318f0cb34a7d93093102e8a3caf94fb5a170cc6df242f3
|
7
|
+
data.tar.gz: a01f39e0ebd30eb5e60f887338e4601818415cdb528ef5f3f4f7e90513de0aec06f4d59d76254c694b00267f0df31799adc555f3258e71c844f8846decc9876b
|
data/lib/pulo.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'pulo/version'
|
4
|
+
|
5
|
+
require 'bigdecimal'
|
6
|
+
require 'bigdecimal/util'
|
7
|
+
require 'yaml'
|
8
|
+
|
9
|
+
require_relative 'pulo/helpers'
|
10
|
+
require_relative 'pulo/formatting'
|
11
|
+
require_relative 'pulo/quantity_checker'
|
12
|
+
require_relative 'pulo/exceptions'
|
13
|
+
|
14
|
+
require_relative 'pulo/quantity/quantity'
|
15
|
+
require_relative 'pulo/quantity/quantity_builder'
|
16
|
+
require_relative 'pulo/quantity/unit'
|
17
|
+
require_relative 'pulo/quantity/dimension'
|
18
|
+
|
19
|
+
require_relative 'pulo/quantity/quantity_definitions'
|
20
|
+
|
21
|
+
require_relative 'pulo/quantity/quantity_groups/quantity_groups'
|
22
|
+
|
23
|
+
require_relative 'pulo/figure/figure2d'
|
24
|
+
require_relative 'pulo/figure/figure3d'
|
25
|
+
require_relative 'pulo/machine/machines'
|
26
|
+
require_relative 'pulo/quantity/numeric_overloads'
|
27
|
+
require_relative 'pulo/frames/frame'
|
28
|
+
require_relative 'pulo/tables/tables'
|
@@ -0,0 +1,248 @@
|
|
1
|
+
|
2
|
+
module Pulo
|
3
|
+
|
4
|
+
module Figure2D
|
5
|
+
include Quantity_Checker
|
6
|
+
attr_reader :area,:perimeter
|
7
|
+
def * (other)
|
8
|
+
if other.is_a?(Length)
|
9
|
+
raise "No extrusion figure known for #{self.class}" unless self.respond_to?(:extrusion_figure)
|
10
|
+
self.extrusion_figure.new(face: self, length: other)
|
11
|
+
else
|
12
|
+
raise "Dont know how to multiply a #{self.class} by a #{other.class}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Circle
|
18
|
+
include Figure2D
|
19
|
+
attr_reader :radius,:diameter
|
20
|
+
def extrusion_figure
|
21
|
+
Cylinder
|
22
|
+
end
|
23
|
+
def initialize(radius: nil, diameter: nil, area: nil)
|
24
|
+
raise 'Circle needs area or diameter or radius.' unless (area || diameter || radius)
|
25
|
+
quantity_check [radius,Length] ,[diameter,Length] , [area,Area]
|
26
|
+
if area
|
27
|
+
@area=area
|
28
|
+
@radius=(@area/Math::PI).rt(2)
|
29
|
+
@diameter=@radius*2
|
30
|
+
else
|
31
|
+
if diameter
|
32
|
+
@diameter=diameter
|
33
|
+
@radius=@diameter/2
|
34
|
+
else
|
35
|
+
@radius=radius
|
36
|
+
@diameter=@radius*2
|
37
|
+
end
|
38
|
+
@area=(@radius**2)*Math::PI
|
39
|
+
end
|
40
|
+
@perimeter=@radius*2*Math::PI
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Square
|
45
|
+
include Figure2D
|
46
|
+
|
47
|
+
attr_reader :width
|
48
|
+
def initialize(width: nil, area: nil)
|
49
|
+
raise "Square needs area or width." unless (area || width)
|
50
|
+
|
51
|
+
quantity_check [area,Area] ,[width,Length]
|
52
|
+
if area
|
53
|
+
@area=area; @width=@area.rt(2)
|
54
|
+
else
|
55
|
+
@width=width; @area=@width**2
|
56
|
+
end
|
57
|
+
@perimeter=@width*4
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class Rectangle
|
62
|
+
include Figure2D
|
63
|
+
|
64
|
+
attr_reader :width, :height
|
65
|
+
|
66
|
+
def extrusion_figure
|
67
|
+
Cuboid
|
68
|
+
end
|
69
|
+
def initialize(area: nil, width: nil, height: nil)
|
70
|
+
quantity_check [area,Area] ,[width,Length] , [height,Length]
|
71
|
+
raise 'Rectangle needs width and height or area and width or height.' unless (width && height) || (area && (width || height))
|
72
|
+
if area
|
73
|
+
@area=area
|
74
|
+
if width
|
75
|
+
@width=width; @height=@area/@width
|
76
|
+
else
|
77
|
+
@height=height; @width=@area/@height
|
78
|
+
end
|
79
|
+
else
|
80
|
+
@width=width; @height=height
|
81
|
+
@area=@width*@height
|
82
|
+
end
|
83
|
+
@perimeter=@width*2+@height*2
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class Triangle
|
88
|
+
include Figure2D
|
89
|
+
attr_reader :angles,:lengths
|
90
|
+
|
91
|
+
def extrusion_figure
|
92
|
+
Prism
|
93
|
+
end
|
94
|
+
def initialize(angles: [], lengths: [], area: nil)
|
95
|
+
quantity_check [area,Area] ,[angles,Array] , [lengths,Array]
|
96
|
+
|
97
|
+
raise 'Need more arguments for triangle' unless (
|
98
|
+
((not area) && angles.count+lengths.count>=3 && lengths.count>0) ||
|
99
|
+
(area && (angles.count>=2 || lengths.count>=2 || (lengths.count==1 && angles.count>0)))
|
100
|
+
)
|
101
|
+
while lengths.count<3; lengths<<nil; end
|
102
|
+
while angles.count<3; angles<<nil; end
|
103
|
+
|
104
|
+
lengths_count=lengths.compact.count
|
105
|
+
angles_count=angles.compact.count
|
106
|
+
if area
|
107
|
+
#area=area.value if area.is_a?(Area)
|
108
|
+
if angles_count==2
|
109
|
+
while angles[0].nil?
|
110
|
+
angles=angles.unshift(angles.last).take(3)
|
111
|
+
lengths=lengths.unshift(lengths.last).take(3)
|
112
|
+
end
|
113
|
+
angles[2]=Angle.pi-angles[0]-angles[1]
|
114
|
+
k=((area*2)/(Math.sin(angles[0])*Math.sin(angles[1])*Math.sin(angles[2]))).rt(2)
|
115
|
+
lengths[0]=k*Math.sin(angles[0])
|
116
|
+
lengths[1]=k*Math.sin(angles[1])
|
117
|
+
lengths[2]=k*Math.sin(angles[2])
|
118
|
+
else
|
119
|
+
if lengths_count==2
|
120
|
+
while lengths[0].nil? or lengths[1].nil?
|
121
|
+
lengths=lengths.unshift(lengths.last).take(3)
|
122
|
+
angles=angles.unshift(angles.last).take(3)
|
123
|
+
end
|
124
|
+
angles[0]=angle_from_area(area,lengths[0],lengths[1])
|
125
|
+
lengths[2]=length_from_cosine(lengths[0],lengths[1],angles[0])
|
126
|
+
angles[1]=angle_from_sine(lengths[0],lengths[2],angles[0])
|
127
|
+
angles[2]=Angle.pi-angles[0]-angles[1]
|
128
|
+
else
|
129
|
+
while lengths[0].nil?
|
130
|
+
lengths=lengths.unshift(lengths.last).take(3)
|
131
|
+
angles=angles.unshift(angles.last).take(3)
|
132
|
+
end
|
133
|
+
if not angles[0].nil?
|
134
|
+
lengths[1]=length_from_area(area,lengths[0],angles[0])
|
135
|
+
lengths[2]=length_from_cosine(lengths[0],lengths[1],angles[0])
|
136
|
+
angles[1]=angle_from_sine(lengths[0],lengths[2],angles[0])
|
137
|
+
angles[2]=Angle.pi-angles[0]-angles[1]
|
138
|
+
elsif not angles[1].nil?
|
139
|
+
#assume isosceles
|
140
|
+
angles[0]=angles[2]=(Angle.pi-angles[1])/2
|
141
|
+
lengths[1]=length_from_area(area,lengths[0],angles[0])
|
142
|
+
lengths[2]=length_from_cosine(lengths[0],lengths[1],angles[0])
|
143
|
+
else
|
144
|
+
lengths[2]=length_from_area(area,lengths[0],angles[2])
|
145
|
+
lengths[1]=length_from_cosine(lengths[0],lengths[2],angles[2])
|
146
|
+
angles[0]=angle_from_sine(lengths[2],lengths[1],angles[2])
|
147
|
+
angles[1]=Angle.pi-angles[0]-angles[2]
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
@area=area
|
153
|
+
else
|
154
|
+
if lengths_count==3
|
155
|
+
angles[0]=angle_from_cosine(lengths[2],lengths[0],lengths[1])
|
156
|
+
angles[1]=angle_from_sine(lengths[0],lengths[2],angles[0])
|
157
|
+
angles[2]=Angle.pi-angles[0]-angles[1]
|
158
|
+
elsif lengths_count==2
|
159
|
+
while lengths[0].nil? or lengths[1].nil?
|
160
|
+
lengths=lengths.unshift(lengths.last).take(3)
|
161
|
+
angles=angles.unshift(angles.last).take(3)
|
162
|
+
end
|
163
|
+
if not angles[0].nil?
|
164
|
+
lengths[2]=length_from_cosine(lengths[0],lengths[1],angles[0])
|
165
|
+
angles[1]=angle_from_sine(lengths[0],lengths[2],angles[0])
|
166
|
+
angles[2]=Angle.pi-angles[0]-angles[1]
|
167
|
+
elsif not angles[1].nil?
|
168
|
+
angles[2]=angle_from_sine(lengths[1],lengths[0],angles[1])
|
169
|
+
angles[0]=Angle.pi-angles[1]-angles[2]
|
170
|
+
lengths[2]=length_from_sine(lengths[0],angles[0],angles[1])
|
171
|
+
else
|
172
|
+
angles[1]=angle_from_sine(lengths[0],lengths[1],angles[2])
|
173
|
+
angles[0]=Angle.pi-angles[1]-angles[2]
|
174
|
+
lengths[2]=length_from_sine(lengths[0],angles[0],angles[1])
|
175
|
+
end
|
176
|
+
else
|
177
|
+
while angles[0].nil? or angles[1].nil?
|
178
|
+
lengths=lengths.unshift(lengths.last).take(3)
|
179
|
+
angles=angles.unshift(angles.last).take(3)
|
180
|
+
end
|
181
|
+
angles[2]=Angle.pi-angles[0]-angles[1]
|
182
|
+
if not lengths[0].nil?
|
183
|
+
lengths[1]=length_from_sine(lengths[0],angles[2],angles[1])
|
184
|
+
lengths[2]=length_from_sine(lengths[0],angles[0],angles[1])
|
185
|
+
elsif not lengths[1].nil?
|
186
|
+
lengths[0]=length_from_sine(lengths[1],angles[1],angles[2])
|
187
|
+
lengths[2]=length_from_sine(lengths[0],angles[0],angles[1])
|
188
|
+
elsif not lengths[2].nil?
|
189
|
+
lengths[0]=length_from_sine(lengths[2],angles[1],angles[0])
|
190
|
+
lengths[1]=length_from_sine(lengths[0],angles[2],angles[1])
|
191
|
+
end
|
192
|
+
end
|
193
|
+
@area=0.5*lengths[2]*lengths[0]*Math.sin(angles[2])
|
194
|
+
end
|
195
|
+
@angles=angles
|
196
|
+
@lengths=lengths
|
197
|
+
@perimeter=@lengths[0]+@lengths[1]+@lengths[2]
|
198
|
+
end
|
199
|
+
def length_from_cosine(b,c,ang_a); Math.sqrt(b**2+c**2-(2*b*c*Math.cos(ang_a))); end
|
200
|
+
def angle_from_cosine(a,b,c); Math.acos((b**2+c**2-a**2)/(2*b*c)); end
|
201
|
+
def length_from_sine(b,ang_a,ang_b); b/Math.sin(ang_b)*Math.sin(ang_a); end
|
202
|
+
def angle_from_sine(a,b,ang_b); Math.asin(a*Math.sin(ang_b)/b); end
|
203
|
+
def length_from_area(area,b,ang_c); (2*area)/(b*Math.sin(ang_c)); end
|
204
|
+
def angle_from_area(area,a,b); Math.asin(2*area/(a*b)); end
|
205
|
+
end
|
206
|
+
|
207
|
+
class Trapezoid #isoscelese only
|
208
|
+
include Figure2D
|
209
|
+
attr_reader :base,:top,:height,:angle, :side_triangle, :side
|
210
|
+
def extrusion_figure
|
211
|
+
TrapezoidalPrism
|
212
|
+
end
|
213
|
+
def initialize(angle: nil,height: nil,base: nil, area: nil,top: nil)
|
214
|
+
quantity_check [angle,Angle] ,[height,Length] , [base,Length] , [top,Length], [area,Area]
|
215
|
+
raise 'Need more arguments for trapezoid' unless ((angle and height and (base or top) or (base and top and height) or (area and base and top)))
|
216
|
+
if angle and height and (base or top)
|
217
|
+
@angle=angle; @height=height
|
218
|
+
@side_triangle=Triangle.new(angles: [@angle,nil,Angle.pi/2], lengths: [@height,nil,nil])
|
219
|
+
@side=@side_triangle.lengths[2]
|
220
|
+
if base
|
221
|
+
@base=base; @top=@base-@side_triangle.lengths[0]*2
|
222
|
+
else #top
|
223
|
+
@top=top; @base=@top+@side_triangle.lengths[0]*2
|
224
|
+
end
|
225
|
+
@area=(@base+@top)/2*@height
|
226
|
+
elsif base and top and height
|
227
|
+
@height=height;@base=base;@top=top
|
228
|
+
@side_triangle=Triangle.new(lengths: [@height,(@base-@top)/2,nil],angles: [Angle.pi/2])
|
229
|
+
@side=@side_triangle.lengths[2]
|
230
|
+
@area=(@base+@top)/2*@height
|
231
|
+
elsif area and base and top
|
232
|
+
@area=area; @base=base; @top=top
|
233
|
+
@height=(@area*2)/(@base+@top)
|
234
|
+
@side_triangle=Triangle.new(angles: [Angle.pi/2], lengths: [@height,(@base-@top)/2])
|
235
|
+
@side=@side_triangle.lengths[2]
|
236
|
+
elsif area and angle and base
|
237
|
+
#TODO: area and angle and base
|
238
|
+
|
239
|
+
#@angle=angle; @area=area; @base=base
|
240
|
+
#@height=(Math.sqrt((@base**2)+(4*Math.tan(@angle)*@area))-@base)/(2*Math.tan(@angle))
|
241
|
+
#@side_triangle=Triangle.new(angles: [@angle,nil,Angle.pi/2], lengths: [@height,nil,nil])
|
242
|
+
#@side=@side_triangle.lengths[2]
|
243
|
+
#@top=@base+@side_triangle.lengths[0]*2
|
244
|
+
end
|
245
|
+
@perimeter=@base+@top+(@side*2)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
|
2
|
+
module Pulo
|
3
|
+
|
4
|
+
module Figure3D
|
5
|
+
include Quantity_Checker
|
6
|
+
attr_reader :volume, :surfacearea
|
7
|
+
end
|
8
|
+
|
9
|
+
class Sphere
|
10
|
+
include Figure3D
|
11
|
+
attr_reader :radius,:diameter
|
12
|
+
def initialize(radius: nil, diameter: nil, volume: nil)
|
13
|
+
quantity_check [radius,Length] ,[diameter,Length], [volume, Volume]
|
14
|
+
raise "Need more arguments for Sphere" unless volume || diameter || radius
|
15
|
+
if volume
|
16
|
+
@volume=volume
|
17
|
+
@radius=(@volume*3/(Angle.pi*4)).rt(3)
|
18
|
+
@diameter=@radius*2
|
19
|
+
else
|
20
|
+
if diameter
|
21
|
+
@diameter=diameter
|
22
|
+
@radius=@diameter/2
|
23
|
+
else
|
24
|
+
@radius=radius
|
25
|
+
@diameter=@radius*2
|
26
|
+
end
|
27
|
+
@volume=(@radius**3)*(4.0/3.0)*Angle.pi
|
28
|
+
end
|
29
|
+
@surfacearea=@radius**2*(4*Angle.pi)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Cube
|
34
|
+
include Figure3D
|
35
|
+
attr_reader :length, :face
|
36
|
+
|
37
|
+
def initialize(length: nil, face: nil, volume: nil)
|
38
|
+
quantity_check [length,Length] ,[face,Square], [volume, Volume]
|
39
|
+
raise 'Cube needs volume or face or length.' unless (length || volume || face)
|
40
|
+
|
41
|
+
if volume
|
42
|
+
@volume=volume
|
43
|
+
@length=volume.rt(3)
|
44
|
+
@face=Square.new(width: @length)
|
45
|
+
elsif face
|
46
|
+
@face=face
|
47
|
+
@length=@face.width
|
48
|
+
@volume=@face.area*@length
|
49
|
+
elsif length
|
50
|
+
@length=length
|
51
|
+
@face=Square.new(width: @length)
|
52
|
+
@volume=@face.area*@length
|
53
|
+
end
|
54
|
+
@surfacearea=@face.area*6
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class Cuboid
|
59
|
+
include Figure3D
|
60
|
+
attr_reader :width, :length, :height, :faces
|
61
|
+
def initialize(width: nil, height: nil, length: nil, volume: nil, face: nil)
|
62
|
+
raise 'Cuboid needs width, length and height or volume and face or length and face.' unless ((width && length && height) || (volume && face) || (length && face))
|
63
|
+
|
64
|
+
@faces=[]
|
65
|
+
if width and length and height
|
66
|
+
@width=width; @length=length; @height=height
|
67
|
+
@faces[0]=Rectangle.new(width: width, height: height)
|
68
|
+
@faces[1]=Rectangle.new(width: width, height: length)
|
69
|
+
@faces[2]=Rectangle.new(width: length, height: height)
|
70
|
+
@volume=@faces[0].area*@length
|
71
|
+
end
|
72
|
+
if volume and face
|
73
|
+
@volume=volume
|
74
|
+
@faces[0]=face
|
75
|
+
@width=@faces[0].width
|
76
|
+
@height=@faces[0].height
|
77
|
+
@length=@volume/@faces[0].area
|
78
|
+
@faces[1]=Rectangle.new(width: @width, height: @length)
|
79
|
+
@faces[2]=Rectangle.new(width: @length, height: @height)
|
80
|
+
end
|
81
|
+
if face and length
|
82
|
+
@faces[0]=face
|
83
|
+
@length=length
|
84
|
+
@volume=face.area * length
|
85
|
+
@width=@faces[0].width
|
86
|
+
@height=@faces[0].height
|
87
|
+
@faces[1]=Rectangle.new(width: @width, height: @length)
|
88
|
+
@faces[2]=Rectangle.new(width: @length, height: @height)
|
89
|
+
end
|
90
|
+
@surfacearea=(@faces[0].area+@faces[1].area+@faces[2].area)*2
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class Cylinder
|
95
|
+
include Figure3D
|
96
|
+
|
97
|
+
attr_reader :face, :length
|
98
|
+
def initialize (face: nil, length: nil, volume: nil, radius: nil, diameter: nil)
|
99
|
+
quantity_check [face,Circle] ,[length,Length] , [volume,Volume], [radius, Length], [diameter, Length]
|
100
|
+
raise 'Cylinder needs length and face or volume and length or volume and radius or diameter.' unless
|
101
|
+
(face && length) || (volume && length) || (volume && (radius || diameter)) || (length && (radius || diameter))
|
102
|
+
|
103
|
+
if face and length
|
104
|
+
@face=face
|
105
|
+
@length=length
|
106
|
+
@volume=@face.area*@length
|
107
|
+
else
|
108
|
+
if volume and length
|
109
|
+
@length=length
|
110
|
+
@volume=volume
|
111
|
+
@face=Circle.new(area: @volume/@length)
|
112
|
+
else
|
113
|
+
if (radius or diameter) and volume
|
114
|
+
@face=Circle.new(radius: radius, diameter: diameter)
|
115
|
+
@volume=volume
|
116
|
+
@length=volume/@face.area
|
117
|
+
else
|
118
|
+
@face=Circle.new(radius: radius, diameter: diameter)
|
119
|
+
@length=length
|
120
|
+
@volume=@face.area*@length
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
@surfacearea=@face.area*2+@face.perimeter*@length
|
126
|
+
@area=@face.area
|
127
|
+
@radius=@face.radius
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
class Prism
|
132
|
+
include Figure3D
|
133
|
+
attr_reader :face, :length
|
134
|
+
attr_reader :side_areas
|
135
|
+
def initialize(face: nil, length: nil)
|
136
|
+
quantity_check [face,Triangle] ,[length,Length]
|
137
|
+
raise 'Prism needs a face and length.' unless face && length
|
138
|
+
@face=face
|
139
|
+
@length=length
|
140
|
+
@volume=@face.area*@length
|
141
|
+
@side_areas=[]
|
142
|
+
@side_areas[0]=@face.lengths[0]*@length
|
143
|
+
@side_areas[1]=@face.lengths[1]*@length
|
144
|
+
@side_areas[2]=@face.lengths[2]*@length
|
145
|
+
@surfacearea=@face.area*2+@side_areas[0]+@side_areas[1]+@side_areas[2]
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
class TrapezoidalPrism
|
150
|
+
include Figure3D
|
151
|
+
attr_reader :face, :length
|
152
|
+
attr_reader :base_area,:side_area,:top_area
|
153
|
+
def initialize(face: nil, length: nil)
|
154
|
+
quantity_check [face,Trapezoid] ,[length,Length]
|
155
|
+
raise 'TrapezoidalPrism needs a face and length.' unless face && length
|
156
|
+
@face=face
|
157
|
+
@length=length
|
158
|
+
@volume=@face.area*@length
|
159
|
+
@base_area=@face.base*@length
|
160
|
+
@side_area=@face.side*@length
|
161
|
+
@top_area=@face.top*@length
|
162
|
+
@surfacearea=@face.area*2+@base_area+@top_area+@side_area*2
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|