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,1140 @@
1
+ /* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
+
3
+ /*
4
+ Part of the Processing project - http://processing.org
5
+
6
+ Copyright (c) 2012-17 The Processing Foundation
7
+ Copyright (c) 2008-12 Ben Fry and Casey Reas
8
+ Copyright (c) 2008 Dan Shiffman
9
+
10
+ This library is free software; you can redistribute it and/or
11
+ modify it under the terms of the GNU Lesser General Public
12
+ License version 2.1 as published by the Free Software Foundation.
13
+
14
+ This library is distributed in the hope that it will be useful,
15
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
+ Lesser General Public License for more details.
18
+
19
+ You should have received a copy of the GNU Lesser General
20
+ Public License along with this library; if not, write to the
21
+ Free Software Foundation, Inc., 59 Temple Place, Suite 330,
22
+ Boston, MA 02111-1307 USA
23
+ */
24
+
25
+ package processing.core;
26
+
27
+ import java.io.Serializable;
28
+
29
+ import processing.core.PApplet;
30
+ import processing.core.PConstants;
31
+
32
+ /**
33
+ * ( begin auto-generated from PVector.xml )
34
+ *
35
+ * A class to describe a two or three dimensional vector. This datatype
36
+ * stores two or three variables that are commonly used as a position,
37
+ * velocity, and/or acceleration. Technically, <em>position</em> is a point
38
+ * and <em>velocity</em> and <em>acceleration</em> are vectors, but this is
39
+ * often simplified to consider all three as vectors. For example, if you
40
+ * consider a rectangle moving across the screen, at any given instant it
41
+ * has a position (the object's location, expressed as a point.), a
42
+ * velocity (the rate at which the object's position changes per time unit,
43
+ * expressed as a vector), and acceleration (the rate at which the object's
44
+ * velocity changes per time unit, expressed as a vector). Since vectors
45
+ * represent groupings of values, we cannot simply use traditional
46
+ * addition/multiplication/etc. Instead, we'll need to do some "vector"
47
+ * math, which is made easy by the methods inside the <b>PVector</b>
48
+ * class.<br />
49
+ * <br />
50
+ * The methods for this class are extensive. For a complete list, visit the
51
+ * <a
52
+ * href="http://processing.googlecode.com/svn/trunk/processing/build/javadoc/core/">developer's reference.</a>
53
+ *
54
+ * ( end auto-generated )
55
+ *
56
+ * A class to describe a two or three dimensional vector.
57
+ * <p>
58
+ * The result of all functions are applied to the vector itself, with the
59
+ * exception of cross(), which returns a new PVector (or writes to a specified
60
+ * 'target' PVector). That is, add() will add the contents of one vector to
61
+ * this one. Using add() with additional parameters allows you to put the
62
+ * result into a new PVector. Functions that act on multiple vectors also
63
+ * include static versions. Because creating new objects can be computationally
64
+ * expensive, most functions include an optional 'target' PVector, so that a
65
+ * new PVector object is not created with each operation.
66
+ * <p>
67
+ * Initially based on the Vector3D class by <a href="http://www.shiffman.net">Dan Shiffman</a>.
68
+ *
69
+ * @webref math
70
+ */
71
+ public class PVector implements Serializable {
72
+ /**
73
+ * ( begin auto-generated from PVector_x.xml )
74
+ *
75
+ * The x component of the vector. This field (variable) can be used to both
76
+ * get and set the value (see above example.)
77
+ *
78
+ * ( end auto-generated )
79
+ *
80
+ * @webref pvector:field
81
+ * @usage web_application
82
+ * @brief The x component of the vector
83
+ */
84
+ public float x;
85
+
86
+ /**
87
+ * ( begin auto-generated from PVector_y.xml )
88
+ *
89
+ * The y component of the vector. This field (variable) can be used to both
90
+ * get and set the value (see above example.)
91
+ *
92
+ * ( end auto-generated )
93
+ *
94
+ * @webref pvector:field
95
+ * @usage web_application
96
+ * @brief The y component of the vector
97
+ */
98
+ public float y;
99
+
100
+ /**
101
+ * ( begin auto-generated from PVector_z.xml )
102
+ *
103
+ * The z component of the vector. This field (variable) can be used to both
104
+ * get and set the value (see above example.)
105
+ *
106
+ * ( end auto-generated )
107
+ *
108
+ * @webref pvector:field
109
+ * @usage web_application
110
+ * @brief The z component of the vector
111
+ */
112
+ public float z;
113
+
114
+ /** Array so that this can be temporarily used in an array context */
115
+ transient protected float[] array;
116
+
117
+
118
+ /**
119
+ * Constructor for an empty vector: x, y, and z are set to 0.
120
+ */
121
+ public PVector() {
122
+ }
123
+
124
+
125
+ /**
126
+ * Constructor for a 3D vector.
127
+ *
128
+ * @param x the x coordinate.
129
+ * @param y the y coordinate.
130
+ * @param z the z coordinate.
131
+ */
132
+ public PVector(float x, float y, float z) {
133
+ this.x = x;
134
+ this.y = y;
135
+ this.z = z;
136
+ }
137
+
138
+
139
+ /**
140
+ * Constructor for a 2D vector: z coordinate is set to 0.
141
+ * @param x
142
+ * @param y
143
+ */
144
+ public PVector(float x, float y) {
145
+ this.x = x;
146
+ this.y = y;
147
+ }
148
+
149
+
150
+ /**
151
+ * ( begin auto-generated from PVector_set.xml )
152
+ *
153
+ * Sets the x, y, and z component of the vector using two or three separate
154
+ * variables, the data from a PVector, or the values from a float array.
155
+ *
156
+ * ( end auto-generated )
157
+ *
158
+ * @return
159
+ * @webref pvector:method
160
+ * @param x the x component of the vector
161
+ * @param y the y component of the vector
162
+ * @param z the z component of the vector
163
+ * @brief Set the components of the vector
164
+ */
165
+ public PVector set(float x, float y, float z) {
166
+ this.x = x;
167
+ this.y = y;
168
+ this.z = z;
169
+ return this;
170
+ }
171
+
172
+
173
+ /**
174
+ * @param x the x component of the vector
175
+ * @param y the y component of the vector
176
+ * @return
177
+ */
178
+ public PVector set(float x, float y) {
179
+ this.x = x;
180
+ this.y = y;
181
+ this.z = 0;
182
+ return this;
183
+ }
184
+
185
+
186
+ /**
187
+ * @param v any variable of type PVector
188
+ * @return
189
+ */
190
+ public PVector set(PVector v) {
191
+ x = v.x;
192
+ y = v.y;
193
+ z = v.z;
194
+ return this;
195
+ }
196
+
197
+
198
+ /**
199
+ * Set the x, y (and maybe z) coordinates using a float[] array as the source.
200
+ * @param source array to copy from
201
+ * @return
202
+ */
203
+ public PVector set(float[] source) {
204
+ if (source.length >= 2) {
205
+ x = source[0];
206
+ y = source[1];
207
+ }
208
+ if (source.length >= 3) {
209
+ z = source[2];
210
+ } else {
211
+ z = 0;
212
+ }
213
+ return this;
214
+ }
215
+
216
+
217
+ /**
218
+ * ( begin auto-generated from PVector_random2D.xml )
219
+ *
220
+ * Make a new 2D unit vector with a random direction. If you pass in "this"
221
+ * as an argument, it will use the PApplet's random number generator. You can
222
+ * also pass in a target PVector to fill.
223
+ *
224
+ * @webref pvector:method
225
+ * @usage web_application
226
+ * @return the random PVector
227
+ * @brief Make a new 2D unit vector with a random direction.
228
+ * @see PVector#random3D()
229
+ */
230
+ static public PVector random2D() {
231
+ return random2D(null, null);
232
+ }
233
+
234
+
235
+ /**
236
+ * Make a new 2D unit vector with a random direction
237
+ * using Processing's current random number generator
238
+ * @param parent current PApplet instance
239
+ * @return the random PVector
240
+ */
241
+ static public PVector random2D(PApplet parent) {
242
+ return random2D(null, parent);
243
+ }
244
+
245
+ /**
246
+ * Set a 2D vector to a random unit vector with a random direction
247
+ * @param target the target vector (if null, a new vector will be created)
248
+ * @return the random PVector
249
+ */
250
+ static public PVector random2D(PVector target) {
251
+ return random2D(target, null);
252
+ }
253
+
254
+
255
+ /**
256
+ * Make a new 2D unit vector with a random direction. Pass in the parent
257
+ * PApplet if you want randomSeed() to work (and be predictable). Or leave
258
+ * it null and be... random.
259
+ * @param target
260
+ * @param parent
261
+ * @return the random PVector
262
+ */
263
+ static public PVector random2D(PVector target, PApplet parent) {
264
+ return (parent == null) ?
265
+ fromAngle((float) (Math.random() * Math.PI*2), target) :
266
+ fromAngle(parent.random(PConstants.TAU), target);
267
+ }
268
+
269
+
270
+ /**
271
+ * ( begin auto-generated from PVector_random3D.xml )
272
+ *
273
+ * Make a new 3D unit vector with a random direction. If you pass in "this"
274
+ * as an argument, it will use the PApplet's random number generator. You can
275
+ * also pass in a target PVector to fill.
276
+ *
277
+ * @webref pvector:method
278
+ * @usage web_application
279
+ * @return the random PVector
280
+ * @brief Make a new 3D unit vector with a random direction.
281
+ * @see PVector#random2D()
282
+ */
283
+ static public PVector random3D() {
284
+ return random3D(null, null);
285
+ }
286
+
287
+
288
+ /**
289
+ * Make a new 3D unit vector with a random direction
290
+ * using Processing's current random number generator
291
+ * @param parent current PApplet instance
292
+ * @return the random PVector
293
+ */
294
+ static public PVector random3D(PApplet parent) {
295
+ return random3D(null, parent);
296
+ }
297
+
298
+
299
+ /**
300
+ * Set a 3D vector to a random unit vector with a random direction
301
+ * @param target the target vector (if null, a new vector will be created)
302
+ * @return the random PVector
303
+ */
304
+ static public PVector random3D(PVector target) {
305
+ return random3D(target, null);
306
+ }
307
+
308
+
309
+ /**
310
+ * Make a new 3D unit vector with a random direction
311
+ * @param target
312
+ * @param parent
313
+ * @return the random PVector
314
+ */
315
+ static public PVector random3D(PVector target, PApplet parent) {
316
+ float angle;
317
+ float vz;
318
+ if (parent == null) {
319
+ angle = (float) (Math.random()*Math.PI*2);
320
+ vz = (float) (Math.random()*2-1);
321
+ } else {
322
+ angle = parent.random(PConstants.TWO_PI);
323
+ vz = parent.random(-1,1);
324
+ }
325
+ float vx = (float) (Math.sqrt(1-vz*vz)*Math.cos(angle));
326
+ float vy = (float) (Math.sqrt(1-vz*vz)*Math.sin(angle));
327
+ if (target == null) {
328
+ target = new PVector(vx, vy, vz);
329
+ //target.normalize(); // Should be unnecessary
330
+ } else {
331
+ target.set(vx,vy,vz);
332
+ }
333
+ return target;
334
+ }
335
+
336
+
337
+ /**
338
+ * ( begin auto-generated from PVector_sub.xml )
339
+ *
340
+ * Make a new 2D unit vector from an angle.
341
+ *
342
+ * ( end auto-generated )
343
+ *
344
+ * @webref pvector:method
345
+ * @usage web_application
346
+ * @brief Make a new 2D unit vector from an angle
347
+ * @param angle the angle in radians
348
+ * @return the new unit PVector
349
+ */
350
+ static public PVector fromAngle(float angle) {
351
+ return fromAngle(angle,null);
352
+ }
353
+
354
+
355
+ /**
356
+ * Make a new 2D unit vector from an angle
357
+ *
358
+ * @param angle
359
+ * @param target the target vector (if null, a new vector will be created)
360
+ * @return the PVector
361
+ */
362
+ static public PVector fromAngle(float angle, PVector target) {
363
+ if (target == null) {
364
+ target = new PVector((float)Math.cos(angle),(float)Math.sin(angle),0);
365
+ } else {
366
+ target.set((float)Math.cos(angle),(float)Math.sin(angle),0);
367
+ }
368
+ return target;
369
+ }
370
+
371
+
372
+ /**
373
+ * ( begin auto-generated from PVector_copy.xml )
374
+ *
375
+ * Gets a copy of the vector, returns a PVector object.
376
+ *
377
+ * ( end auto-generated )
378
+ *
379
+ * @return
380
+ * @webref pvector:method
381
+ * @usage web_application
382
+ * @brief Get a copy of the vector
383
+ */
384
+ public PVector copy() {
385
+ return new PVector(x, y, z);
386
+ }
387
+
388
+ /**
389
+ *
390
+ * @return
391
+ * @deprecated
392
+ */
393
+ @Deprecated
394
+ public PVector get() {
395
+ return copy();
396
+ }
397
+
398
+
399
+ /**
400
+ * @param target
401
+ * @return
402
+ */
403
+ public float[] get(float[] target) {
404
+ if (target == null) {
405
+ return new float[] { x, y, z };
406
+ }
407
+ if (target.length >= 2) {
408
+ target[0] = x;
409
+ target[1] = y;
410
+ }
411
+ if (target.length >= 3) {
412
+ target[2] = z;
413
+ }
414
+ return target;
415
+ }
416
+
417
+
418
+ /**
419
+ * ( begin auto-generated from PVector_mag.xml )
420
+ *
421
+ * Calculates the magnitude (length) of the vector and returns the result
422
+ * as a float (this is simply the equation <em>sqrt(x*x + y*y + z*z)</em>.)
423
+ *
424
+ * ( end auto-generated )
425
+ *
426
+ * @webref pvector:method
427
+ * @usage web_application
428
+ * @brief Calculate the magnitude of the vector
429
+ * @return magnitude (length) of the vector
430
+ * @see PVector#magSq()
431
+ */
432
+ public float mag() {
433
+ return (float) Math.sqrt(x*x + y*y + z*z);
434
+ }
435
+
436
+
437
+ /**
438
+ * ( begin auto-generated from PVector_mag.xml )
439
+ *
440
+ * Calculates the squared magnitude of the vector and returns the result
441
+ * as a float (this is simply the equation <em>(x*x + y*y + z*z)</em>.)
442
+ * Faster if the real length is not required in the
443
+ * case of comparing vectors, etc.
444
+ *
445
+ * ( end auto-generated )
446
+ *
447
+ * @webref pvector:method
448
+ * @usage web_application
449
+ * @brief Calculate the magnitude of the vector, squared
450
+ * @return squared magnitude of the vector
451
+ * @see PVector#mag()
452
+ */
453
+ public float magSq() {
454
+ return (x*x + y*y + z*z);
455
+ }
456
+
457
+
458
+ /**
459
+ * ( begin auto-generated from PVector_add.xml )
460
+ *
461
+ * Adds x, y, and z components to a vector, adds one vector to another, or
462
+ * adds two independent vectors together. The version of the method that
463
+ * adds two vectors together is a static method and returns a PVector, the
464
+ * others have no return value -- they act directly on the vector. See the
465
+ * examples for more context.
466
+ *
467
+ * ( end auto-generated )
468
+ *
469
+ * @return
470
+ * @webref pvector:method
471
+ * @usage web_application
472
+ * @param v the vector to be added
473
+ * @brief Adds x, y, and z components to a vector, one vector to another, or two independent vectors
474
+ */
475
+ public PVector add(PVector v) {
476
+ x += v.x;
477
+ y += v.y;
478
+ z += v.z;
479
+ return this;
480
+ }
481
+
482
+
483
+ /**
484
+ * @param x x component of the vector
485
+ * @param y y component of the vector
486
+ * @return
487
+ */
488
+ public PVector add(float x, float y) {
489
+ this.x += x;
490
+ this.y += y;
491
+ return this;
492
+ }
493
+
494
+
495
+ /**
496
+ * @param x
497
+ * @param y
498
+ * @param z z component of the vector
499
+ * @return
500
+ */
501
+ public PVector add(float x, float y, float z) {
502
+ this.x += x;
503
+ this.y += y;
504
+ this.z += z;
505
+ return this;
506
+ }
507
+
508
+
509
+ /**
510
+ * Add two vectors
511
+ * @param v1 a vector
512
+ * @param v2 another vector
513
+ * @return
514
+ */
515
+ static public PVector add(PVector v1, PVector v2) {
516
+ return add(v1, v2, null);
517
+ }
518
+
519
+
520
+ /**
521
+ * Add two vectors into a target vector
522
+ * @param v1
523
+ * @param target the target vector (if null, a new vector will be created)
524
+ * @param v2
525
+ * @return
526
+ */
527
+ static public PVector add(PVector v1, PVector v2, PVector target) {
528
+ if (target == null) {
529
+ target = new PVector(v1.x + v2.x,v1.y + v2.y, v1.z + v2.z);
530
+ } else {
531
+ target.set(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
532
+ }
533
+ return target;
534
+ }
535
+
536
+
537
+ /**
538
+ * ( begin auto-generated from PVector_sub.xml )
539
+ *
540
+ * Subtracts x, y, and z components from a vector, subtracts one vector
541
+ * from another, or subtracts two independent vectors. The version of the
542
+ * method that subtracts two vectors is a static method and returns a
543
+ * PVector, the others have no return value -- they act directly on the
544
+ * vector. See the examples for more context.
545
+ *
546
+ * ( end auto-generated )
547
+ *
548
+ * @return
549
+ * @webref pvector:method
550
+ * @usage web_application
551
+ * @param v any variable of type PVector
552
+ * @brief Subtract x, y, and z components from a vector, one vector from another, or two independent vectors
553
+ */
554
+ public PVector sub(PVector v) {
555
+ x -= v.x;
556
+ y -= v.y;
557
+ z -= v.z;
558
+ return this;
559
+ }
560
+
561
+
562
+ /**
563
+ * @param x the x component of the vector
564
+ * @param y the y component of the vector
565
+ * @return
566
+ */
567
+ public PVector sub(float x, float y) {
568
+ this.x -= x;
569
+ this.y -= y;
570
+ return this;
571
+ }
572
+
573
+
574
+ /**
575
+ * @param x
576
+ * @param y
577
+ * @param z the z component of the vector
578
+ * @return
579
+ */
580
+ public PVector sub(float x, float y, float z) {
581
+ this.x -= x;
582
+ this.y -= y;
583
+ this.z -= z;
584
+ return this;
585
+ }
586
+
587
+
588
+ /**
589
+ * Subtract one vector from another
590
+ * @param v1 the x, y, and z components of a PVector object
591
+ * @param v2 the x, y, and z components of a PVector object
592
+ * @return
593
+ */
594
+ static public PVector sub(PVector v1, PVector v2) {
595
+ return sub(v1, v2, null);
596
+ }
597
+
598
+
599
+ /**
600
+ * Subtract one vector from another and store in another vector
601
+ * @param v1
602
+ * @param v2
603
+ * @param target PVector in which to store the result
604
+ * @return
605
+ */
606
+ static public PVector sub(PVector v1, PVector v2, PVector target) {
607
+ if (target == null) {
608
+ target = new PVector(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
609
+ } else {
610
+ target.set(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
611
+ }
612
+ return target;
613
+ }
614
+
615
+
616
+ /**
617
+ * ( begin auto-generated from PVector_mult.xml )
618
+ *
619
+ * Multiplies a vector by a scalar or multiplies one vector by another.
620
+ *
621
+ * ( end auto-generated )
622
+ *
623
+ * @return
624
+ * @webref pvector:method
625
+ * @usage web_application
626
+ * @brief Multiply a vector by a scalar
627
+ * @param n the number to multiply with the vector
628
+ */
629
+ public PVector mult(float n) {
630
+ x *= n;
631
+ y *= n;
632
+ z *= n;
633
+ return this;
634
+ }
635
+
636
+
637
+ /**
638
+ * @param v the vector to multiply by the scalar
639
+ * @param n
640
+ * @return
641
+ */
642
+ static public PVector mult(PVector v, float n) {
643
+ return mult(v, n, null);
644
+ }
645
+
646
+
647
+ /**
648
+ * Multiply a vector by a scalar, and write the result into a target PVector.
649
+ * @param v
650
+ * @param target PVector in which to store the result
651
+ * @param n
652
+ * @return
653
+ */
654
+ static public PVector mult(PVector v, float n, PVector target) {
655
+ if (target == null) {
656
+ target = new PVector(v.x*n, v.y*n, v.z*n);
657
+ } else {
658
+ target.set(v.x*n, v.y*n, v.z*n);
659
+ }
660
+ return target;
661
+ }
662
+
663
+
664
+ /**
665
+ * ( begin auto-generated from PVector_div.xml )
666
+ *
667
+ * Divides a vector by a scalar or divides one vector by another.
668
+ *
669
+ * ( end auto-generated )
670
+ *
671
+ * @return
672
+ * @webref pvector:method
673
+ * @usage web_application
674
+ * @brief Divide a vector by a scalar
675
+ * @param n the number by which to divide the vector
676
+ */
677
+ public PVector div(float n) {
678
+ x /= n;
679
+ y /= n;
680
+ z /= n;
681
+ return this;
682
+ }
683
+
684
+
685
+ /**
686
+ * Divide a vector by a scalar and return the result in a new vector.
687
+ * @param v the vector to divide by the scalar
688
+ * @param n
689
+ * @return a new vector that is v1 / n
690
+ */
691
+ static public PVector div(PVector v, float n) {
692
+ return div(v, n, null);
693
+ }
694
+
695
+
696
+ /**
697
+ * Divide a vector by a scalar and store the result in another vector.
698
+ * @param v
699
+ * @param target PVector in which to store the result
700
+ * @param n
701
+ * @return
702
+ */
703
+ static public PVector div(PVector v, float n, PVector target) {
704
+ if (target == null) {
705
+ target = new PVector(v.x/n, v.y/n, v.z/n);
706
+ } else {
707
+ target.set(v.x/n, v.y/n, v.z/n);
708
+ }
709
+ return target;
710
+ }
711
+
712
+
713
+ /**
714
+ * ( begin auto-generated from PVector_dist.xml )
715
+ *
716
+ * Calculates the Euclidean distance between two points (considering a
717
+ * point as a vector object).
718
+ *
719
+ * ( end auto-generated )
720
+ *
721
+ * @return
722
+ * @webref pvector:method
723
+ * @usage web_application
724
+ * @param v the x, y, and z coordinates of a PVector
725
+ * @brief Calculate the distance between two points
726
+ */
727
+ public float dist(PVector v) {
728
+ float dx = x - v.x;
729
+ float dy = y - v.y;
730
+ float dz = z - v.z;
731
+ return (float) Math.sqrt(dx*dx + dy*dy + dz*dz);
732
+ }
733
+
734
+
735
+ /**
736
+ * @param v1 any variable of type PVector
737
+ * @param v2 any variable of type PVector
738
+ * @return the Euclidean distance between v1 and v2
739
+ */
740
+ static public float dist(PVector v1, PVector v2) {
741
+ float dx = v1.x - v2.x;
742
+ float dy = v1.y - v2.y;
743
+ float dz = v1.z - v2.z;
744
+ return (float) Math.sqrt(dx*dx + dy*dy + dz*dz);
745
+ }
746
+
747
+
748
+ /**
749
+ * ( begin auto-generated from PVector_dot.xml )
750
+ *
751
+ * Calculates the dot product of two vectors.
752
+ *
753
+ * ( end auto-generated )
754
+ *
755
+ * @webref pvector:method
756
+ * @usage web_application
757
+ * @param v any variable of type PVector
758
+ * @return the dot product
759
+ * @brief Calculate the dot product of two vectors
760
+ */
761
+ public float dot(PVector v) {
762
+ return x*v.x + y*v.y + z*v.z;
763
+ }
764
+
765
+
766
+ /**
767
+ * @param x x component of the vector
768
+ * @param y y component of the vector
769
+ * @param z z component of the vector
770
+ * @return
771
+ */
772
+ public float dot(float x, float y, float z) {
773
+ return this.x*x + this.y*y + this.z*z;
774
+ }
775
+
776
+
777
+ /**
778
+ * @param v1 any variable of type PVector
779
+ * @param v2 any variable of type PVector
780
+ * @return
781
+ */
782
+ static public float dot(PVector v1, PVector v2) {
783
+ return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
784
+ }
785
+
786
+
787
+ /**
788
+ * ( begin auto-generated from PVector_cross.xml )
789
+ *
790
+ * Calculates and returns a vector composed of the cross product between
791
+ * two vectors.
792
+ *
793
+ * ( end auto-generated )
794
+ *
795
+ * @return
796
+ * @webref pvector:method
797
+ * @param v the vector to calculate the cross product
798
+ * @brief Calculate and return the cross product
799
+ */
800
+ public PVector cross(PVector v) {
801
+ return cross(v, null);
802
+ }
803
+
804
+
805
+ /**
806
+ * @param v any variable of type PVector
807
+ * @param target PVector to store the result
808
+ * @return
809
+ */
810
+ public PVector cross(PVector v, PVector target) {
811
+ float crossX = y * v.z - v.y * z;
812
+ float crossY = z * v.x - v.z * x;
813
+ float crossZ = x * v.y - v.x * y;
814
+
815
+ if (target == null) {
816
+ target = new PVector(crossX, crossY, crossZ);
817
+ } else {
818
+ target.set(crossX, crossY, crossZ);
819
+ }
820
+ return target;
821
+ }
822
+
823
+
824
+ /**
825
+ * @param v1 any variable of type PVector
826
+ * @param v2 any variable of type PVector
827
+ * @param target PVector to store the result
828
+ * @return
829
+ */
830
+ static public PVector cross(PVector v1, PVector v2, PVector target) {
831
+ float crossX = v1.y * v2.z - v2.y * v1.z;
832
+ float crossY = v1.z * v2.x - v2.z * v1.x;
833
+ float crossZ = v1.x * v2.y - v2.x * v1.y;
834
+
835
+ if (target == null) {
836
+ target = new PVector(crossX, crossY, crossZ);
837
+ } else {
838
+ target.set(crossX, crossY, crossZ);
839
+ }
840
+ return target;
841
+ }
842
+
843
+
844
+ /**
845
+ * ( begin auto-generated from PVector_normalize.xml )
846
+ *
847
+ * Normalize the vector to length 1 (make it a unit vector).
848
+ *
849
+ * ( end auto-generated )
850
+ *
851
+ * @return
852
+ * @webref pvector:method
853
+ * @usage web_application
854
+ * @brief Normalize the vector to a length of 1
855
+ */
856
+ public PVector normalize() {
857
+ float m = mag();
858
+ if (m != 0 && m != 1) {
859
+ div(m);
860
+ }
861
+ return this;
862
+ }
863
+
864
+
865
+ /**
866
+ * @param target Set to null to create a new vector
867
+ * @return a new vector (if target was null), or target
868
+ */
869
+ public PVector normalize(PVector target) {
870
+ if (target == null) {
871
+ target = new PVector();
872
+ }
873
+ float m = mag();
874
+ if (m > 0) {
875
+ target.set(x/m, y/m, z/m);
876
+ } else {
877
+ target.set(x, y, z);
878
+ }
879
+ return target;
880
+ }
881
+
882
+
883
+ /**
884
+ * ( begin auto-generated from PVector_limit.xml )
885
+ *
886
+ * Limit the magnitude of this vector to the value used for the <b>max</b> parameter.
887
+ *
888
+ * ( end auto-generated )
889
+ *
890
+ * @return
891
+ * @webref pvector:method
892
+ * @usage web_application
893
+ * @param max the maximum magnitude for the vector
894
+ * @brief Limit the magnitude of the vector
895
+ */
896
+ public PVector limit(float max) {
897
+ if (magSq() > max*max) {
898
+ normalize();
899
+ mult(max);
900
+ }
901
+ return this;
902
+ }
903
+
904
+
905
+ /**
906
+ * ( begin auto-generated from PVector_setMag.xml )
907
+ *
908
+ * Set the magnitude of this vector to the value used for the <b>len</b> parameter.
909
+ *
910
+ * ( end auto-generated )
911
+ *
912
+ * @return
913
+ * @webref pvector:method
914
+ * @usage web_application
915
+ * @param len the new length for this vector
916
+ * @brief Set the magnitude of the vector
917
+ */
918
+ public PVector setMag(float len) {
919
+ normalize();
920
+ mult(len);
921
+ return this;
922
+ }
923
+
924
+
925
+ /**
926
+ * Sets the magnitude of this vector, storing the result in another vector.
927
+ * @param target Set to null to create a new vector
928
+ * @param len the new length for the new vector
929
+ * @return a new vector (if target was null), or target
930
+ */
931
+ public PVector setMag(PVector target, float len) {
932
+ target = normalize(target);
933
+ target.mult(len);
934
+ return target;
935
+ }
936
+
937
+
938
+ /**
939
+ * ( begin auto-generated from PVector_setMag.xml )
940
+ *
941
+ * Calculate the angle of rotation for this vector (only 2D vectors)
942
+ *
943
+ * ( end auto-generated )
944
+ *
945
+ * @webref pvector:method
946
+ * @usage web_application
947
+ * @return the angle of rotation
948
+ * @brief Calculate the angle of rotation for this vector
949
+ */
950
+ public float heading() {
951
+ float angle = (float) Math.atan2(y, x);
952
+ return angle;
953
+ }
954
+
955
+ /**
956
+ *
957
+ * @return
958
+ * @deprecated
959
+ */
960
+ @Deprecated
961
+ public float heading2D() {
962
+ return heading();
963
+ }
964
+
965
+
966
+ /**
967
+ * ( begin auto-generated from PVector_rotate.xml )
968
+ *
969
+ * Rotate the vector by an angle (only 2D vectors), magnitude remains the same
970
+ *
971
+ * ( end auto-generated )
972
+ *
973
+ * @return
974
+ * @webref pvector:method
975
+ * @usage web_application
976
+ * @brief Rotate the vector by an angle (2D only)
977
+ * @param theta the angle of rotation
978
+ */
979
+ public PVector rotate(float theta) {
980
+ float temp = x;
981
+ // Might need to check for rounding errors like with angleBetween function?
982
+ x = x*PApplet.cos(theta) - y*PApplet.sin(theta);
983
+ y = temp*PApplet.sin(theta) + y*PApplet.cos(theta);
984
+ return this;
985
+ }
986
+
987
+
988
+ /**
989
+ * ( begin auto-generated from PVector_rotate.xml )
990
+ *
991
+ * Linear interpolate the vector to another vector
992
+ *
993
+ * ( end auto-generated )
994
+ *
995
+ * @return
996
+ * @webref pvector:method
997
+ * @usage web_application
998
+ * @brief Linear interpolate the vector to another vector
999
+ * @param v the vector to lerp to
1000
+ * @param amt The amount of interpolation; some value between 0.0 (old vector) and 1.0 (new vector). 0.1 is very near the old vector; 0.5 is halfway in between.
1001
+ * @see PApplet#lerp(float, float, float)
1002
+ */
1003
+ public PVector lerp(PVector v, float amt) {
1004
+ x = PApplet.lerp(x, v.x, amt);
1005
+ y = PApplet.lerp(y, v.y, amt);
1006
+ z = PApplet.lerp(z, v.z, amt);
1007
+ return this;
1008
+ }
1009
+
1010
+
1011
+ /**
1012
+ * Linear interpolate between two vectors (returns a new PVector object)
1013
+ * @param v1 the vector to start from
1014
+ * @param v2 the vector to lerp to
1015
+ * @param amt
1016
+ * @return
1017
+ */
1018
+ public static PVector lerp(PVector v1, PVector v2, float amt) {
1019
+ PVector v = v1.copy();
1020
+ v.lerp(v2, amt);
1021
+ return v;
1022
+ }
1023
+
1024
+
1025
+ /**
1026
+ * Linear interpolate the vector to x,y,z values
1027
+ * @param x the x component to lerp to
1028
+ * @param y the y component to lerp to
1029
+ * @param z the z component to lerp to
1030
+ * @param amt
1031
+ * @return
1032
+ */
1033
+ public PVector lerp(float x, float y, float z, float amt) {
1034
+ this.x = PApplet.lerp(this.x, x, amt);
1035
+ this.y = PApplet.lerp(this.y, y, amt);
1036
+ this.z = PApplet.lerp(this.z, z, amt);
1037
+ return this;
1038
+ }
1039
+
1040
+
1041
+ /**
1042
+ * ( begin auto-generated from PVector_angleBetween.xml )
1043
+ *
1044
+ * Calculates and returns the angle (in radians) between two vectors.
1045
+ *
1046
+ * ( end auto-generated )
1047
+ *
1048
+ * @return
1049
+ * @webref pvector:method
1050
+ * @usage web_application
1051
+ * @param v1 the x, y, and z components of a PVector
1052
+ * @param v2 the x, y, and z components of a PVector
1053
+ * @brief Calculate and return the angle between two vectors
1054
+ */
1055
+ static public float angleBetween(PVector v1, PVector v2) {
1056
+
1057
+ // We get NaN if we pass in a zero vector which can cause problems
1058
+ // Zero seems like a reasonable angle between a (0,0,0) vector and something else
1059
+ if (v1.x == 0 && v1.y == 0 && v1.z == 0 ) return 0.0f;
1060
+ if (v2.x == 0 && v2.y == 0 && v2.z == 0 ) return 0.0f;
1061
+
1062
+ double dot = v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
1063
+ double v1mag = Math.sqrt(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z);
1064
+ double v2mag = Math.sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z);
1065
+ // This should be a number between -1 and 1, since it's "normalized"
1066
+ double amt = dot / (v1mag * v2mag);
1067
+ // But if it's not due to rounding error, then we need to fix it
1068
+ // http://code.google.com/p/processing/issues/detail?id=340
1069
+ // Otherwise if outside the range, acos() will return NaN
1070
+ // http://www.cppreference.com/wiki/c/math/acos
1071
+ if (amt <= -1) {
1072
+ return PConstants.PI;
1073
+ } else if (amt >= 1) {
1074
+ // http://code.google.com/p/processing/issues/detail?id=435
1075
+ return 0;
1076
+ }
1077
+ return (float) Math.acos(amt);
1078
+ }
1079
+
1080
+ /**
1081
+ *
1082
+ * @return
1083
+ */
1084
+ @Override
1085
+ public String toString() {
1086
+ return "[ " + x + ", " + y + ", " + z + " ]";
1087
+ }
1088
+
1089
+
1090
+ /**
1091
+ * ( begin auto-generated from PVector_array.xml )
1092
+ *
1093
+ * Return a representation of this vector as a float array. This is only
1094
+ * for temporary use. If used in any other fashion, the contents should be
1095
+ * copied by using the <b>PVector.get()</b> method to copy into your own array.
1096
+ *
1097
+ * ( end auto-generated )
1098
+ *
1099
+ * @return
1100
+ * @webref pvector:method
1101
+ * @usage: web_application
1102
+ * @brief Return a representation of the vector as a float array
1103
+ */
1104
+ public float[] array() {
1105
+ if (array == null) {
1106
+ array = new float[3];
1107
+ }
1108
+ array[0] = x;
1109
+ array[1] = y;
1110
+ array[2] = z;
1111
+ return array;
1112
+ }
1113
+
1114
+ /**
1115
+ *
1116
+ * @param obj
1117
+ * @return
1118
+ */
1119
+ @Override
1120
+ public boolean equals(Object obj) {
1121
+ if (!(obj instanceof PVector)) {
1122
+ return false;
1123
+ }
1124
+ final PVector p = (PVector) obj;
1125
+ return x == p.x && y == p.y && z == p.z;
1126
+ }
1127
+
1128
+ /**
1129
+ *
1130
+ * @return
1131
+ */
1132
+ @Override
1133
+ public int hashCode() {
1134
+ int result = 1;
1135
+ result = 31 * result + Float.floatToIntBits(x);
1136
+ result = 31 * result + Float.floatToIntBits(y);
1137
+ result = 31 * result + Float.floatToIntBits(z);
1138
+ return result;
1139
+ }
1140
+ }