picrate 0.0.2-java

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.
Files changed (179) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +47 -0
  3. data/.mvn/extensions.xml +9 -0
  4. data/.mvn/wrapper/maven-wrapper.properties +1 -0
  5. data/.travis.yml +10 -0
  6. data/CHANGELOG.md +4 -0
  7. data/LICENSE.md +165 -0
  8. data/README.md +51 -0
  9. data/Rakefile +59 -0
  10. data/bin/picrate +8 -0
  11. data/docs/.gitignore +6 -0
  12. data/docs/_config.yml +30 -0
  13. data/docs/_includes/footer.html +38 -0
  14. data/docs/_includes/head.html +16 -0
  15. data/docs/_includes/header.html +27 -0
  16. data/docs/_includes/icon-github.html +1 -0
  17. data/docs/_includes/icon-github.svg +1 -0
  18. data/docs/_includes/icon-twitter.html +1 -0
  19. data/docs/_includes/icon-twitter.svg +1 -0
  20. data/docs/_includes/navigation.html +24 -0
  21. data/docs/_layouts/default.html +20 -0
  22. data/docs/_layouts/page.html +14 -0
  23. data/docs/_layouts/post.html +15 -0
  24. data/docs/_posts/2018-05-06-getting_started.md +8 -0
  25. data/docs/_posts/2018-05-06-install_jruby.md +35 -0
  26. data/docs/_sass/_base.scss +206 -0
  27. data/docs/_sass/_layout.scss +242 -0
  28. data/docs/_sass/_syntax-highlighting.scss +71 -0
  29. data/docs/about.md +10 -0
  30. data/docs/css/main.scss +38 -0
  31. data/docs/favicon.ico +0 -0
  32. data/docs/feed.xml +30 -0
  33. data/docs/index.html +38 -0
  34. data/lib/picrate.rb +10 -0
  35. data/lib/picrate/app.rb +187 -0
  36. data/lib/picrate/creators/sketch_class.rb +57 -0
  37. data/lib/picrate/creators/sketch_factory.rb +12 -0
  38. data/lib/picrate/creators/sketch_writer.rb +21 -0
  39. data/lib/picrate/helper_methods.rb +214 -0
  40. data/lib/picrate/helpers/numeric.rb +9 -0
  41. data/lib/picrate/library.rb +69 -0
  42. data/lib/picrate/library_loader.rb +53 -0
  43. data/lib/picrate/native_folder.rb +35 -0
  44. data/lib/picrate/native_loader.rb +27 -0
  45. data/lib/picrate/runner.rb +81 -0
  46. data/lib/picrate/version.rb +4 -0
  47. data/library/boids/boids.rb +209 -0
  48. data/library/chooser/chooser.rb +19 -0
  49. data/library/control_panel/control_panel.rb +182 -0
  50. data/library/library_proxy/README.md +99 -0
  51. data/library/library_proxy/library_proxy.rb +14 -0
  52. data/library/slider/slider.rb +42 -0
  53. data/library/vector_utils/vector_utils.rb +69 -0
  54. data/library/video_event/video_event.rb +3 -0
  55. data/license.txt +508 -0
  56. data/picrate.gemspec +35 -0
  57. data/pom.rb +122 -0
  58. data/pom.xml +214 -0
  59. data/src/main/java/japplemenubar/JAppleMenuBar.java +88 -0
  60. data/src/main/java/japplemenubar/libjAppleMenuBar.jnilib +0 -0
  61. data/src/main/java/monkstone/ColorUtil.java +115 -0
  62. data/src/main/java/monkstone/MathToolModule.java +236 -0
  63. data/src/main/java/monkstone/PicrateLibrary.java +47 -0
  64. data/src/main/java/monkstone/core/LibraryProxy.java +127 -0
  65. data/src/main/java/monkstone/fastmath/Deglut.java +122 -0
  66. data/src/main/java/monkstone/fastmath/package-info.java +6 -0
  67. data/src/main/java/monkstone/filechooser/Chooser.java +48 -0
  68. data/src/main/java/monkstone/noise/SimplexNoise.java +465 -0
  69. data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +168 -0
  70. data/src/main/java/monkstone/slider/CustomVerticalSlider.java +182 -0
  71. data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +149 -0
  72. data/src/main/java/monkstone/slider/SimpleSlider.java +196 -0
  73. data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +163 -0
  74. data/src/main/java/monkstone/slider/Slider.java +67 -0
  75. data/src/main/java/monkstone/slider/SliderBar.java +277 -0
  76. data/src/main/java/monkstone/slider/SliderGroup.java +78 -0
  77. data/src/main/java/monkstone/slider/WheelHandler.java +35 -0
  78. data/src/main/java/monkstone/vecmath/AppRender.java +87 -0
  79. data/src/main/java/monkstone/vecmath/JRender.java +56 -0
  80. data/src/main/java/monkstone/vecmath/ShapeRender.java +87 -0
  81. data/src/main/java/monkstone/vecmath/package-info.java +20 -0
  82. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +757 -0
  83. data/src/main/java/monkstone/vecmath/vec2/package-info.java +6 -0
  84. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +727 -0
  85. data/src/main/java/monkstone/vecmath/vec3/package-info.java +6 -0
  86. data/src/main/java/monkstone/videoevent/VideoInterface.java +42 -0
  87. data/src/main/java/monkstone/videoevent/package-info.java +20 -0
  88. data/src/main/java/processing/awt/PGraphicsJava2D.java +3098 -0
  89. data/src/main/java/processing/awt/PShapeJava2D.java +401 -0
  90. data/src/main/java/processing/awt/PSurfaceAWT.java +1660 -0
  91. data/src/main/java/processing/core/PApplet.java +17647 -0
  92. data/src/main/java/processing/core/PConstants.java +1033 -0
  93. data/src/main/java/processing/core/PFont.java +1250 -0
  94. data/src/main/java/processing/core/PGraphics.java +9614 -0
  95. data/src/main/java/processing/core/PImage.java +3608 -0
  96. data/src/main/java/processing/core/PMatrix.java +347 -0
  97. data/src/main/java/processing/core/PMatrix2D.java +694 -0
  98. data/src/main/java/processing/core/PMatrix3D.java +1153 -0
  99. data/src/main/java/processing/core/PShape.java +4332 -0
  100. data/src/main/java/processing/core/PShapeOBJ.java +544 -0
  101. data/src/main/java/processing/core/PShapeSVG.java +1987 -0
  102. data/src/main/java/processing/core/PStyle.java +208 -0
  103. data/src/main/java/processing/core/PSurface.java +242 -0
  104. data/src/main/java/processing/core/PSurfaceNone.java +479 -0
  105. data/src/main/java/processing/core/PVector.java +1140 -0
  106. data/src/main/java/processing/data/FloatDict.java +829 -0
  107. data/src/main/java/processing/data/FloatList.java +912 -0
  108. data/src/main/java/processing/data/IntDict.java +796 -0
  109. data/src/main/java/processing/data/IntList.java +913 -0
  110. data/src/main/java/processing/data/JSONArray.java +1260 -0
  111. data/src/main/java/processing/data/JSONObject.java +2282 -0
  112. data/src/main/java/processing/data/JSONTokener.java +435 -0
  113. data/src/main/java/processing/data/Sort.java +46 -0
  114. data/src/main/java/processing/data/StringDict.java +601 -0
  115. data/src/main/java/processing/data/StringList.java +775 -0
  116. data/src/main/java/processing/data/Table.java +4923 -0
  117. data/src/main/java/processing/data/TableRow.java +198 -0
  118. data/src/main/java/processing/data/XML.java +1149 -0
  119. data/src/main/java/processing/event/Event.java +108 -0
  120. data/src/main/java/processing/event/KeyEvent.java +70 -0
  121. data/src/main/java/processing/event/MouseEvent.java +149 -0
  122. data/src/main/java/processing/event/TouchEvent.java +57 -0
  123. data/src/main/java/processing/javafx/PGraphicsFX2D.java +354 -0
  124. data/src/main/java/processing/opengl/FontTexture.java +379 -0
  125. data/src/main/java/processing/opengl/FrameBuffer.java +503 -0
  126. data/src/main/java/processing/opengl/LinePath.java +623 -0
  127. data/src/main/java/processing/opengl/LineStroker.java +685 -0
  128. data/src/main/java/processing/opengl/PGL.java +3366 -0
  129. data/src/main/java/processing/opengl/PGraphics2D.java +615 -0
  130. data/src/main/java/processing/opengl/PGraphics3D.java +281 -0
  131. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +13634 -0
  132. data/src/main/java/processing/opengl/PJOGL.java +1966 -0
  133. data/src/main/java/processing/opengl/PShader.java +1478 -0
  134. data/src/main/java/processing/opengl/PShapeOpenGL.java +5234 -0
  135. data/src/main/java/processing/opengl/PSurfaceJOGL.java +1315 -0
  136. data/src/main/java/processing/opengl/Texture.java +1670 -0
  137. data/src/main/java/processing/opengl/VertexBuffer.java +88 -0
  138. data/src/main/java/processing/opengl/cursors/arrow.png +0 -0
  139. data/src/main/java/processing/opengl/cursors/cross.png +0 -0
  140. data/src/main/java/processing/opengl/cursors/hand.png +0 -0
  141. data/src/main/java/processing/opengl/cursors/license.txt +27 -0
  142. data/src/main/java/processing/opengl/cursors/move.png +0 -0
  143. data/src/main/java/processing/opengl/cursors/text.png +0 -0
  144. data/src/main/java/processing/opengl/cursors/wait.png +0 -0
  145. data/src/main/java/processing/opengl/shaders/ColorFrag.glsl +32 -0
  146. data/src/main/java/processing/opengl/shaders/ColorVert.glsl +34 -0
  147. data/src/main/java/processing/opengl/shaders/LightFrag.glsl +33 -0
  148. data/src/main/java/processing/opengl/shaders/LightVert-vc4.glsl +154 -0
  149. data/src/main/java/processing/opengl/shaders/LightVert.glsl +151 -0
  150. data/src/main/java/processing/opengl/shaders/LineFrag.glsl +32 -0
  151. data/src/main/java/processing/opengl/shaders/LineVert.glsl +100 -0
  152. data/src/main/java/processing/opengl/shaders/MaskFrag.glsl +40 -0
  153. data/src/main/java/processing/opengl/shaders/PointFrag.glsl +32 -0
  154. data/src/main/java/processing/opengl/shaders/PointVert.glsl +56 -0
  155. data/src/main/java/processing/opengl/shaders/TexFrag.glsl +37 -0
  156. data/src/main/java/processing/opengl/shaders/TexLightFrag.glsl +37 -0
  157. data/src/main/java/processing/opengl/shaders/TexLightVert-vc4.glsl +160 -0
  158. data/src/main/java/processing/opengl/shaders/TexLightVert.glsl +157 -0
  159. data/src/main/java/processing/opengl/shaders/TexVert.glsl +38 -0
  160. data/src/main/resources/icon/icon-1024.png +0 -0
  161. data/src/main/resources/icon/icon-128.png +0 -0
  162. data/src/main/resources/icon/icon-16.png +0 -0
  163. data/src/main/resources/icon/icon-256.png +0 -0
  164. data/src/main/resources/icon/icon-32.png +0 -0
  165. data/src/main/resources/icon/icon-48.png +0 -0
  166. data/src/main/resources/icon/icon-512.png +0 -0
  167. data/src/main/resources/icon/icon-64.png +0 -0
  168. data/src/main/resources/license.txt +508 -0
  169. data/test/create_test.rb +68 -0
  170. data/test/deglut_spec_test.rb +24 -0
  171. data/test/helper_methods_test.rb +58 -0
  172. data/test/math_tool_test.rb +75 -0
  173. data/test/respond_to_test.rb +215 -0
  174. data/test/sketches/key_event.rb +37 -0
  175. data/test/sketches/library/my_library/my_library.rb +32 -0
  176. data/test/test_helper.rb +3 -0
  177. data/test/vecmath_spec_test.rb +522 -0
  178. data/vendors/Rakefile +127 -0
  179. metadata +289 -0
