propane 3.10.0-java → 3.11.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/wrapper/maven-wrapper.properties +1 -1
  3. data/CHANGELOG.md +2 -0
  4. data/README.md +7 -7
  5. data/lib/propane/app.rb +2 -5
  6. data/lib/propane/helper_methods.rb +6 -6
  7. data/lib/propane/version.rb +1 -1
  8. data/lib/{propane-3.10.0.jar → propane-3.11.0.jar} +0 -0
  9. data/pom.rb +6 -6
  10. data/pom.xml +6 -6
  11. data/propane.gemspec +3 -3
  12. data/src/main/java/monkstone/noise/OpenSimplex2F.java +838 -737
  13. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +8 -13
  14. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +14 -28
  15. data/src/main/java/processing/awt/PImageAWT.java +6 -4
  16. data/src/main/java/processing/core/PApplet.java +71 -59
  17. data/src/main/java/processing/core/PImage.java +14 -14
  18. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +13 -13
  19. data/src/main/java/processing/opengl/PShader.java +1 -6
  20. data/src/main/java/processing/opengl/PSurfaceJOGL.java +6 -6
  21. data/{lib/java/processing/opengl → src/main/resources}/cursors/arrow.png +0 -0
  22. data/{lib/java/processing/opengl → src/main/resources}/cursors/cross.png +0 -0
  23. data/{lib/java/processing/opengl → src/main/resources}/cursors/hand.png +0 -0
  24. data/{lib/java/processing/opengl → src/main/resources}/cursors/license.txt +0 -0
  25. data/{lib/java/processing/opengl → src/main/resources}/cursors/move.png +0 -0
  26. data/{lib/java/processing/opengl → src/main/resources}/cursors/text.png +0 -0
  27. data/{lib/java/processing/opengl → src/main/resources}/cursors/wait.png +0 -0
  28. data/{lib/java/processing/opengl → src/main/resources}/shaders/ColorFrag.glsl +0 -0
  29. data/{lib/java/processing/opengl → src/main/resources}/shaders/ColorVert.glsl +0 -0
  30. data/{lib/java/processing/opengl → src/main/resources}/shaders/LightFrag.glsl +0 -0
  31. data/{lib/java/processing/opengl → src/main/resources}/shaders/LightVert.glsl +0 -0
  32. data/{lib/java/processing/opengl → src/main/resources}/shaders/LineFrag.glsl +0 -0
  33. data/{lib/java/processing/opengl → src/main/resources}/shaders/LineVert.glsl +0 -0
  34. data/{lib/java/processing/opengl → src/main/resources}/shaders/MaskFrag.glsl +0 -0
  35. data/{lib/java/processing/opengl → src/main/resources}/shaders/PointFrag.glsl +0 -0
  36. data/{lib/java/processing/opengl → src/main/resources}/shaders/PointVert.glsl +0 -0
  37. data/{lib/java/processing/opengl → src/main/resources}/shaders/TexFrag.glsl +0 -0
  38. data/{lib/java/processing/opengl → src/main/resources}/shaders/TexLightFrag.glsl +0 -0
  39. data/{lib/java/processing/opengl → src/main/resources}/shaders/TexLightVert.glsl +0 -0
  40. data/{lib/java/processing/opengl → src/main/resources}/shaders/TexVert.glsl +0 -0
  41. data/test/test_helper.rb +1 -0
  42. data/vendors/Rakefile +1 -1
  43. metadata +29 -155
  44. data/lib/java/japplemenubar/JAppleMenuBar.java +0 -88
  45. data/lib/java/japplemenubar/libjAppleMenuBar.jnilib +0 -0
  46. data/lib/java/monkstone/ColorUtil.java +0 -127
  47. data/lib/java/monkstone/MathToolModule.java +0 -287
  48. data/lib/java/monkstone/PropaneLibrary.java +0 -46
  49. data/lib/java/monkstone/core/LibraryProxy.java +0 -136
  50. data/lib/java/monkstone/fastmath/DegLutTables.java +0 -111
  51. data/lib/java/monkstone/fastmath/Deglut.java +0 -71
  52. data/lib/java/monkstone/fastmath/package-info.java +0 -6
  53. data/lib/java/monkstone/filechooser/Chooser.java +0 -39
  54. data/lib/java/monkstone/noise/FastTerrain.java +0 -874
  55. data/lib/java/monkstone/noise/Noise.java +0 -90
  56. data/lib/java/monkstone/noise/NoiseGenerator.java +0 -75
  57. data/lib/java/monkstone/noise/NoiseMode.java +0 -28
  58. data/lib/java/monkstone/noise/OpenSimplex2F.java +0 -881
  59. data/lib/java/monkstone/noise/OpenSimplex2S.java +0 -1106
  60. data/lib/java/monkstone/noise/SmoothTerrain.java +0 -1099
  61. data/lib/java/monkstone/slider/CustomHorizontalSlider.java +0 -164
  62. data/lib/java/monkstone/slider/CustomVerticalSlider.java +0 -178
  63. data/lib/java/monkstone/slider/SimpleHorizontalSlider.java +0 -145
  64. data/lib/java/monkstone/slider/SimpleSlider.java +0 -166
  65. data/lib/java/monkstone/slider/SimpleVerticalSlider.java +0 -157
  66. data/lib/java/monkstone/slider/Slider.java +0 -61
  67. data/lib/java/monkstone/slider/SliderBar.java +0 -245
  68. data/lib/java/monkstone/slider/SliderGroup.java +0 -56
  69. data/lib/java/monkstone/slider/WheelHandler.java +0 -35
  70. data/lib/java/monkstone/vecmath/GfxRender.java +0 -86
  71. data/lib/java/monkstone/vecmath/JRender.java +0 -56
  72. data/lib/java/monkstone/vecmath/ShapeRender.java +0 -87
  73. data/lib/java/monkstone/vecmath/package-info.java +0 -20
  74. data/lib/java/monkstone/vecmath/vec2/Vec2.java +0 -802
  75. data/lib/java/monkstone/vecmath/vec2/package-info.java +0 -6
  76. data/lib/java/monkstone/vecmath/vec3/Vec3.java +0 -727
  77. data/lib/java/monkstone/vecmath/vec3/package-info.java +0 -6
  78. data/lib/java/monkstone/videoevent/CaptureEvent.java +0 -27
  79. data/lib/java/monkstone/videoevent/MovieEvent.java +0 -32
  80. data/lib/java/monkstone/videoevent/package-info.java +0 -20
  81. data/lib/java/processing/awt/PGraphicsJava2D.java +0 -3040
  82. data/lib/java/processing/awt/PImageAWT.java +0 -377
  83. data/lib/java/processing/awt/PShapeJava2D.java +0 -387
  84. data/lib/java/processing/awt/PSurfaceAWT.java +0 -1581
  85. data/lib/java/processing/awt/ShimAWT.java +0 -581
  86. data/lib/java/processing/core/PApplet.java +0 -15156
  87. data/lib/java/processing/core/PConstants.java +0 -523
  88. data/lib/java/processing/core/PFont.java +0 -1126
  89. data/lib/java/processing/core/PGraphics.java +0 -8600
  90. data/lib/java/processing/core/PImage.java +0 -3377
  91. data/lib/java/processing/core/PMatrix.java +0 -208
  92. data/lib/java/processing/core/PMatrix2D.java +0 -562
  93. data/lib/java/processing/core/PMatrix3D.java +0 -890
  94. data/lib/java/processing/core/PShape.java +0 -3561
  95. data/lib/java/processing/core/PShapeOBJ.java +0 -483
  96. data/lib/java/processing/core/PShapeSVG.java +0 -2016
  97. data/lib/java/processing/core/PStyle.java +0 -63
  98. data/lib/java/processing/core/PSurface.java +0 -198
  99. data/lib/java/processing/core/PSurfaceNone.java +0 -431
  100. data/lib/java/processing/core/PVector.java +0 -1066
  101. data/lib/java/processing/core/ThinkDifferent.java +0 -115
  102. data/lib/java/processing/data/DoubleDict.java +0 -850
  103. data/lib/java/processing/data/DoubleList.java +0 -928
  104. data/lib/java/processing/data/FloatDict.java +0 -847
  105. data/lib/java/processing/data/FloatList.java +0 -936
  106. data/lib/java/processing/data/IntDict.java +0 -807
  107. data/lib/java/processing/data/IntList.java +0 -936
  108. data/lib/java/processing/data/JSONArray.java +0 -1260
  109. data/lib/java/processing/data/JSONObject.java +0 -2282
  110. data/lib/java/processing/data/JSONTokener.java +0 -435
  111. data/lib/java/processing/data/LongDict.java +0 -802
  112. data/lib/java/processing/data/LongList.java +0 -937
  113. data/lib/java/processing/data/Sort.java +0 -46
  114. data/lib/java/processing/data/StringDict.java +0 -613
  115. data/lib/java/processing/data/StringList.java +0 -800
  116. data/lib/java/processing/data/Table.java +0 -4936
  117. data/lib/java/processing/data/TableRow.java +0 -198
  118. data/lib/java/processing/data/XML.java +0 -1156
  119. data/lib/java/processing/dxf/RawDXF.java +0 -404
  120. data/lib/java/processing/event/Event.java +0 -125
  121. data/lib/java/processing/event/KeyEvent.java +0 -70
  122. data/lib/java/processing/event/MouseEvent.java +0 -114
  123. data/lib/java/processing/event/TouchEvent.java +0 -57
  124. data/lib/java/processing/javafx/PGraphicsFX2D.java +0 -32
  125. data/lib/java/processing/javafx/PSurfaceFX.java +0 -173
  126. data/lib/java/processing/net/Client.java +0 -744
  127. data/lib/java/processing/net/Server.java +0 -388
  128. data/lib/java/processing/opengl/FontTexture.java +0 -378
  129. data/lib/java/processing/opengl/FrameBuffer.java +0 -513
  130. data/lib/java/processing/opengl/LinePath.java +0 -627
  131. data/lib/java/processing/opengl/LineStroker.java +0 -681
  132. data/lib/java/processing/opengl/PGL.java +0 -3483
  133. data/lib/java/processing/opengl/PGraphics2D.java +0 -615
  134. data/lib/java/processing/opengl/PGraphics3D.java +0 -281
  135. data/lib/java/processing/opengl/PGraphicsOpenGL.java +0 -13753
  136. data/lib/java/processing/opengl/PJOGL.java +0 -2008
  137. data/lib/java/processing/opengl/PShader.java +0 -1484
  138. data/lib/java/processing/opengl/PShapeOpenGL.java +0 -5269
  139. data/lib/java/processing/opengl/PSurfaceJOGL.java +0 -1385
  140. data/lib/java/processing/opengl/Texture.java +0 -1696
  141. data/lib/java/processing/opengl/VertexBuffer.java +0 -88
  142. data/lib/java/processing/pdf/PGraphicsPDF.java +0 -581
  143. data/lib/java/processing/svg/PGraphicsSVG.java +0 -378
  144. data/src/main/java/processing/opengl/cursors/arrow.png +0 -0
  145. data/src/main/java/processing/opengl/cursors/cross.png +0 -0
  146. data/src/main/java/processing/opengl/cursors/hand.png +0 -0
  147. data/src/main/java/processing/opengl/cursors/license.txt +0 -27
  148. data/src/main/java/processing/opengl/cursors/move.png +0 -0
  149. data/src/main/java/processing/opengl/cursors/text.png +0 -0
  150. data/src/main/java/processing/opengl/cursors/wait.png +0 -0
  151. data/src/main/java/processing/opengl/shaders/ColorFrag.glsl +0 -32
  152. data/src/main/java/processing/opengl/shaders/ColorVert.glsl +0 -34
  153. data/src/main/java/processing/opengl/shaders/LightFrag.glsl +0 -33
  154. data/src/main/java/processing/opengl/shaders/LightVert.glsl +0 -151
  155. data/src/main/java/processing/opengl/shaders/LineFrag.glsl +0 -32
  156. data/src/main/java/processing/opengl/shaders/LineVert.glsl +0 -100
  157. data/src/main/java/processing/opengl/shaders/MaskFrag.glsl +0 -40
  158. data/src/main/java/processing/opengl/shaders/PointFrag.glsl +0 -32
  159. data/src/main/java/processing/opengl/shaders/PointVert.glsl +0 -56
  160. data/src/main/java/processing/opengl/shaders/TexFrag.glsl +0 -37
  161. data/src/main/java/processing/opengl/shaders/TexLightFrag.glsl +0 -37
  162. data/src/main/java/processing/opengl/shaders/TexLightVert.glsl +0 -157
  163. data/src/main/java/processing/opengl/shaders/TexVert.glsl +0 -38
