carray 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (231) hide show
  1. checksums.yaml +4 -4
  2. data/COPYING +56 -0
  3. data/GPL +340 -0
  4. data/Gemfile +9 -0
  5. data/Gemfile.lock +33 -0
  6. data/LEGAL +50 -0
  7. data/NOTE +73 -0
  8. data/Rakefile +20 -0
  9. data/TODO +5 -0
  10. data/ca_iter_block.c +242 -0
  11. data/ca_iter_dimension.c +287 -0
  12. data/ca_iter_window.c +202 -0
  13. data/ca_obj_array.c +1189 -0
  14. data/ca_obj_bitarray.c +523 -0
  15. data/ca_obj_bitfield.c +636 -0
  16. data/ca_obj_block.c +885 -0
  17. data/ca_obj_fake.c +405 -0
  18. data/ca_obj_farray.c +482 -0
  19. data/ca_obj_field.c +625 -0
  20. data/ca_obj_grid.c +738 -0
  21. data/ca_obj_mapping.c +614 -0
  22. data/ca_obj_object.c +777 -0
  23. data/ca_obj_reduce.c +299 -0
  24. data/ca_obj_refer.c +627 -0
  25. data/ca_obj_repeat.c +640 -0
  26. data/ca_obj_select.c +558 -0
  27. data/ca_obj_shift.c +952 -0
  28. data/ca_obj_transpose.c +582 -0
  29. data/ca_obj_unbound_repeat.c +557 -0
  30. data/ca_obj_window.c +1023 -0
  31. data/carray.h +1381 -0
  32. data/carray_access.c +1798 -0
  33. data/carray_attribute.c +903 -0
  34. data/carray_call_cfunc.c +1107 -0
  35. data/carray_cast.c +1155 -0
  36. data/carray_cast_func.rb +498 -0
  37. data/carray_class.c +132 -0
  38. data/carray_conversion.c +518 -0
  39. data/carray_copy.c +453 -0
  40. data/carray_core.c +1307 -0
  41. data/carray_element.c +572 -0
  42. data/carray_generate.c +681 -0
  43. data/carray_iterator.c +630 -0
  44. data/carray_loop.c +462 -0
  45. data/carray_mask.c +1174 -0
  46. data/carray_math.rb +834 -0
  47. data/carray_numeric.c +257 -0
  48. data/carray_operator.c +582 -0
  49. data/carray_order.c +1040 -0
  50. data/carray_random.c +529 -0
  51. data/carray_sort_addr.c +261 -0
  52. data/carray_stat.c +2102 -0
  53. data/carray_stat_proc.rb +1990 -0
  54. data/carray_test.c +602 -0
  55. data/carray_undef.c +69 -0
  56. data/carray_utils.c +740 -0
  57. data/ext/calculus/carray_calculus.c +792 -0
  58. data/ext/calculus/carray_interp.c +355 -0
  59. data/ext/calculus/extconf.rb +12 -0
  60. data/ext/calculus/lib/autoload/autoload_math_calculus.rb +2 -0
  61. data/ext/calculus/lib/math/calculus.rb +119 -0
  62. data/ext/calculus/lib/math/interp/adapter_interp1d.rb +31 -0
  63. data/ext/dataframe/API.txt +11 -0
  64. data/ext/dataframe/extconf.rb +3 -0
  65. data/ext/dataframe/lib/carray/autoload/autoload_dataframe_dataframe.rb +14 -0
  66. data/ext/dataframe/lib/carray/dataframe/dataframe.rb +1104 -0
  67. data/ext/dataframe/sample/test_uniq_sort.rb +5 -0
  68. data/ext/fortio/extconf.rb +3 -0
  69. data/ext/fortio/lib/carray/autoload/autoload_fortran_format.rb +5 -0
  70. data/ext/fortio/lib/carray/io/fortran_format.rb +43 -0
  71. data/ext/fortio/lib/fortio.rb +3 -0
  72. data/ext/fortio/lib/fortio/fortran_format.rb +603 -0
  73. data/ext/fortio/lib/fortio/fortran_format.tab.rb +536 -0
  74. data/ext/fortio/lib/fortio/fortran_format.y +215 -0
  75. data/ext/fortio/lib/fortio/fortran_namelist.rb +151 -0
  76. data/ext/fortio/lib/fortio/fortran_namelist.tab.rb +470 -0
  77. data/ext/fortio/lib/fortio/fortran_namelist.y +213 -0
  78. data/ext/fortio/lib/fortio/fortran_sequential.rb +345 -0
  79. data/ext/fortio/ruby_fortio.c +182 -0
  80. data/ext/fortio/test/test_H.rb +5 -0
  81. data/ext/fortio/test/test_T.rb +7 -0
  82. data/ext/fortio/test/test_fortran_format.rb +86 -0
  83. data/ext/fortio/test/test_namelist.rb +25 -0
  84. data/ext/fortio/test/test_sequential.rb +13 -0
  85. data/ext/fortio/test/test_sequential2.rb +13 -0
  86. data/ext/fortio/work/test.rb +10 -0
  87. data/ext/fortio/work/test_e.rb +19 -0
  88. data/ext/fortio/work/test_ep.rb +10 -0
  89. data/ext/fortio/work/test_parse.rb +12 -0
  90. data/ext/imagemap/carray_imagemap.c +495 -0
  91. data/ext/imagemap/doc/call_graph.dot +28 -0
  92. data/ext/imagemap/draw.c +567 -0
  93. data/ext/imagemap/extconf.rb +13 -0
  94. data/ext/imagemap/lib/autoload/autoload_graphics_imagemap.rb +1 -0
  95. data/ext/imagemap/lib/graphics/imagemap.rb +273 -0
  96. data/ext/imagemap/lib/image_map.rb +4 -0
  97. data/ext/imagemap/test/swath_index.rb +83 -0
  98. data/ext/imagemap/test/swath_warp.rb +99 -0
  99. data/ext/imagemap/test/test.rb +23 -0
  100. data/ext/imagemap/test/test_image.rb +42 -0
  101. data/ext/imagemap/test/test_line.rb +14 -0
  102. data/ext/imagemap/test/test_rotate.rb +17 -0
  103. data/ext/imagemap/test/test_triangle.rb +20 -0
  104. data/ext/imagemap/test/test_warp.rb +26 -0
  105. data/ext/mathfunc/carray_mathfunc.c +321 -0
  106. data/ext/mathfunc/extconf.rb +18 -0
  107. data/ext/mathfunc/lib/autoload/autoload_math_mathfunc.rb +1 -0
  108. data/ext/mathfunc/lib/math/mathfunc.rb +15 -0
  109. data/ext/mathfunc/test/test_hypot.rb +5 -0
  110. data/ext/mathfunc/test/test_j0.rb +22 -0
  111. data/ext/mathfunc/test/test_jn.rb +8 -0
  112. data/ext/mathfunc/test/test_sph.rb +9 -0
  113. data/ext/narray/README +22 -0
  114. data/ext/narray/ca_wrap_narray.c +491 -0
  115. data/ext/narray/carray_narray.c +21 -0
  116. data/ext/narray/extconf.rb +57 -0
  117. data/ext/narray/lib/autoload/autoload_math_narray.rb +1 -0
  118. data/ext/narray/lib/autoload/autoload_math_narray_miss.rb +11 -0
  119. data/ext/narray/lib/math/narray.rb +17 -0
  120. data/ext/narray/lib/math/narray_miss.rb +45 -0
  121. data/extconf.rb +3 -25
  122. data/lib/carray.rb +28 -0
  123. data/lib/carray/autoload/autoload_base.rb +23 -0
  124. data/lib/carray/autoload/autoload_graphics_gnuplot.rb +2 -0
  125. data/lib/carray/autoload/autoload_io_csv.rb +14 -0
  126. data/lib/carray/autoload/autoload_io_excel.rb +5 -0
  127. data/lib/carray/autoload/autoload_io_imagemagick.rb +6 -0
  128. data/lib/carray/autoload/autoload_io_pg.rb +6 -0
  129. data/lib/carray/autoload/autoload_io_sqlite3.rb +12 -0
  130. data/lib/carray/autoload/autoload_io_table.rb +1 -0
  131. data/lib/carray/autoload/autoload_math_histogram.rb +5 -0
  132. data/lib/carray/autoload/autoload_math_interp.rb +4 -0
  133. data/lib/carray/autoload/autoload_math_recurrence.rb +6 -0
  134. data/lib/carray/autoload/autoload_object_iterator.rb +1 -0
  135. data/lib/carray/autoload/autoload_object_link.rb +1 -0
  136. data/lib/carray/autoload/autoload_object_pack.rb +2 -0
  137. data/lib/carray/base/autoload.rb +94 -0
  138. data/lib/carray/base/basic.rb +1051 -0
  139. data/lib/carray/base/inspect.rb +252 -0
  140. data/lib/carray/base/iterator.rb +367 -0
  141. data/lib/carray/base/math.rb +403 -0
  142. data/lib/carray/base/obsolete.rb +93 -0
  143. data/lib/carray/base/serialize.rb +260 -0
  144. data/lib/carray/base/struct.rb +634 -0
  145. data/lib/carray/graphics/gnuplot.rb +2116 -0
  146. data/lib/carray/info.rb +112 -0
  147. data/lib/carray/io/csv.rb +560 -0
  148. data/lib/carray/io/excel.rb +26 -0
  149. data/lib/carray/io/imagemagick.rb +231 -0
  150. data/lib/carray/io/pg.rb +101 -0
  151. data/lib/carray/io/sqlite3.rb +202 -0
  152. data/lib/carray/io/table.rb +77 -0
  153. data/lib/carray/math/histogram.rb +179 -0
  154. data/lib/carray/math/interp.rb +57 -0
  155. data/lib/carray/math/interp/adapter_gsl_spline.rb +47 -0
  156. data/lib/carray/math/recurrence.rb +95 -0
  157. data/lib/carray/mkmf.rb +145 -0
  158. data/lib/carray/object/ca_obj_iterator.rb +52 -0
  159. data/lib/carray/object/ca_obj_link.rb +52 -0
  160. data/lib/carray/object/ca_obj_pack.rb +101 -0
  161. data/mkmath.rb +731 -0
  162. data/mt19937ar.c +182 -0
  163. data/mt19937ar.h +86 -0
  164. data/rdoc_main.rb +27 -0
  165. data/rdoc_math.rb +5 -0
  166. data/rdoc_stat.rb +31 -0
  167. data/ruby_carray.c +242 -0
  168. data/ruby_ccomplex.c +497 -0
  169. data/ruby_float_func.c +83 -0
  170. data/spec/CABlockIterator/CABlockIterator_spec.rb +113 -0
  171. data/spec/CArray/bug/store_spec.rb +27 -0
  172. data/spec/CArray/index/repeat_spec.rb +10 -0
  173. data/spec/CArray/method/eq_spec.rb +80 -0
  174. data/spec/CArray/method/is_nan_spec.rb +12 -0
  175. data/spec/CArray/method/ne_spec.rb +18 -0
  176. data/spec/CArray/method/round_spec.rb +11 -0
  177. data/spec/CArray/object/_attribute_spec.rb +32 -0
  178. data/spec/CArray/object/s_new_spec.rb +31 -0
  179. data/spec/CArray/serialize/Serialization_spec.rb +89 -0
  180. data/spec/spec_all.rb +11 -0
  181. data/test/test_ALL.rb +50 -0
  182. data/test/test_CABitfield.rb +59 -0
  183. data/test/test_CABlock.rb +208 -0
  184. data/test/test_CAField.rb +40 -0
  185. data/test/test_CAGrid.rb +76 -0
  186. data/test/test_CAMapping.rb +106 -0
  187. data/test/test_CAMmap.rb +11 -0
  188. data/test/test_CARefer.rb +94 -0
  189. data/test/test_CARepeat.rb +66 -0
  190. data/test/test_CASelect.rb +23 -0
  191. data/test/test_CAShift.rb +17 -0
  192. data/test/test_CATranspose.rb +61 -0
  193. data/test/test_CAVirtual.rb +214 -0
  194. data/test/test_CAWindow.rb +55 -0
  195. data/test/test_CAWrap.rb +9 -0
  196. data/test/test_CArray.rb +228 -0
  197. data/test/test_CComplex.rb +83 -0
  198. data/test/test_CScalar.rb +91 -0
  199. data/test/test_attribute.rb +281 -0
  200. data/test/test_block_iterator.rb +17 -0
  201. data/test/test_boolean.rb +99 -0
  202. data/test/test_cast.rb +33 -0
  203. data/test/test_class.rb +85 -0
  204. data/test/test_complex.rb +43 -0
  205. data/test/test_composite.rb +125 -0
  206. data/test/test_convert.rb +79 -0
  207. data/test/test_copy.rb +141 -0
  208. data/test/test_creation.rb +85 -0
  209. data/test/test_element.rb +146 -0
  210. data/test/test_extream.rb +55 -0
  211. data/test/test_generate.rb +75 -0
  212. data/test/test_index.rb +71 -0
  213. data/test/test_mask.rb +578 -0
  214. data/test/test_math.rb +98 -0
  215. data/test/test_narray.rb +64 -0
  216. data/test/test_order.rb +147 -0
  217. data/test/test_random.rb +15 -0
  218. data/test/test_ref_store.rb +211 -0
  219. data/test/test_stat.rb +414 -0
  220. data/test/test_struct.rb +72 -0
  221. data/test/test_virtual.rb +49 -0
  222. data/utils/ca_ase.rb +21 -0
  223. data/utils/ca_methods.rb +15 -0
  224. data/utils/cast_checker.rb +30 -0
  225. data/utils/create_rdoc.sh +9 -0
  226. data/utils/diff_method.rb +52 -0
  227. data/utils/extract_rdoc.rb +27 -0
  228. data/utils/make_tgz.sh +3 -0
  229. data/utils/remove_resource_fork.sh +5 -0
  230. data/version.h +3 -3
  231. metadata +266 -1
