cossincalc 1.0.6 → 1.0.7
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.
- data/MIT-LICENSE +1 -1
- data/README.markdown +112 -0
- data/lib/cossincalc/triangle/calculator.rb +35 -53
- data/lib/cossincalc/triangle/variable_hash.rb +10 -0
- data/lib/cossincalc/triangle.rb +6 -5
- data/lib/cossincalc/version.rb +1 -1
- metadata +7 -6
data/MIT-LICENSE
CHANGED
data/README.markdown
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
CosSinCalc
|
2
|
+
==========
|
3
|
+
|
4
|
+
CosSinCalc is a [web application](http://cossincalc.com/) able to calculate the variables of a triangle and even draw it for you!
|
5
|
+
|
6
|
+
This is an offline version of the calculator available as a Ruby gem.
|
7
|
+
You can use the included command line utility to generate a PDF page containing all the results, formulae and a drawing of the triangle, *or* you can include it as a library in your Ruby application and use just the features you care about.
|
8
|
+
|
9
|
+
The main features are:
|
10
|
+
|
11
|
+
* Calculating the missing variables of the triangle
|
12
|
+
* Calculating additional variables (ie. altitudes, medians, angle bisectors, area, circumference)
|
13
|
+
* Generating an SVG or PNG (via [ImageMagick](http://www.imagemagick.org/)) drawing of the triangle
|
14
|
+
* Generating a LaTeX or PDF (via `pdflatex`) document containing the calculations, the steps performed and a drawing.
|
15
|
+
|
16
|
+
Usage
|
17
|
+
-----
|
18
|
+
|
19
|
+
For instructions on how to use the command line utility, please run `cossincalc --help` after installation.
|
20
|
+
|
21
|
+
Basic usage through an `irb` console:
|
22
|
+
|
23
|
+
>> require 'rubygems'
|
24
|
+
=> true
|
25
|
+
>> require 'cossincalc'
|
26
|
+
=> true
|
27
|
+
|
28
|
+
# Pass the known side and angle values to the initialization method as two
|
29
|
+
# hashes. The valid keys (variable names) are :a, :b and :c.
|
30
|
+
# It is important that you provide the values as strings as they wouldn't
|
31
|
+
# be parsed and converted properly, otherwise.
|
32
|
+
>> triangle = CosSinCalc::Triangle.new({ :a => "3.0", :c => "5" }, { :c => "90" })
|
33
|
+
=> #<CosSinCalc::Triangle:0x25058e8>
|
34
|
+
|
35
|
+
>> triangle.calculate!
|
36
|
+
=> true
|
37
|
+
|
38
|
+
# Fetch angle A, but in radians and unrounded.
|
39
|
+
>> triangle.angle(:a)
|
40
|
+
=> 0.643501108793284
|
41
|
+
|
42
|
+
# Fetch angle A in degrees and rounded.
|
43
|
+
>> triangle.humanize.angle(:a)
|
44
|
+
=> "36.87"
|
45
|
+
|
46
|
+
# Change the output precision.
|
47
|
+
>> triangle.humanize(3).angle(:a)
|
48
|
+
=> "36.870"
|
49
|
+
|
50
|
+
# Fetch another variable (side b).
|
51
|
+
>> triangle.humanize.side(:b)
|
52
|
+
=> "4.00"
|
53
|
+
|
54
|
+
# There are many available variables:
|
55
|
+
# altitude(:c), median(:a), angle_bisector(:a), area(), circumference()
|
56
|
+
|
57
|
+
### Change angle unit ###
|
58
|
+
The default unit used for angles is degrees, however both radians and gon may be used.
|
59
|
+
|
60
|
+
>> triangle = CosSinCalc::Triangle.new({ :a => "3.0", :c => "5" }, { :c => (Math::PI/2).to_s, :unit => :radian })
|
61
|
+
=> #<CosSinCalc::Triangle:0x25058e8>
|
62
|
+
|
63
|
+
>> triangle = CosSinCalc::Triangle.new({ :a => "3.0", :c => "5" }, { :c => "100", :unit => :gon })
|
64
|
+
=> #<CosSinCalc::Triangle:0x25058e8>
|
65
|
+
|
66
|
+
Note that no unit is used for side values as it doesn't matter to the calculation.
|
67
|
+
|
68
|
+
### Generate an SVG or PNG drawing ###
|
69
|
+
>> triangle = ...; triangle.calculate!
|
70
|
+
=> true
|
71
|
+
|
72
|
+
# Save an SVG version of the drawing by initializing a new Drawing
|
73
|
+
# instance and passing the name of the file to be created to the save_svg
|
74
|
+
# method.
|
75
|
+
>> CosSinCalc::Triangle::Drawing.new(triangle.humanize).save_svg('my-vector-drawing')
|
76
|
+
=> true
|
77
|
+
|
78
|
+
# Save a PNG version of the drawing by initializing a new Drawing
|
79
|
+
# instance and passing the name of the file to be created to the save_png
|
80
|
+
# method.
|
81
|
+
# In fact, an SVG file is created first and then converted to a PNG image
|
82
|
+
# by ImageMagick. Make sure to have ImageMagick installed if you want to
|
83
|
+
# use this feature.
|
84
|
+
>> CosSinCalc::Triangle::Drawing.new(triangle.humanize).save_png('my-png-drawing')
|
85
|
+
=> true
|
86
|
+
|
87
|
+
### Generate a PDF document ###
|
88
|
+
>> triangle = ...; triangle.calculate!
|
89
|
+
=> true
|
90
|
+
|
91
|
+
# Pass the wanted filename to the save_pdf method of the Latex instance.
|
92
|
+
# Make sure to have a LaTeX distribution installed (as well as the
|
93
|
+
# amsmath, amsfonts and graphicx packages) if you want to make use
|
94
|
+
# of this feature.
|
95
|
+
>> CosSinCalc::Triangle::Formatter::Latex.new(triangle.humanize).save_pdf('my-result-document')
|
96
|
+
=> true
|
97
|
+
|
98
|
+
Installation
|
99
|
+
------------
|
100
|
+
|
101
|
+
To install it as a Ruby gem, please run
|
102
|
+
|
103
|
+
gem install cossincalc
|
104
|
+
|
105
|
+
In order for this to work, you must have [Ruby](http://www.ruby-lang.org/) and [RubyGems](http://rubygems.org) installed.
|
106
|
+
|
107
|
+
- - -
|
108
|
+
|
109
|
+
Feature requests, ideas, questions etc. is recieved at <http://getsatisfaction.com/cossincalc>.
|
110
|
+
Bugs should be submitted to the [issue tracker](http://github.com/molte/cossincalc_offline/issues).
|
111
|
+
|
112
|
+
Copyright (c) 2010-2011 Molte Emil Strange Andersen, released under the MIT license.
|
@@ -29,8 +29,9 @@ module CosSinCalc
|
|
29
29
|
end
|
30
30
|
|
31
31
|
private
|
32
|
-
|
33
|
-
|
32
|
+
# Returns the first variable in the given array and the rest of the variables separately.
|
33
|
+
def first(vars)
|
34
|
+
return vars.first, rest(vars.first)
|
34
35
|
end
|
35
36
|
|
36
37
|
def sq(value)
|
@@ -39,73 +40,54 @@ module CosSinCalc
|
|
39
40
|
|
40
41
|
# Calculates all three angles when all three sides are known.
|
41
42
|
def calculate_three_angles
|
42
|
-
each do |v, r|
|
43
|
-
|
44
|
-
|
45
|
-
equation('@1=\arccos\left(\frac{$2^2+$3^2-$1^2}{2 * $2 * $3}\right)', v, *r)
|
46
|
-
end
|
43
|
+
each(angles.unknown) do |v, r|
|
44
|
+
angle[v] = calculate_angle_by_sides(v, r)
|
45
|
+
equation('@1=\arccos\left(\frac{$2^2+$3^2-$1^2}{2 * $2 * $3}\right)', v, *r)
|
47
46
|
end
|
48
47
|
end
|
49
48
|
|
50
49
|
# Calculates two unknown angles when two sides and one angle are known.
|
51
50
|
def calculate_two_angles
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
@alt.calculate_side_and_angle
|
72
|
-
end
|
73
|
-
|
74
|
-
calculate_two_sides
|
75
|
-
break
|
76
|
-
end
|
77
|
-
end
|
78
|
-
break
|
79
|
-
end
|
51
|
+
v, r = first(angles.known)
|
52
|
+
|
53
|
+
unless side(v)
|
54
|
+
side[v] = sqrt sq(sides(r)).inject(&:+) -
|
55
|
+
2 * sides(r).inject(&:*) * cos(angle(v))
|
56
|
+
equation('$1=\sqrt{$2^2+$3^2-2 * $2 * $3 * \cos(@1)}', v, *r)
|
57
|
+
calculate_three_angles
|
58
|
+
return
|
59
|
+
end
|
60
|
+
|
61
|
+
v2, r2 = first sides.known(r)
|
62
|
+
angle[v2] = asin sin(angle(v)) * side(v2) / side(v)
|
63
|
+
equation('@2=\arcsin\left(\frac{\sin(@1) * $2}{$1}\right)', v, v2)
|
64
|
+
|
65
|
+
if ambiguous_case?(v, v2)
|
66
|
+
@alt = CosSinCalc::Triangle.new(sides, angles, self)
|
67
|
+
@alt.angle[v2] = PI - angle(v2)
|
68
|
+
@alt.equation('@2=@pi-\arcsin\left(\frac{\sin(@1) * $2}{$1}\right)', v, v2)
|
69
|
+
@alt.calculate_side_and_angle
|
80
70
|
end
|
71
|
+
|
72
|
+
calculate_two_sides
|
81
73
|
end
|
82
74
|
|
83
75
|
# Calculates up to two unknown sides when at least one side and two angles are known.
|
84
76
|
def calculate_two_sides
|
85
77
|
calculate_last_angle
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
side[v2] = sin(angle(v2)) * side(v) / sin(angle(v))
|
92
|
-
equation('$2=\frac{\sin(@2) * $1}{\sin(@1)}', v, v2)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
break
|
96
|
-
end
|
78
|
+
v, r = first(sides.known)
|
79
|
+
|
80
|
+
each sides.unknown(r) do |v2|
|
81
|
+
side[v2] = sin(angle(v2)) * side(v) / sin(angle(v))
|
82
|
+
equation('$2=\frac{\sin(@2) * $1}{\sin(@1)}', v, v2)
|
97
83
|
end
|
98
84
|
end
|
99
85
|
|
100
86
|
# Calculates the last unknown angle.
|
101
87
|
def calculate_last_angle
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
equation('@1=@pi-@2-@3', v, *r)
|
106
|
-
break
|
107
|
-
end
|
108
|
-
end
|
88
|
+
v, r = first(angles.unknown)
|
89
|
+
angle[v] = PI - angles(r).inject(&:+)
|
90
|
+
equation('@1=@pi-@2-@3', v, *r)
|
109
91
|
end
|
110
92
|
|
111
93
|
# Calculates and returns whether the triangle has multiple solutions.
|
@@ -19,6 +19,16 @@ module CosSinCalc
|
|
19
19
|
def amount
|
20
20
|
self.values.compact.size
|
21
21
|
end
|
22
|
+
|
23
|
+
# Returns an array of variables whose values are known.
|
24
|
+
def known(vars = CosSinCalc::Triangle::VARIABLES)
|
25
|
+
vars.reject { |v| !self[v] }
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns an array of variables whose values are unknown.
|
29
|
+
def unknown(vars = CosSinCalc::Triangle::VARIABLES)
|
30
|
+
vars.reject { |v| self[v] }
|
31
|
+
end
|
22
32
|
end
|
23
33
|
end
|
24
34
|
end
|
data/lib/cossincalc/triangle.rb
CHANGED
@@ -54,8 +54,8 @@ module CosSinCalc
|
|
54
54
|
# Returns the length of the line which starts at the corner and is perpendicular with the opposite side.
|
55
55
|
def altitude(v)
|
56
56
|
require_calculation
|
57
|
-
|
58
|
-
Math.sin(angle(
|
57
|
+
r1, r2 = *rest(v)
|
58
|
+
Math.sin(angle(r1)) * side(r2)
|
59
59
|
end
|
60
60
|
|
61
61
|
# Returns the length of the line going from the corner to the middle of the opposite side.
|
@@ -67,14 +67,15 @@ module CosSinCalc
|
|
67
67
|
# Returns the length of the line between a corner and the opposite side which bisects the angle at the corner.
|
68
68
|
def angle_bisector(v)
|
69
69
|
require_calculation
|
70
|
-
|
71
|
-
Math.sin(angle(
|
70
|
+
r1, r2 = *rest(v)
|
71
|
+
Math.sin(angle(r1)) * side(r2) / Math.sin(angle(r2) + angle(v) / 2)
|
72
72
|
end
|
73
73
|
|
74
74
|
# Returns the area of the triangle.
|
75
75
|
def area
|
76
76
|
require_calculation
|
77
|
-
|
77
|
+
v1, v2, v3 = *VARIABLES
|
78
|
+
side(v1) * side(v2) * Math.sin(angle(v3)) / 2
|
78
79
|
end
|
79
80
|
|
80
81
|
# Returns the circumference of the triangle.
|
data/lib/cossincalc/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cossincalc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 25
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 7
|
10
|
+
version: 1.0.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Molte Emil Strange Andersen
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-04-20 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -32,6 +32,7 @@ extensions: []
|
|
32
32
|
extra_rdoc_files: []
|
33
33
|
|
34
34
|
files:
|
35
|
+
- README.markdown
|
35
36
|
- MIT-LICENSE
|
36
37
|
- Rakefile
|
37
38
|
- lib/core_ext.rb
|
@@ -77,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
78
|
requirements: []
|
78
79
|
|
79
80
|
rubyforge_project:
|
80
|
-
rubygems_version: 1.
|
81
|
+
rubygems_version: 1.4.1
|
81
82
|
signing_key:
|
82
83
|
specification_version: 3
|
83
84
|
summary: Triangle calculator
|