@@ -1,847 +0,0 @@
1
- package processing.data;
2
-
3
- import java.io.*;
4
- import java.util.HashMap;
5
- import java.util.Iterator;
6
- import java.util.NoSuchElementException;
7
-
8
- import processing.core.PApplet;
9
-
10
-
11
- /**
12
- * A simple table class to use a String as a lookup for an float value.
13
- *
14
- * @webref data:composite
15
- * @see IntDict
16
- * @see StringDict
17
- */
18
- public class FloatDict {
19
-
20
- /** Number of elements in the table */
21
- protected int count;
22
-
23
- protected String[] keys;
24
- protected float[] values;
25
-
26
- /** Internal implementation for faster lookups */
27
- private HashMap<String, Integer> indices = new HashMap<>();
28
-
29
-
30
- public FloatDict() {
31
- count = 0;
32
- keys = new String[10];
33
- values = new float[10];
34
- }
35
-
36
-
37
- /**
38
- * Create a new lookup with a specific size. This is more efficient than not
39
- * specifying a size. Use it when you know the rough size of the thing you're creating.
40
- *
41
- * @nowebref
42
- */
43
- public FloatDict(int length) {
44
- count = 0;
45
- keys = new String[length];
46
- values = new float[length];
47
- }
48
-
49
-
50
- /**
51
- * Read a set of entries from a Reader that has each key/value pair on
52
- * a single line, separated by a tab.
53
- *
54
- * @nowebref
55
- */
56
- public FloatDict(BufferedReader reader) {
57
- String[] lines = PApplet.loadStrings(reader);
58
- keys = new String[lines.length];
59
- values = new float[lines.length];
60
-
61
- for (int i = 0; i < lines.length; i++) {
62
- String[] pieces = PApplet.split(lines[i], '\t');
63
- if (pieces.length == 2) {
64
- keys[count] = pieces[0];
65
- values[count] = PApplet.parseFloat(pieces[1]);
66
- indices.put(pieces[0], count);
67
- count++;
68
- }
69
- }
70
- }
71
-
72
-
73
- /**
74
- * @nowebref
75
- */
76
- public FloatDict(String[] keys, float[] values) {
77
- if (keys.length != values.length) {
78
- throw new IllegalArgumentException("key and value arrays must be the same length");
79
- }
80
- this.keys = keys;
81
- this.values = values;
82
- count = keys.length;
83
- for (int i = 0; i < count; i++) {
84
- indices.put(keys[i], i);
85
- }
86
- }
87
-
88
-
89
- /**
90
- * Constructor to allow (more intuitive) inline initialization, e.g.:
91
- * <pre>
92
- * new FloatDict(new Object[][] {
93
- * { "key1", 1 },
94
- * { "key2", 2 }
95
- * });
96
- * </pre>
97
- */
98
- public FloatDict(Object[][] pairs) {
99
- count = pairs.length;
100
- this.keys = new String[count];
101
- this.values = new float[count];
102
- for (int i = 0; i < count; i++) {
103
- keys[i] = (String) pairs[i][0];
104
- values[i] = (Float) pairs[i][1];
105
- indices.put(keys[i], i);
106
- }
107
- }
108
-
109
-
110
- /**
111
- * @webref floatdict:method
112
- * @brief Returns the number of key/value pairs
113
- */
114
- public int size() {
115
- return count;
116
- }
117
-
118
-
119
- /**
120
- * Resize the internal data, this can only be used to shrink the list.
121
- * Helpful for situations like sorting and then grabbing the top 50 entries.
122
- */
123
- public void resize(int length) {
124
- if (length == count) return;
125
-
126
- if (length > count) {
127
- throw new IllegalArgumentException("resize() can only be used to shrink the dictionary");
128
- }
129
- if (length < 1) {
130
- throw new IllegalArgumentException("resize(" + length + ") is too small, use 1 or higher");
131
- }
132
-
133
- String[] newKeys = new String[length];
134
- float[] newValues = new float[length];
135
- PApplet.arrayCopy(keys, newKeys, length);
136
- PApplet.arrayCopy(values, newValues, length);
137
- keys = newKeys;
138
- values = newValues;
139
- count = length;
140
- resetIndices();
141
- }
142
-
143
-
144
- /**
145
- * Remove all entries.
146
- *
147
- * @webref floatdict:method
148
- * @brief Remove all entries
149
- */
150
- public void clear() {
151
- count = 0;
152
- indices = new HashMap<>();
153
- }
154
-
155
-
156
- private void resetIndices() {
157
- indices = new HashMap<>(count);
158
- for (int i = 0; i < count; i++) {
159
- indices.put(keys[i], i);
160
- }
161
- }
162
-
163
-
164
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
165
-
166
-
167
- public class Entry {
168
- public String key;
169
- public float value;
170
-
171
- Entry(String key, float value) {
172
- this.key = key;
173
- this.value = value;
174
- }
175
- }
176
-
177
-
178
- public Iterable<Entry> entries() {
179
- return new Iterable<Entry>() {
180
-
181
- public Iterator<Entry> iterator() {
182
- return entryIterator();
183
- }
184
- };
185
- }
186
-
187
-
188
- public Iterator<Entry> entryIterator() {
189
- return new Iterator<Entry>() {
190
- int index = -1;
191
-
192
- public void remove() {
193
- removeIndex(index);
194
- index--;
195
- }
196
-
197
- public Entry next() {
198
- ++index;
199
- Entry e = new Entry(keys[index], values[index]);
200
- return e;
201
- }
202
-
203
- public boolean hasNext() {
204
- return index+1 < size();
205
- }
206
- };
207
- }
208
-
209
-
210
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
211
-
212
-
213
- public String key(int index) {
214
- return keys[index];
215
- }
216
-
217
-
218
- protected void crop() {
219
- if (count != keys.length) {
220
- keys = PApplet.subset(keys, 0, count);
221
- values = PApplet.subset(values, 0, count);
222
- }
223
- }
224
-
225
-
226
- public Iterable<String> keys() {
227
- return new Iterable<String>() {
228
-
229
- @Override
230
- public Iterator<String> iterator() {
231
- return keyIterator();
232
- }
233
- };
234
- }
235
-
236
-
237
- // Use this to iterate when you want to be able to remove elements along the way
238
- public Iterator<String> keyIterator() {
239
- return new Iterator<String>() {
240
- int index = -1;
241
-
242
- public void remove() {
243
- removeIndex(index);
244
- index--;
245
- }
246
-
247
- public String next() {
248
- return key(++index);
249
- }
250
-
251
- public boolean hasNext() {
252
- return index+1 < size();
253
- }
254
- };
255
- }
256
-
257
-
258
- /**
259
- * Return a copy of the internal keys array. This array can be modified.
260
- *
261
- * @webref floatdict:method
262
- * @brief Return a copy of the internal keys array
263
- */
264
- public String[] keyArray() {
265
- crop();
266
- return keyArray(null);
267
- }
268
-
269
-
270
- public String[] keyArray(String[] outgoing) {
271
- if (outgoing == null || outgoing.length != count) {
272
- outgoing = new String[count];
273
- }
274
- System.arraycopy(keys, 0, outgoing, 0, count);
275
- return outgoing;
276
- }
277
-
278
-
279
- public float value(int index) {
280
- return values[index];
281
- }
282
-
283
-
284
- /**
285
- * @webref floatdict:method
286
- * @brief Return the internal array being used to store the values
287
- */
288
- public Iterable<Float> values() {
289
- return new Iterable<Float>() {
290
-
291
- @Override
292
- public Iterator<Float> iterator() {
293
- return valueIterator();
294
- }
295
- };
296
- }
297
-
298
-
299
- public Iterator<Float> valueIterator() {
300
- return new Iterator<Float>() {
301
- int index = -1;
302
-
303
- public void remove() {
304
- removeIndex(index);
305
- index--;
306
- }
307
-
308
- public Float next() {
309
- return value(++index);
310
- }
311
-
312
- public boolean hasNext() {
313
- return index+1 < size();
314
- }
315
- };
316
- }
317
-
318
-
319
- /**
320
- * Create a new array and copy each of the values into it.
321
- *
322
- * @webref floatdict:method
323
- * @brief Create a new array and copy each of the values into it
324
- */
325
- public float[] valueArray() {
326
- crop();
327
- return valueArray(null);
328
- }
329
-
330
-
331
- /**
332
- * Fill an already-allocated array with the values (more efficient than
333
- * creating a new array each time). If 'array' is null, or not the same
334
- * size as the number of values, a new array will be allocated and returned.
335
- */
336
- public float[] valueArray(float[] array) {
337
- if (array == null || array.length != size()) {
338
- array = new float[count];
339
- }
340
- System.arraycopy(values, 0, array, 0, count);
341
- return array;
342
- }
343
-
344
-
345
- /**
346
- * Return a value for the specified key.
347
- *
348
- * @webref floatdict:method
349
- * @brief Return a value for the specified key
350
- */
351
- public float get(String key) {
352
- int index = index(key);
353
- if (index == -1) {
354
- throw new IllegalArgumentException("No key named '" + key + "'");
355
- }
356
- return values[index];
357
- }
358
-
359
-
360
- public float get(String key, float alternate) {
361
- int index = index(key);
362
- if (index == -1) {
363
- return alternate;
364
- }
365
- return values[index];
366
- }
367
-
368
-
369
- /**
370
- * @webref floatdict:method
371
- * @brief Create a new key/value pair or change the value of one
372
- */
373
- public void set(String key, float amount) {
374
- int index = index(key);
375
- if (index == -1) {
376
- create(key, amount);
377
- } else {
378
- values[index] = amount;
379
- }
380
- }
381
-
382
-
383
- public void setIndex(int index, String key, float value) {
384
- if (index < 0 || index >= count) {
385
- throw new ArrayIndexOutOfBoundsException(index);
386
- }
387
- keys[index] = key;
388
- values[index] = value;
389
- }
390
-
391
-
392
- /**
393
- * @webref floatdict:method
394
- * @brief Check if a key is a part of the data structure
395
- */
396
- public boolean hasKey(String key) {
397
- return index(key) != -1;
398
- }
399
-
400
-
401
- /**
402
- * @webref floatdict:method
403
- * @brief Add to a value
404
- */
405
- public void add(String key, float amount) {
406
- int index = index(key);
407
- if (index == -1) {
408
- create(key, amount);
409
- } else {
410
- values[index] += amount;
411
- }
412
- }
413
-
414
-
415
- /**
416
- * @webref floatdict:method
417
- * @brief Subtract from a value
418
- */
419
- public void sub(String key, float amount) {
420
- add(key, -amount);
421
- }
422
-
423
-
424
- /**
425
- * @webref floatdict:method
426
- * @brief Multiply a value
427
- */
428
- public void mult(String key, float amount) {
429
- int index = index(key);
430
- if (index != -1) {
431
- values[index] *= amount;
432
- }
433
- }
434
-
435
-
436
- /**
437
- * @webref floatdict:method
438
- * @brief Divide a value
439
- */
440
- public void div(String key, float amount) {
441
- int index = index(key);
442
- if (index != -1) {
443
- values[index] /= amount;
444
- }
445
- }
446
-
447
-
448
- private void checkMinMax(String functionName) {
449
- if (count == 0) {
450
- String msg =
451
- String.format("Cannot use %s() on an empty %s.",
452
- functionName, getClass().getSimpleName());
453
- throw new RuntimeException(msg);
454
- }
455
- }
456
-
457
-
458
- /**
459
- * @webref floatlist:method
460
- * @brief Return the smallest value
461
- */
462
- public int minIndex() {
463
- //checkMinMax("minIndex");
464
- if (count == 0) return -1;
465
-
466
- // Will still return NaN if there are 1 or more entries, and they're all NaN
467
- float m = Float.NaN;
468
- int mi = -1;
469
- for (int i = 0; i < count; i++) {
470
- // find one good value to start
471
- if (values[i] == values[i]) {
472
- m = values[i];
473
- mi = i;
474
-
475
- // calculate the rest
476
- for (int j = i+1; j < count; j++) {
477
- float d = values[j];
478
- if ((d == d) && (d < m)) {
479
- m = values[j];
480
- mi = j;
481
- }
482
- }
483
- break;
484
- }
485
- }
486
- return mi;
487
- }
488
-
489
-
490
- // return the key for the minimum value
491
- public String minKey() {
492
- checkMinMax("minKey");
493
- int index = minIndex();
494
- if (index == -1) {
495
- return null;
496
- }
497
- return keys[index];
498
- }
499
-
500
-
501
- // return the minimum value, or throw an error if there are no values
502
- public float minValue() {
503
- checkMinMax("minValue");
504
- int index = minIndex();
505
- if (index == -1) {
506
- return Float.NaN;
507
- }
508
- return values[index];
509
- }
510
-
511
-
512
- /**
513
- * @webref floatlist:method
514
- * @brief Return the largest value
515
- */
516
- // The index of the entry that has the max value. Reference above is incorrect.
517
- public int maxIndex() {
518
- //checkMinMax("maxIndex");
519
- if (count == 0) {
520
- return -1;
521
- }
522
- // Will still return NaN if there is 1 or more entries, and they're all NaN
523
- float m = Float.NaN;
524
- int mi = -1;
525
- for (int i = 0; i < count; i++) {
526
- // find one good value to start
527
- if (values[i] == values[i]) {
528
- m = values[i];
529
- mi = i;
530
-
531
- // calculate the rest
532
- for (int j = i+1; j < count; j++) {
533
- float d = values[j];
534
- if (!Float.isNaN(d) && (d > m)) {
535
- m = values[j];
536
- mi = j;
537
- }
538
- }
539
- break;
540
- }
541
- }
542
- return mi;
543
- }
544
-
545
-
546
- /** The key for a max value; null if empty or everything is NaN (no max). */
547
- public String maxKey() {
548
- //checkMinMax("maxKey");
549
- int index = maxIndex();
550
- if (index == -1) {
551
- return null;
552
- }
553
- return keys[index];
554
- }
555
-
556
-
557
- /** The max value. (Or NaN if no entries or they're all NaN.) */
558
- public float maxValue() {
559
- //checkMinMax("maxValue");
560
- int index = maxIndex();
561
- if (index == -1) {
562
- return Float.NaN;
563
- }
564
- return values[index];
565
- }
566
-
567
-
568
- public float sum() {
569
- double amount = sumDouble();
570
- if (amount > Float.MAX_VALUE) {
571
- throw new RuntimeException("sum() exceeds " + Float.MAX_VALUE + ", use sumDouble()");
572
- }
573
- if (amount < -Float.MAX_VALUE) {
574
- throw new RuntimeException("sum() lower than " + -Float.MAX_VALUE + ", use sumDouble()");
575
- }
576
- return (float) amount;
577
- }
578
-
579
-
580
- public double sumDouble() {
581
- double sum = 0;
582
- for (int i = 0; i < count; i++) {
583
- sum += values[i];
584
- }
585
- return sum;
586
- }
587
-
588
-
589
- public int index(String what) {
590
- Integer found = indices.get(what);
591
- return (found == null) ? -1 : found.intValue();
592
- }
593
-
594
-
595
- protected void create(String what, float much) {
596
- if (count == keys.length) {
597
- keys = PApplet.expand(keys);
598
- values = PApplet.expand(values);
599
- }
600
- indices.put(what, Integer.valueOf(count));
601
- keys[count] = what;
602
- values[count] = much;
603
- count++;
604
- }
605
-
606
-
607
- /**
608
- * @webref floatdict:method
609
- * @brief Remove a key/value pair
610
- */
611
- public float remove(String key) {
612
- int index = index(key);
613
- if (index == -1) {
614
- throw new NoSuchElementException("'" + key + "' not found");
615
- }
616
- float value = values[index];
617
- removeIndex(index);
618
- return value;
619
- }
620
-
621
-
622
- public float removeIndex(int index) {
623
- if (index < 0 || index >= count) {
624
- throw new ArrayIndexOutOfBoundsException(index);
625
- }
626
- float value = values[index];
627
- indices.remove(keys[index]);
628
- for (int i = index; i < count-1; i++) {
629
- keys[i] = keys[i+1];
630
- values[i] = values[i+1];
631
- indices.put(keys[i], i);
632
- }
633
- count--;
634
- keys[count] = null;
635
- values[count] = 0;
636
- return value;
637
- }
638
-
639
-
640
- public void swap(int a, int b) {
641
- String tkey = keys[a];
642
- float tvalue = values[a];
643
- keys[a] = keys[b];
644
- values[a] = values[b];
645
- keys[b] = tkey;
646
- values[b] = tvalue;
647
-
648
- // indices.put(keys[a], Integer.valueOf(a));
649
- // indices.put(keys[b], Integer.valueOf(b));
650
- }
651
-
652
-
653
- /**
654
- * Sort the keys alphabetically (ignoring case). Uses the value as a
655
- * tie-breaker (only really possible with a key that has a case change).
656
- *
657
- * @webref floatdict:method
658
- * @brief Sort the keys alphabetically
659
- */
660
- public void sortKeys() {
661
- sortImpl(true, false, true);
662
- }
663
-
664
-
665
- /**
666
- * @webref floatdict:method
667
- * @brief Sort the keys alphabetically in reverse
668
- */
669
- public void sortKeysReverse() {
670
- sortImpl(true, true, true);
671
- }
672
-
673
-
674
- /**
675
- * Sort by values in descending order (largest value will be at [0]).
676
- *
677
- * @webref floatdict:method
678
- * @brief Sort by values in ascending order
679
- */
680
- public void sortValues() {
681
- sortValues(true);
682
- }
683
-
684
-
685
- /**
686
- * Set true to ensure that the order returned is identical. Slightly
687
- * slower because the tie-breaker for identical values compares the keys.
688
- * @param stable
689
- */
690
- public void sortValues(boolean stable) {
691
- sortImpl(false, false, stable);
692
- }
693
-
694
-
695
- /**
696
- * @webref floatdict:method
697
- * @brief Sort by values in descending order
698
- */
699
- public void sortValuesReverse() {
700
- sortValuesReverse(true);
701
- }
702
-
703
-
704
- public void sortValuesReverse(boolean stable) {
705
- sortImpl(false, true, stable);
706
- }
707
-
708
-
709
- protected void sortImpl(final boolean useKeys, final boolean reverse,
710
- final boolean stable) {
711
- Sort s = new Sort() {
712
- @Override
713
- public int size() {
714
- if (useKeys) {
715
- return count; // don't worry about NaN values
716
-
717
- } else if (count == 0) { // skip the NaN check, it'll AIOOBE
718
- return 0;
719
-
720
- } else { // first move NaN values to the end of the list
721
- int right = count - 1;
722
- while (values[right] != values[right]) {
723
- right--;
724
- if (right == -1) {
725
- return 0; // all values are NaN
726
- }
727
- }
728
- for (int i = right; i >= 0; --i) {
729
- if (Float.isNaN(values[i])) {
730
- swap(i, right);
731
- --right;
732
- }
733
- }
734
- return right + 1;
735
- }
736
- }
737
-
738
- @Override
739
- public int compare(int a, int b) {
740
- float diff = 0;
741
- if (useKeys) {
742
- diff = keys[a].compareToIgnoreCase(keys[b]);
743
- if (diff == 0) {
744
- diff = values[a] - values[b];
745
- }
746
- } else { // sort values
747
- diff = values[a] - values[b];
748
- if (diff == 0 && stable) {
749
- diff = keys[a].compareToIgnoreCase(keys[b]);
750
- }
751
- }
752
- if (diff == 0) {
753
- return 0;
754
- } else if (reverse) {
755
- return diff < 0 ? 1 : -1;
756
- } else {
757
- return diff < 0 ? -1 : 1;
758
- }
759
- }
760
-
761
- @Override
762
- public void swap(int a, int b) {
763
- FloatDict.this.swap(a, b);
764
- }
765
- };
766
- s.run();
767
-
768
- // Set the indices after sort/swaps (performance fix 160411)
769
- resetIndices();
770
- }
771
-
772
-
773
- /**
774
- * Sum all of the values in this dictionary, then return a new FloatDict of
775
- * each key, divided by the total sum. The total for all values will be ~1.0.
776
- * @return a FloatDict with the original keys, mapped to their pct of the total
777
- */
778
- public FloatDict getPercent() {
779
- double sum = sum();
780
- FloatDict outgoing = new FloatDict();
781
- for (int i = 0; i < size(); i++) {
782
- double percent = value(i) / sum;
783
- outgoing.set(key(i), (float) percent);
784
- }
785
- return outgoing;
786
- }
787
-
788
-
789
- /** Returns a duplicate copy of this object. */
790
- public FloatDict copy() {
791
- FloatDict outgoing = new FloatDict(count);
792
- System.arraycopy(keys, 0, outgoing.keys, 0, count);
793
- System.arraycopy(values, 0, outgoing.values, 0, count);
794
- for (int i = 0; i < count; i++) {
795
- outgoing.indices.put(keys[i], i);
796
- }
797
- outgoing.count = count;
798
- return outgoing;
799
- }
800
-
801
-
802
- public void print() {
803
- for (int i = 0; i < size(); i++) {
804
- System.out.println(keys[i] + " = " + values[i]);
805
- }
806
- }
807
-
808
-
809
- /**
810
- * Save tab-delimited entries to a file (TSV format, UTF-8 encoding)
811
- */
812
- public void save(File file) {
813
- PrintWriter writer = PApplet.createWriter(file);
814
- write(writer);
815
- writer.close();
816
- }
817
-
818
-
819
- /**
820
- * Write tab-delimited entries out to
821
- * @param writer
822
- */
823
- public void write(PrintWriter writer) {
824
- for (int i = 0; i < count; i++) {
825
- writer.println(keys[i] + "\t" + values[i]);
826
- }
827
- writer.flush();
828
- }
829
-
830
-
831
- /**
832
- * Return this dictionary as a String in JSON format.
833
- */
834
- public String toJSON() {
835
- StringList items = new StringList();
836
- for (int i = 0; i < count; i++) {
837
- items.append(JSONObject.quote(keys[i])+ ": " + values[i]);
838
- }
839
- return "{ " + items.join(", ") + " }";
840
- }
841
-
842
-
843
- @Override
844
- public String toString() {
845
- return getClass().getSimpleName() + " size=" + size() + " " + toJSON();
846
- }
847
- }