pulo 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|