@@ -0,0 +1,28 @@
1
+ digraph ImageMapCallGraph {
2
+ graph [size="7,7", ];
3
+ line -> draw_line;
4
+ poly_line -> draw_polyline;
5
+ draw_polyline -> draw_line;
6
+ map_points -> draw_points;
7
+ draw_hline_gradation;
8
+ fill_triangle -> draw_hline;
9
+ draw_triangle_gradation -> draw_hline_gradation;
10
+ draw_rectangle_gradation -> draw_triangle_gradation;
11
+ draw_rectangle_gradation_grid -> draw_rectangle_gradation;
12
+ draw_hline;
13
+ fill_rectangle -> fill_triangle;
14
+ fill_rectangle_image -> fill_rectangle;
15
+ fill_rectangle_grid -> fill_rectangle;
16
+ warp_image0 -> fill_rectangle_image;
17
+ warp_image1 -> fill_rectangle_image;
18
+ warp_grid -> fill_rectangle_grid;
19
+ warp_image_gradation -> draw_rectangle_gradation_grid;
20
+ warp_grid_gradation -> draw_rectangle_gradation_grid;
21
+ warp_grid_interpolation -> warp_grid_gradation;
22
+ warp -> warp_image_gradation [label="area\ngradation"];
23
+ warp -> warp_image0 [label="area0"];
24
+ warp -> warp_image1 [label="area1"];
25
+ warp -> warp_grid_interpolation [label="point\ninterpolation"];
26
+ warp -> warp_grid_gradation [label="point\ngradation"];
27
+ warp -> warp_grid [label="point"];
28
+ }
@@ -0,0 +1,567 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ carray/draw.c
4
+
5
+ This file is part of Ruby/CArray extension library.
6
+ You can redistribute it and/or modify it under the terms of
7
+ the Ruby Licence.
8
+
9
+ Copyright (C) 2005 Hiroki Motoyoshi
10
+
11
+ ---------------------------------------------------------------------------- */
12
+
13
+ #include "carray.h"
14
+ #include <math.h>
15
+
16
+ #define ca_ptr_1d(ap, i) \
17
+ ca_ptr_at_addr((ap), (i))
18
+ #define ca_ptr_2d(ap, i, j) \
19
+ ca_ptr_at_addr((ap), ((CArray*)(ap))->dim[1]*(i) + (j))
20
+ #define ca_ptr_3d(ap, i, j, k) \
21
+ ca_ptr_at_addr(ap, \
22
+ ((CArray*)(ap))->dim[2]*( ((CArray*)(ap))->dim[1]*(i) + (j) ) + (k))
23
+
24
+ #define ca_ref_1d(type, ap, i) \
25
+ (*(type*) ca_ptr_at_addr((ap), (i)))
26
+ #define ca_ref_2d(type, ap, i, j) \
27
+ (*(type*) ca_ptr_at_addr((ap), ((CArray*)(ap))->dim[1]*(i) + (j)))
28
+ #define ca_ref_3d(type, ap, i, j, k) \
29
+ (*(type*) ca_ptr_at_addr(ap, \
30
+ ((CArray*)(ap))->dim[2]*( ((CArray*)(ap))->dim[1]*(i) + (j) ) + (k)))
31
+
32
+
33
+ #define ROUND(x) (int)(((x)>0) ? floor((x)+0.5) : ((x)<0) ? ceil((x)-0.5) : 0)
34
+ #define FLOOR(x) (int)(floor((float)x)+0.5)
35
+ #define CEIL(x) (int)(ceil((float)x)+0.5)
36
+
37
+ enum { is=0, ib=1 };
38
+
39
+ void
40
+ draw_hline (CArray *image, int iy, float x0, float x1, char *ptr)
41
+ {
42
+ int ix;
43
+
44
+ if ( iy < 0 || iy >= image->dim[0] )
45
+ return;
46
+
47
+ for (ix=FLOOR(x0); ix<=FLOOR(x1); ix++) {
48
+ if ( ix >= 0 && ix < image->dim[1] ) {
49
+ memcpy(ca_ptr_2d(image, iy, ix), ptr, image->bytes);
50
+ }
51
+ }
52
+ }
53
+
54
+ void
55
+ fill_triangle (CArray *image, float y[3], float x[3], char *ptr)
56
+ {
57
+ int imin, imid, imax;
58
+ float xmin, xmax;
59
+ float ax[2], x0[2], xt[2], y0;
60
+ int iy;
61
+ int il, ir, pass1;
62
+ int i;
63
+
64
+ imin = imid = imax = 0;
65
+ xmin = xmax = x[0];
66
+
67
+ for (i=1; i<3; i++) {
68
+ if ( y[i] <= y[imin] ) {
69
+ imid = imin;
70
+ imin = i;
71
+ }
72
+ else if ( y[i] >= y[imax] ) {
73
+ imid = imax;
74
+ imax = i;
75
+ }
76
+ else
77
+ imid = i;
78
+
79
+ if ( x[i] <= xmin )
80
+ xmin = x[i];
81
+ else if ( x[i] >= x[imax] )
82
+ xmax = x[i];
83
+ }
84
+
85
+ if ( y[imid] != y[imin] ) {
86
+ ax[is] = (x[imax] - x[imin])/(y[imax] - y[imin]);
87
+ ax[ib] = (x[imid] - x[imin])/(y[imid] - y[imin]);
88
+ if ( ax[is] < ax[ib] ) {
89
+ il = is;
90
+ ir = ib;
91
+ }
92
+ else {
93
+ il = ib;
94
+ ir = is;
95
+ }
96
+ }
97
+ else {
98
+ if ( x[imin] < x[imid] ) {
99
+ il = is;
100
+ ir = ib;
101
+ }
102
+ else {
103
+ il = ib;
104
+ ir = is;
105
+ }
106
+ }
107
+
108
+ /* --------------------------------------------------------
109
+ iy = FLOOR(y[imin]);
110
+ draw_hline(image, iy, x[imin], x[imin], ptr);
111
+ ---------------------------------------------------------- */
112
+
113
+ pass1 = 0;
114
+
115
+ if ( FLOOR(y[imid]) != FLOOR(y[imin]) ) {
116
+
117
+ ax[is] = (x[imax] - x[imin])/(y[imax] - y[imin]);
118
+ ax[ib] = (x[imid] - x[imin])/(y[imid] - y[imin]);
119
+ x0[is] = x[imin];
120
+ x0[ib] = x[imin];
121
+ y0 = y[imin];
122
+
123
+ iy = CEIL(y[imin]);
124
+ while ( iy <= FLOOR(y[imid]) ) {
125
+ xt[is] = ax[is]*((float)iy-y0)+x0[is];
126
+ xt[ib] = ax[ib]*((float)iy-y0)+x0[ib];
127
+ draw_hline(image, iy, xt[il], xt[ir], ptr);
128
+ iy += 1;
129
+ pass1 = 1;
130
+ }
131
+
132
+ }
133
+
134
+ if ( FLOOR(y[imax]) != FLOOR(y[imid]) ) {
135
+
136
+ ax[is] = (x[imax] - x[imin])/(y[imax] - y[imin]);
137
+ ax[ib] = (x[imax] - x[imid])/(y[imax] - y[imid]);
138
+ x0[is] = ax[is]*(y[imid]-y[imin])+x[imin];
139
+ x0[ib] = x[imid];
140
+ y0 = y[imid];
141
+
142
+ /* --------------------------------------------------------
143
+ if ( pass1 ) {
144
+ iy = FLOOR(y[imid]);
145
+ xt[is] = ax[is]*(iy-y0)+x0[is];
146
+ xt[ib] = x0[ib];
147
+ draw_hline(image, iy, xt[il], xt[ir], ptr);
148
+ }
149
+ ---------------------------------------------------------- */
150
+
151
+ iy = FLOOR(y[imid]);
152
+ xt[is] = x0[is];
153
+ xt[ib] = x0[ib];
154
+ draw_hline(image, iy, xt[il], xt[ir], ptr);
155
+
156
+ iy = CEIL(y[imid]);
157
+ while ( iy <= FLOOR(y[imax]) ) {
158
+ xt[is] = ax[is]*(iy-y0)+x0[is];
159
+ xt[ib] = ax[ib]*(iy-y0)+x0[ib];
160
+ draw_hline(image, iy, xt[il], xt[ir], ptr);
161
+ iy += 1;
162
+ }
163
+
164
+ }
165
+
166
+ /* --------------------------------------------------------
167
+ iy = FLOOR(y[imax]);
168
+ draw_hline_gradation(image, iy, x[imax], x[imax], z[imax], z[imax]);
169
+ ---------------------------------------------------------- */
170
+ }
171
+
172
+ void
173
+ fill_rectangle (CArray *image, float y[4], float x[4], char *ptr)
174
+ {
175
+ float yt[3], xt[3], xmin, xmax, ymin, ymax;
176
+ int i;
177
+
178
+ xmin = x[0];
179
+ xmax = x[0];
180
+ ymin = y[0];
181
+ ymax = y[0];
182
+
183
+ for (i=0; i<4; i++) {
184
+ if ( ! ( isfinite(y[i]) && isfinite(x[i]) ) )
185
+ return;
186
+ if ( x[i] < xmin )
187
+ xmin = x[i];
188
+ else if ( x[i] > xmax )
189
+ xmax = x[i];
190
+ if ( y[i] < ymin )
191
+ ymin = y[i];
192
+ else if ( y[i] > ymax )
193
+ ymax = y[i];
194
+ }
195
+
196
+ if ( ymin >= image->dim[0] || ymax < 0 )
197
+ return;
198
+
199
+ if ( xmin >= image->dim[1] || xmax < 0 )
200
+ return;
201
+
202
+ yt[0] = y[0]; yt[1] = y[1]; yt[2] = y[3];
203
+ xt[0] = x[0]; xt[1] = x[1]; xt[2] = x[3];
204
+ fill_triangle(image, yt, xt, ptr);
205
+ yt[0] = y[0]; yt[1] = y[2]; yt[2] = y[3];
206
+ xt[0] = x[0]; xt[1] = x[2]; xt[2] = x[3];
207
+ fill_triangle(image, yt, xt, ptr);
208
+ }
209
+
210
+ void
211
+ fill_rectangle_image (CArray *image, CArray *cy, CArray *cx, CArray *cv)
212
+ {
213
+ float by[4], bx[4];
214
+ int i,j;
215
+
216
+ for (i=0; i<cv->dim[0]; i++)
217
+ for (j=0; j<cv->dim[1]; j++) {
218
+ by[0] = ca_ref_2d(float, cy, i, j);
219
+ by[1] = ca_ref_2d(float, cy, i, j+1);
220
+ by[2] = ca_ref_2d(float, cy, i+1, j);
221
+ by[3] = ca_ref_2d(float, cy, i+1, j+1);
222
+ bx[0] = ca_ref_2d(float, cx, i, j);
223
+ bx[1] = ca_ref_2d(float, cx, i, j+1);
224
+ bx[2] = ca_ref_2d(float, cx, i+1, j);
225
+ bx[3] = ca_ref_2d(float, cx, i+1, j+1);
226
+ fill_rectangle(image, by, bx, ca_ptr_2d(cv, i, j));
227
+ }
228
+ }
229
+
230
+ void
231
+ fill_rectangle_grid (CArray *image, CArray *cy, CArray *cx, CArray *cv)
232
+ {
233
+ float by[4], bx[4], bv[4], mean;
234
+ int i,j;
235
+ char *val;
236
+
237
+ val = ALLOC_N(char, cv->bytes);
238
+
239
+ for (i=0; i<cv->dim[0]-1; i++) {
240
+ for (j=0; j<cv->dim[1]-1; j++) {
241
+ by[0] = ca_ref_2d(float, cy, i, j);
242
+ by[1] = ca_ref_2d(float, cy, i, j+1);
243
+ by[2] = ca_ref_2d(float, cy, i+1, j);
244
+ by[3] = ca_ref_2d(float, cy, i+1, j+1);
245
+ bx[0] = ca_ref_2d(float, cx, i, j);
246
+ bx[1] = ca_ref_2d(float, cx, i, j+1);
247
+ bx[2] = ca_ref_2d(float, cx, i+1, j);
248
+ bx[3] = ca_ref_2d(float, cx, i+1, j+1);
249
+ ca_ptr2val(cv, ca_ptr_2d(cv, i, j), CA_FLOAT, &bv[0]);
250
+ ca_ptr2val(cv, ca_ptr_2d(cv, i, j+1), CA_FLOAT, &bv[1]);
251
+ ca_ptr2val(cv, ca_ptr_2d(cv, i+1, j), CA_FLOAT, &bv[2]);
252
+ ca_ptr2val(cv, ca_ptr_2d(cv, i+1, j+1), CA_FLOAT, &bv[3]);
253
+ mean = (bv[0] + bv[1] + bv[2] + bv[3])/4.0;
254
+ ca_val2ptr(CA_FLOAT, &mean, cv, val);
255
+ fill_rectangle(image, by, bx, val);
256
+ }
257
+ }
258
+ free(val);
259
+ }
260
+
261
+ /* ----------------------------------------------------------------- */
262
+
263
+ void
264
+ draw_hline_gradation (CArray *image, int iy,
265
+ float x0, float x1, float z0, float z1)
266
+ {
267
+ int ix;
268
+ float az, gz;
269
+
270
+ if ( iy < 0 || iy >= image->dim[0] ) {
271
+ return;
272
+ }
273
+
274
+ ix = FLOOR(x0);
275
+ if ( ix >= 0 && ix < image->dim[1] ) {
276
+ ca_val2ptr(CA_FLOAT, &z0, image, ca_ptr_2d(image, iy, ix));
277
+ }
278
+
279
+ if ( x1 != x0 ) {
280
+ az = (z1-z0)/(x1-x0);
281
+ ix = CEIL(x0);
282
+ while ( ix <= FLOOR(x1) ) {
283
+ gz = az * (ix - x0) + z0;
284
+ if ( ix >= 0 && ix < image->dim[1] ) {
285
+ ca_val2ptr(CA_FLOAT, &gz, image, ca_ptr_2d(image, iy, ix));
286
+ }
287
+ ix += 1;
288
+ }
289
+ }
290
+
291
+ ix = FLOOR(x1);
292
+ if ( ix >= 0 && ix < image->dim[1] ) {
293
+ ca_val2ptr(CA_FLOAT, &z1, image, ca_ptr_2d(image, iy, ix));
294
+ }
295
+ }
296
+
297
+ void
298
+ draw_triangle_gradation (CArray *image, float y[3], float x[3], float z[3])
299
+ {
300
+ int imin, imid, imax;
301
+ float xmin, xmax;
302
+ float ax[2], az[2], x0[2], z0[2], xt[2], zt[2], y0;
303
+ int iy;
304
+ int il, ir, pass1;
305
+ int i;
306
+
307
+ imin = imid = imax = 0;
308
+ xmin = xmax = x[0];
309
+
310
+ for (i=1; i<3; i++) {
311
+ if ( y[i] <= y[imin] ) {
312
+ imid = imin;
313
+ imin = i;
314
+ }
315
+ else if ( y[i] >= y[imax] ) {
316
+ imid = imax;
317
+ imax = i;
318
+ }
319
+ else
320
+ imid = i;
321
+
322
+ if ( x[i] <= xmin )
323
+ xmin = x[i];
324
+ else if ( x[i] >= x[imax] )
325
+ xmax = x[i];
326
+ }
327
+
328
+ if ( y[imid] != y[imin] ) {
329
+
330
+ ax[is] = (x[imax] - x[imin])/(y[imax] - y[imin]);
331
+ ax[ib] = (x[imid] - x[imin])/(y[imid] - y[imin]);
332
+
333
+ if ( ax[is] < ax[ib] ) {
334
+ il = is;
335
+ ir = ib;
336
+ }
337
+ else {
338
+ il = ib;
339
+ ir = is;
340
+ }
341
+ }
342
+ else {
343
+ if ( x[imin] < x[imid] ) {
344
+ il = is;
345
+ ir = ib;
346
+ }
347
+ else {
348
+ il = ib;
349
+ ir = is;
350
+ }
351
+ }
352
+
353
+ /* --------------------------------------------------------
354
+ iy = FLOOR(y[imin]);
355
+ draw_hline_gradation(image, iy, x[imin], x[imin], z[imin], z[imin]);
356
+ ---------------------------------------------------------- */
357
+
358
+ pass1 = 0;
359
+
360
+ if ( FLOOR(y[imid]) != FLOOR(y[imin]) ) {
361
+
362
+ ax[is] = (x[imax] - x[imin])/(y[imax] - y[imin]);
363
+ ax[ib] = (x[imid] - x[imin])/(y[imid] - y[imin]);
364
+ az[is] = (z[imax] - z[imin])/(y[imax] - y[imin]);
365
+ az[ib] = (z[imid] - z[imin])/(y[imid] - y[imin]);
366
+ x0[is] = x[imin];
367
+ x0[ib] = x[imin];
368
+ z0[is] = z[imin];
369
+ z0[ib] = z[imin];
370
+ y0 = y[imin];
371
+
372
+ iy = CEIL(y[imin]);
373
+ while ( iy <= FLOOR(y[imid]) ) {
374
+ xt[is] = ax[is]*((float)iy-y0)+x0[is];
375
+ xt[ib] = ax[ib]*((float)iy-y0)+x0[ib];
376
+ zt[is] = az[is]*((float)iy-y0)+z0[is];
377
+ zt[ib] = az[ib]*((float)iy-y0)+z0[ib];
378
+ draw_hline_gradation(image, iy, xt[il], xt[ir], zt[il], zt[ir]);
379
+ iy += 1;
380
+ pass1 = 1;
381
+ }
382
+
383
+ }
384
+
385
+ if ( FLOOR(y[imax]) != FLOOR(y[imid]) ) {
386
+
387
+ ax[is] = (x[imax] - x[imin])/(y[imax] - y[imin]);
388
+ ax[ib] = (x[imax] - x[imid])/(y[imax] - y[imid]);
389
+ az[is] = (z[imax] - z[imin])/(y[imax] - y[imin]);
390
+ az[ib] = (z[imax] - z[imid])/(y[imax] - y[imid]);
391
+ x0[is] = ax[is]*(y[imid]-y[imin])+x[imin];
392
+ x0[ib] = x[imid];
393
+ z0[is] = az[is]*(y[imid]-y[imin])+z[imin];
394
+ z0[ib] = z[imid];
395
+ y0 = y[imid];
396
+
397
+ /* --------------------------------------------------------
398
+ if ( pass1 ) {
399
+ iy = FLOOR(y[imid]);
400
+ xt[is] = ax[is]*(iy-y0)+x0[is];
401
+ xt[ib] = x0[ib];
402
+ zt[is] = az[is]*(iy-y0)+z0[is];
403
+ zt[ib] = z0[ib];
404
+ draw_hline_gradation(image, iy, xt[il], xt[ir], zt[il], zt[ir]);
405
+ }
406
+ ---------------------------------------------------------- */
407
+
408
+ iy = FLOOR(y[imid]);
409
+ xt[is] = x0[is];
410
+ xt[ib] = x0[ib];
411
+ zt[is] = z0[is];
412
+ zt[ib] = z0[ib];
413
+ draw_hline_gradation(image, iy, xt[il], xt[ir], zt[il], zt[ir]);
414
+
415
+ iy = CEIL(y[imid]);
416
+ while ( iy <= FLOOR(y[imax]) ) {
417
+ xt[is] = ax[is]*(iy-y0)+x0[is];
418
+ xt[ib] = ax[ib]*(iy-y0)+x0[ib];
419
+ zt[is] = az[is]*(iy-y0)+z0[is];
420
+ zt[ib] = az[ib]*(iy-y0)+z0[ib];
421
+ draw_hline_gradation(image, iy, xt[il], xt[ir], zt[il], zt[ir]);
422
+ iy += 1;
423
+ }
424
+
425
+ }
426
+
427
+ /* --------------------------------------------------------
428
+ iy = FLOOR(y[imax]);
429
+ draw_hline_gradation(image, iy, x[imax], x[imax], z[imax], z[imax]);
430
+ ---------------------------------------------------------- */
431
+ }
432
+
433
+ #include <math.h>
434
+
435
+ void
436
+ draw_rectangle_gradation (CArray *image, float y[4], float x[4], float z[4])
437
+ {
438
+ float yt[3], xt[3], zt[3], xmin, xmax, ymin, ymax;
439
+ float y0, x0, z0;
440
+ int i;
441
+
442
+ xmin = x[0];
443
+ xmax = x[0];
444
+ ymin = y[0];
445
+ ymax = y[0];
446
+
447
+ y0 = x0 = z0 = 0;
448
+ for (i=0; i<4; i++) {
449
+ if ( x[i] < xmin )
450
+ xmin = x[i];
451
+ else if ( x[i] > xmax )
452
+ xmax = x[i];
453
+ if ( y[i] < ymin )
454
+ ymin = y[i];
455
+ else if ( y[i] > ymax )
456
+ ymax = y[i];
457
+ y0 += y[i]; x0 += x[i]; z0 += z[i];
458
+ }
459
+
460
+ if ( ymin >= image->dim[0] || ymax < 0 )
461
+ return;
462
+
463
+ if ( xmin >= image->dim[1] || xmax < 0 )
464
+ return;
465
+
466
+ if ( ! ( isfinite(y0) && isfinite(x0) ) )
467
+ return;
468
+
469
+ y0 /= 4.0; x0 /= 4.0; z0 /= 4.0;
470
+
471
+ yt[0] = y0; xt[0] = x0; zt[0] = z0;
472
+
473
+ yt[1] = y[0]; yt[2] = y[1];
474
+ xt[1] = x[0]; xt[2] = x[1];
475
+ zt[1] = z[0]; zt[2] = z[1];
476
+ draw_triangle_gradation(image, yt, xt, zt);
477
+ yt[1] = y[3];
478
+ xt[1] = x[3];
479
+ zt[1] = z[3];
480
+ draw_triangle_gradation(image, yt, xt, zt);
481
+ yt[2] = y[2];
482
+ xt[2] = x[2];
483
+ zt[2] = z[2];
484
+ draw_triangle_gradation(image, yt, xt, zt);
485
+ yt[1] = y[0];
486
+ xt[1] = x[0];
487
+ zt[1] = z[0];
488
+ draw_triangle_gradation(image, yt, xt, zt);
489
+
490
+ }
491
+
492
+ void
493
+ draw_rectangle_gradation_grid (CArray *image,
494
+ CArray *cy, CArray *cx, CArray *cz)
495
+ {
496
+ float by[4], bx[4], bz[4];
497
+ int i,j;
498
+
499
+ for (i=0; i<cz->dim[0]-1; i++) {
500
+ for (j=0; j<cz->dim[1]-1; j++) {
501
+ by[0] = ca_ref_2d(float, cy, i, j);
502
+ by[1] = ca_ref_2d(float, cy, i, j+1);
503
+ by[2] = ca_ref_2d(float, cy, i+1, j);
504
+ by[3] = ca_ref_2d(float, cy, i+1, j+1);
505
+ bx[0] = ca_ref_2d(float, cx, i, j);
506
+ bx[1] = ca_ref_2d(float, cx, i, j+1);
507
+ bx[2] = ca_ref_2d(float, cx, i+1, j);
508
+ bx[3] = ca_ref_2d(float, cx, i+1, j+1);
509
+ ca_ptr2val(cz, ca_ptr_2d(cz, i, j), CA_FLOAT, &bz[0]);
510
+ ca_ptr2val(cz, ca_ptr_2d(cz, i, j+1), CA_FLOAT, &bz[1]);
511
+ ca_ptr2val(cz, ca_ptr_2d(cz, i+1, j), CA_FLOAT, &bz[2]);
512
+ ca_ptr2val(cz, ca_ptr_2d(cz, i+1, j+1), CA_FLOAT, &bz[3]);
513
+ draw_rectangle_gradation(image, by, bx, bz);
514
+ }
515
+ }
516
+ }
517
+
518
+ void
519
+ draw_points (CArray *image,
520
+ CArray *cy, CArray *cx, CArray *cz)
521
+ {
522
+ float y, x;
523
+ int32_t iy, ix;
524
+ int32_t i,j;
525
+
526
+ ca_check_type(cz, image->data_type);
527
+ ca_check_same_shape (cz, cy);
528
+ ca_check_same_shape (cz, cx);
529
+
530
+ for (i=0; i<cz->dim[0]; i++)
531
+ for (j=0; j<cz->dim[1]; j++) {
532
+ y = ca_ref_2d(float, cy, i, j);
533
+ x = ca_ref_2d(float, cx, i, j);
534
+ iy = ROUND(y);
535
+ ix = ROUND(x);
536
+ if ( ix < 0 || ix >= image->dim[1] ||
537
+ iy < 0 || iy >= image->dim[0] )
538
+ continue;
539
+ memcpy(ca_ptr_2d(image, iy, ix), ca_ptr_2d(cz, i, j), image->bytes);
540
+ }
541
+ }
542
+
543
+ void
544
+ draw_line (CArray *ca, float y0, float x0, float y1, float x1, char *ptr);
545
+
546
+ void
547
+ draw_polyline (CArray *image,
548
+ CArray *cy, CArray *cx, char *ptr)
549
+ {
550
+ float y1, x1, y2, x2;
551
+ int32_t i;
552
+
553
+ ca_check_same_shape (cx, cy);
554
+
555
+ y1 = *(float *) ca_ptr_at_addr(cy, 0);
556
+ x1 = *(float *) ca_ptr_at_addr(cx, 0);
557
+
558
+ for (i=1; i<cx->elements; i++) {
559
+ y2 = *(float *) ca_ptr_at_addr(cy, i);
560
+ x2 = *(float *) ca_ptr_at_addr(cx, i);
561
+ draw_line(image, y1, x1, y2, x2, ptr);
562
+ y1 = y2;
563
+ x1 = x2;
564
+ }
565
+
566
+ }
567
+