@@ -0,0 +1,32 @@
1
+ # This class demonstrates how by inheriting from the abstract class LibraryProxy
2
+ # we can access 'keyEvent' and 'draw' (Note we need a draw method even
3
+ # though can be empty)
4
+ class MyLibrary < LibraryProxy
5
+ java_import 'processing.event.KeyEvent'
6
+
7
+ attr_reader :app
8
+
9
+ def initialize(parent)
10
+ @app = parent
11
+ end
12
+
13
+ def draw # optional
14
+ fill app.color(200, 0, 0, 100)
15
+ app.rect 100, 100, 60, 90
16
+ end
17
+
18
+ # favor guard clause no_op unless key pressed
19
+ # and no_op unless ascii key
20
+ def keyEvent(e) # NB: need camel case for reflection to work
21
+ return unless e.get_action == KeyEvent::PRESS
22
+ return if e.get_key > 122 # else we can't use :chr
23
+ case e.get_key.chr.upcase
24
+ when 'S'
25
+ app.send :hide, false
26
+ when 'H'
27
+ app.send :hide, true
28
+ else
29
+ puts e.get_key.chr
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ gem 'minitest'
2
+ require 'minitest/pride'
3
+ require 'minitest/autorun'
@@ -0,0 +1,522 @@
1
+ require_relative 'test_helper'
2
+ require 'java'
3
+ require_relative '../lib/picrate'
4
+
5
+ Java::Monkstone::PicrateLibrary.load(JRuby.runtime)
6
+
7
+
8
+ Dir.chdir(File.dirname(__FILE__))
9
+
10
+ class VecmathTest < Minitest::Test
11
+
12
+ # duck for Vec2D constructor
13
+ Point = Struct.new(:x, :y)
14
+ # duck for Vec3D constructor
15
+ Point3 = Struct.new(:x, :y, :z)
16
+ # non-duck to test fail
17
+ Pointless = Struct.new(:a, :b)
18
+ # non-duck to test fail
19
+ Pointless3 = Struct.new(:a, :b, :c)
20
+ def setup
21
+
22
+ end
23
+
24
+ def test_equals
25
+ x, y = 1.0000001, 1.01
26
+ a = Vec2D.new(x, y)
27
+ assert_equal(a.to_a, [x, y], 'Failed to return Vec2D as an Array')
28
+ end
29
+
30
+ def test_not_equals
31
+ a = Vec2D.new(3, 5)
32
+ b = Vec2D.new(6, 7)
33
+ refute_equal(a, b, 'Failed equals false')
34
+ end
35
+
36
+ def test_copy_equals
37
+ x, y = 1.0000001, 1.01
38
+ a = Vec2D.new(x, y)
39
+ b = a.copy
40
+ assert_equal(a.to_a, b.to_a, 'Failed deep copy')
41
+ end
42
+
43
+ def test_constructor_float
44
+ val = Point.new(1.0, 8.0) # duck type
45
+ expected = Vec2D.new(val)
46
+ assert_equal(expected, Vec2D.new(1.0, 8.0), 'Failed duck type constructor floats')
47
+ end
48
+
49
+ def test_constructor_fixnum
50
+ val = Point.new(1, 8) # duck type fixnum
51
+ expected = Vec2D.new(val)
52
+ assert_equal(expected, Vec2D.new(1.0, 8.0), 'Failed duck type constructor fixnum')
53
+ end
54
+
55
+ def test_failed_duck_type
56
+ val = Pointless.new(1.0, 8.0) # non duck type
57
+ assert_raises TypeError do
58
+ Vec2D.new(val)
59
+ end
60
+ end
61
+
62
+ def test_copy_not_equals
63
+ x, y = 1.0000001, 1.01
64
+ a = Vec2D.new(x, y)
65
+ b = a.copy
66
+ b *= 0
67
+ refute_equal(a.to_a, b.to_a, 'Failed deep copy')
68
+ end
69
+
70
+ def test_equals_when_close
71
+ a = Vec2D.new(3.0000000, 5.00000)
72
+ b = Vec2D.new(3.0000000, 5.000001)
73
+ assert_equal(a, b, 'Failed to return equal when v. close')
74
+ end
75
+
76
+ def test_sum
77
+ a = Vec2D.new(3, 5)
78
+ b = Vec2D.new(6, 7)
79
+ c = Vec2D.new(9, 12)
80
+ assert_equal(a + b, c, 'Failed to sum vectors')
81
+ end
82
+
83
+ def test_subtract
84
+ a = Vec2D.new(3, 5)
85
+ b = Vec2D.new(6, 7)
86
+ c = Vec2D.new(-3, -2)
87
+ assert_equal(a - b, c, 'Failed to subtract vectors')
88
+ end
89
+
90
+ def test_multiply
91
+ a = Vec2D.new(3, 5)
92
+ b = 2
93
+ c = a * b
94
+ d = Vec2D.new(6, 10)
95
+ assert_equal(c, d, 'Failed to multiply vector by scalar')
96
+ end
97
+
98
+ def test_divide
99
+ a = Vec2D.new(3, 5)
100
+ b = 2
101
+ c = Vec2D.new(1.5, 2.5)
102
+ d = a / b
103
+ assert_equal(c, d, 'Failed to divide vector by scalar')
104
+ end
105
+
106
+ def test_dot
107
+ a = Vec2D.new(3, 5)
108
+ b = Vec2D.new(6, 7)
109
+ assert_in_epsilon(a.dot(b), 53, 0.001, 'Failed to dot product')
110
+ end
111
+
112
+ def test_self_dot
113
+ a = Vec2D.new(3, 5)
114
+ assert_in_epsilon(a.dot(a), 34, 0.001, 'Failed self dot product')
115
+ end
116
+
117
+ def test_from_angle
118
+ a = Vec2D.from_angle(Math::PI * 0.75)
119
+ assert_equal(a, Vec2D.new(-1 * Math.sqrt(0.5), Math.sqrt(0.5)), 'Failed to create vector from angle')
120
+ end
121
+
122
+ def test_random
123
+ a = Vec2D.random
124
+ assert a.kind_of? Vec2D
125
+ assert_in_epsilon(a.mag, 1.0)
126
+ end
127
+
128
+ def test_assign_value
129
+ a = Vec2D.new(3, 5)
130
+ a.x = 23
131
+ assert_equal(a.x, 23, 'Failed to assign x value')
132
+ end
133
+
134
+ def test_mag
135
+ a = Vec2D.new(-3, -4)
136
+ assert_in_epsilon(a.mag, 5, 0.001,'Failed to return magnitude of vector')
137
+ end
138
+
139
+ def test_mag_variant
140
+ a = Vec2D.new(3.0, 2)
141
+ b = Math.sqrt(3.0**2 + 2**2)
142
+ assert_in_epsilon(a.mag, b, 0.001, 'Failed to return magnitude of vector')
143
+ end
144
+
145
+ def test_mag_zero_one
146
+ a = Vec2D.new(-1, 0)
147
+ assert_in_epsilon(a.mag, 1, 0.001, 'Failed to return magnitude of vector')
148
+ end
149
+
150
+ def test_dist
151
+ a = Vec2D.new(3, 5)
152
+ b = Vec2D.new(6, 7)
153
+ assert_in_epsilon(a.dist(b), Math.sqrt(3.0**2 + 2**2), 0.001, 'Failed to return distance between two vectors')
154
+ end
155
+
156
+ def test_lerp
157
+ a = Vec2D.new(1, 1)
158
+ b = Vec2D.new(3, 3)
159
+ assert_equal(a.lerp(b, 0.5), Vec2D.new(2, 2), 'Failed to return lerp between two vectors')
160
+ end
161
+
162
+ def test_lerp_exception
163
+ a = Vec2D.new(1, 1)
164
+ b = Vec2D.new(3, 3)
165
+ assert_raises SyntaxError do
166
+ a.lerp(b, 0.5, 0.5)
167
+ end
168
+ end
169
+
170
+ def test_lerp_unclamped
171
+ a = Vec2D.new(1, 1)
172
+ b = Vec2D.new(3, 3)
173
+ assert_equal(a.lerp(b, 5), Vec2D.new(11, 11), 'Failed to return lerp between two vectors')
174
+ end
175
+
176
+ def test_lerp!
177
+ a = Vec2D.new(1, 1)
178
+ b = Vec2D.new(3, 3)
179
+ a.lerp!(b, 0.5)
180
+ assert_equal(a, Vec2D.new(2, 2), 'Failed to return lerp! between two vectors')
181
+ end
182
+
183
+ def test_lerp_unclamped!
184
+ a = Vec2D.new(1, 1)
185
+ b = Vec2D.new(3, 3)
186
+ a.lerp!(b, 5)
187
+ assert_equal(a, Vec2D.new(11, 11), 'Failed to return lerp! between two vectors')
188
+ end
189
+
190
+ def test_set_mag
191
+ a = Vec2D.new(1, 1)
192
+ assert_equal(a.set_mag(Math.sqrt(32)), Vec2D.new(4, 4), 'Failed to set_mag vector')
193
+ end
194
+
195
+ def test_set_mag_block
196
+ a = Vec2D.new(1, 1)
197
+ assert_equal(a.set_mag(Math.sqrt(32)) { true }, Vec2D.new(4, 4), 'Failed to set_mag_block true vector')
198
+ end
199
+
200
+ def test_set_mag_block_false
201
+ a = Vec2D.new(1, 1)
202
+ assert_equal(a.set_mag(Math.sqrt(32)) { false }, Vec2D.new(1, 1), 'Failed to set_mag_block true vector')
203
+ end
204
+
205
+ def test_plus_assign
206
+ a = Vec2D.new(3, 5)
207
+ b = Vec2D.new(6, 7)
208
+ a += b
209
+ assert_equal(a, Vec2D.new(9, 12), 'Failed to += assign')
210
+ end
211
+
212
+ def test_normalize
213
+ a = Vec2D.new(3, 5)
214
+ b = a.normalize
215
+ assert_in_epsilon(b.mag, 1, 0.001, 'Failed to return a normalized vector')
216
+ end
217
+
218
+ def test_normalize!
219
+ a = Vec2D.new(3, 5)
220
+ a.normalize!
221
+ assert_in_epsilon(a.mag, 1, 0.001, 'Failed to return a normalized! vector')
222
+ end
223
+
224
+ def test_heading
225
+ a = Vec2D.new(1, 1)
226
+ assert_in_epsilon(a.heading, Math::PI / 4.0, 0.001, 'Failed to return heading in radians')
227
+ end
228
+
229
+ def test_rotate
230
+ x, y = 20, 10
231
+ b = Vec2D.new(x, y)
232
+ a = b.rotate(Math::PI / 2)
233
+ assert_equal(a, Vec2D.new(-10, 20), 'Failed to rotate vector by scalar radians')
234
+ end
235
+
236
+ def test_hash_index
237
+ x, y = 10, 20
238
+ b = Vec2D.new(x, y)
239
+ assert_equal(b[:x], x, 'Failed to hash index')
240
+ end
241
+
242
+ def test_hash_set
243
+ x = 10
244
+ b = Vec2D.new
245
+ b[:x] = x
246
+ assert_equal(b, Vec2D.new(x, 0), 'Failed to hash assign')
247
+ end
248
+
249
+ def test_inspect
250
+ a = Vec2D.new(3, 2.000000000000001)
251
+ assert_equal(a.inspect, 'Vec2D(x = 3.0000, y = 2.0000)')
252
+ end
253
+
254
+ def test_array_reduce
255
+ array = [Vec2D.new(1, 2), Vec2D.new(10, 2), Vec2D.new(1, 2)]
256
+ sum = array.reduce(Vec2D.new) { |c, d| c + d }
257
+ assert_equal(sum, Vec2D.new(12, 6))
258
+ end
259
+
260
+ def test_array_zip
261
+ one = [Vec2D.new(1, 2), Vec2D.new(10, 2), Vec2D.new(1, 2)]
262
+ two = [Vec2D.new(1, 2), Vec2D.new(10, 2), Vec2D.new(1, 2)]
263
+ zipped = one.zip(two).flatten
264
+ expected = [Vec2D.new(1, 2), Vec2D.new(1, 2), Vec2D.new(10, 2), Vec2D.new(10, 2), Vec2D.new(1, 2), Vec2D.new(1, 2)]
265
+ assert_equal(zipped, expected)
266
+ end
267
+
268
+ def test_cross_area # NB: the sign might be negative
269
+ a = Vec2D.new(200, 0)
270
+ b = Vec2D.new(0, 200)
271
+ # Expected result is an area, twice that of the triangle created by the vectors
272
+ assert_equal((a).cross(b).abs, 40_000.0, 'Failed area test using 2D vector cross product')
273
+ end
274
+
275
+ def test_cross_non_zero # Could be used to calculate area of triangle
276
+ a = Vec2D.new(40, 40)
277
+ b = Vec2D.new(40, 140)
278
+ c = Vec2D.new(140, 40)
279
+ assert_equal((a - b).cross(b - c).abs / 2, 5_000.0, 'Failed area calculation using 2D vector cross product')
280
+ end
281
+
282
+ def test_cross_zero # where a, b, c are collinear area == 0
283
+ a = Vec2D.new(0, 0)
284
+ b = Vec2D.new(100, 100)
285
+ c = Vec2D.new(200, 200)
286
+ # see http://mathworld.wolfram.com/Collinear.html for details
287
+ assert((a - b).cross(b - c).zero?, 'Failed collinearity test using 2D vector cross product')
288
+ end
289
+
290
+ def test_equals3
291
+ x, y, z = 1.0000001, 1.01, 0.0
292
+ a = Vec3D.new(x, y)
293
+ assert_equal(a.to_a, [x, y, z], 'Failed to return Vec3D as an Array')
294
+ end
295
+
296
+ def test_constructor_float3
297
+ val = Point3.new(1.0, 8.0, 7.0) # duck type
298
+ expected = Vec3D.new(val)
299
+ assert_equal(expected, Vec3D.new(1.0, 8.0, 7.0), 'Failed duck type constructor floats')
300
+ end
301
+
302
+ def test_constructor_fixnum3
303
+ val = Point3.new(1, 8, 7) # duck type fixnum
304
+ expected = Vec3D.new(val)
305
+ assert_equal(expected, Vec3D.new(1.0, 8.0, 7.0), 'Failed duck type constructor fixnum')
306
+ end
307
+
308
+ def test_failed_duck_type3
309
+ val = Pointless3.new(1.0, 8.0, 7.0) # non duck type
310
+ assert_raises TypeError do
311
+ Vec3D.new(val)
312
+ end
313
+ end
314
+
315
+ def test_not_equals3
316
+ a = Vec3D.new(3, 5, 1)
317
+ b = Vec3D.new(6, 7, 1)
318
+ refute_equal(a, b, 'Failed equals false')
319
+ end
320
+
321
+ def test_copy_equals3
322
+ x, y, z = 1.0000001, 1.01, 1
323
+ a = Vec3D.new(x, y, z)
324
+ b = a.copy
325
+ assert_equal(a.to_a, b.to_a, 'Failed deep copy')
326
+ end
327
+
328
+ def test_copy_not_equals3
329
+ x, y, z = 1.0000001, 1.01, 6.0
330
+ a = Vec3D.new(x, y, z)
331
+ b = a.copy
332
+ b *= 0
333
+ refute_equal(a.to_a, b.to_a, 'Failed deep copy')
334
+ end
335
+
336
+ def test_equals_when_close3
337
+ a = Vec3D.new(3.0000000, 5.00000, 2)
338
+ b = Vec3D.new(3.0000000, 5.000001, 2)
339
+ assert_equal(a, b, 'Failed to return equal when v. close')
340
+ end
341
+
342
+ def test_sum3
343
+ a = Vec3D.new(3, 5, 1)
344
+ b = Vec3D.new(6, 7, 1)
345
+ c = Vec3D.new(9, 12, 2)
346
+ assert_equal(a + b, c, 'Failed to sum vectors')
347
+ end
348
+
349
+ def test_subtract3
350
+ a = Vec3D.new(3, 5, 0)
351
+ b = Vec3D.new(6, 7, 1)
352
+ c = Vec3D.new(-3, -2, -1)
353
+ assert_equal(a - b, c, 'Failed to subtract vectors')
354
+ end
355
+
356
+ def test_multiply3
357
+ a = Vec3D.new(3, 5, 1)
358
+ b = 2
359
+ c = a * b
360
+ d = Vec3D.new(6, 10, 2)
361
+ assert_equal(c, d, 'Failed to multiply vector by scalar')
362
+ end
363
+
364
+ def test_divide3
365
+ a = Vec3D.new(3, 5, 4)
366
+ b = 2
367
+ c = Vec3D.new(1.5, 2.5, 2)
368
+ d = a / b
369
+ assert_equal(c, d, 'Failed to divide vector by scalar')
370
+ end
371
+
372
+ def test_random3
373
+ a = Vec3D.random
374
+ assert a.kind_of? Vec3D
375
+ assert_in_epsilon(a.mag, 1.0)
376
+ end
377
+
378
+ def test_assign_value3
379
+ a = Vec3D.new(3, 5)
380
+ a.x=23
381
+ assert_equal(a.x, 23, 'Failed to assign x value')
382
+ end
383
+
384
+ def test_mag3
385
+ a = Vec3D.new(-3, -4)
386
+ assert_equal(a.mag, 5, 'Failed to return magnitude of vector')
387
+ end
388
+
389
+ def test_mag_variant3
390
+ a = Vec3D.new(3.0, 2)
391
+ b = Math.sqrt(3.0**2 + 2**2)
392
+ assert_in_epsilon(a.mag, b, 0.001, 'Failed to return magnitude of vector')
393
+ end
394
+
395
+ def test_mag_zero_one3
396
+ a = Vec3D.new(-1, 0)
397
+ assert_equal(a.mag, 1, 'Failed to return magnitude of vector')
398
+ end
399
+
400
+ def test_dist3
401
+ a = Vec3D.new(3, 5, 2)
402
+ b = Vec3D.new(6, 7, 1)
403
+ message = 'Failed to return distance between two vectors'
404
+ assert_equal(a.dist(b), Math.sqrt(3.0**2 + 2**2 + 1), message)
405
+ end
406
+
407
+ def test_dist_squared3
408
+ a = Vec3D.new(3, 5, 2)
409
+ b = Vec3D.new(6, 7, 1)
410
+ message = 'Failed to return distance squared between two vectors'
411
+ assert_equal(a.dist_squared(b), 3.0**2 + 2**2 + 1, message)
412
+ end
413
+
414
+ def test_dot3
415
+ a = Vec3D.new(10, 20, 0)
416
+ b = Vec3D.new(60, 80, 0)
417
+ assert_in_epsilon(a.dot(b), 2200.0, 0.001, 'Failed to dot product')
418
+ end
419
+
420
+ def test_self_dot3
421
+ a = Vec3D.new(10, 20, 4)
422
+ assert_in_epsilon(a.dot(a), 516.0, 0.001, 'Failed to self dot product')
423
+ end
424
+
425
+ def test_cross3
426
+ a = Vec3D.new(3, 5, 2)
427
+ b = Vec3D.new(6, 7, 1)
428
+ c = Vec3D.new(-9.0, 9.0, -9.0)
429
+ assert_equal(a.cross(b), c, 'Failed cross product')
430
+ end
431
+
432
+ def test_set_mag3
433
+ a = Vec3D.new(1, 1)
434
+ assert_equal(a.set_mag(Math.sqrt(32)), Vec3D.new(4, 4), 'Failed to set_mag vector')
435
+ end
436
+
437
+ def test_set_mag_block3
438
+ a = Vec3D.new(1, 1)
439
+ assert_equal(a.set_mag(Math.sqrt(32)) { true }, Vec3D.new(4, 4), 'Failed to set_mag_block true vector')
440
+ end
441
+
442
+ def test_set_mag_block_false3
443
+ a = Vec3D.new(1, 1)
444
+ assert_equal(a.set_mag(Math.sqrt(32)) { false }, Vec3D.new(1, 1), 'Failed to set_mag_block true vector')
445
+ end
446
+
447
+ def test_plus_assign3
448
+ a = Vec3D.new(3, 5)
449
+ b = Vec3D.new(6, 7)
450
+ a += b
451
+ assert_equal(a, Vec3D.new(9, 12), 'Failed to += assign')
452
+ end
453
+
454
+ def test_normalize3
455
+ a = Vec3D.new(3, 5)
456
+ b = a.normalize
457
+ assert_in_epsilon(b.mag, 1, 0.001, 'Failed to return a normalized vector')
458
+ end
459
+
460
+ def test_normalize3!
461
+ a = Vec3D.new(3, 5)
462
+ a.normalize!
463
+ assert_in_epsilon(a.mag, 1, 0.001, 'Failed to return a normalized! vector')
464
+ end
465
+
466
+ def test_inspect3
467
+ a = Vec3D.new(3, 2.000000000000001, 1)
468
+ assert_equal(a.inspect, 'Vec3D(x = 3.0000, y = 2.0000, z = 1.0000)')
469
+ end
470
+
471
+ def test_array_reduce3
472
+ array = [Vec3D.new(1, 2), Vec3D.new(10, 2), Vec3D.new(1, 2)]
473
+ sum = array.reduce(Vec3D.new) { |c, d| c + d }
474
+ assert_equal(sum, Vec3D.new(12, 6))
475
+ end
476
+
477
+ def test_array_zip3
478
+ one = [Vec3D.new(1, 2), Vec3D.new(10, 2), Vec3D.new(1, 2)]
479
+ two = [Vec3D.new(1, 2), Vec3D.new(10, 2), Vec3D.new(1, 2)]
480
+ zipped = one.zip(two).flatten
481
+ expected = [Vec3D.new(1, 2), Vec3D.new(1, 2), Vec3D.new(10, 2), Vec3D.new(10, 2), Vec3D.new(1, 2), Vec3D.new(1, 2)]
482
+ assert_equal(zipped, expected)
483
+ end
484
+
485
+ def test_eql3?
486
+ a = Vec3D.new(3.0, 5.0, 0)
487
+ b = Vec3D.new(3.0, 5.0, 0)
488
+ assert(a.eql?(b))
489
+ end
490
+
491
+ def test_not_eql3?
492
+ a = Vec3D.new(3.0, 5.0, 0)
493
+ b = Vec3D.new(3.0, 5.000001, 0)
494
+ refute(a.eql?(b))
495
+ end
496
+
497
+ def test_equal3?
498
+ a = Vec3D.new(3.0, 5.0, 0)
499
+ assert(a.equal?(a))
500
+ end
501
+
502
+ def test_not_equal3?
503
+ a = Vec3D.new(3.0, 5.0, 0)
504
+ b = Vec3D.new(3.0, 5.0, 0)
505
+ refute(a.equal?(b))
506
+ end
507
+
508
+ def test_hash_key3
509
+ x, y, z = 10, 20, 50
510
+ b = Vec3D.new(x, y, z)
511
+ assert_equal(b[:x], x, 'Failed hash key access')
512
+ assert_equal(b[:y], y, 'Failed hash key access')
513
+ assert_equal(b[:z], z, 'Failed hash key access')
514
+ end
515
+
516
+ def test_hash_set3
517
+ x = 10
518
+ b = Vec3D.new
519
+ b[:x] = x
520
+ assert_equal(b, Vec3D.new(x, 0, 0), 'Failed to hash assign')
521
+ end
522
+ end