This commit is contained in:
Eddy
2014-03-19 00:57:05 +04:00
commit 8602fda187
33 changed files with 6025 additions and 0 deletions

17
mask/README.fmt Normal file
View File

@@ -0,0 +1,17 @@
JSON format:
global object MUST consist field "Z" or "maskz" with Z-coordinate of mask
it CAN contain global fields (common to all holes) such as in holes array
its field bbox (if exists) HAVE TO BE GLOBAL convex bbox of all holes!
it MUST contain at least one hole object (or hole array)
fields of "hole":
"shape" - shape of hole (could be "square" and "round" or "ellipse")
"radius" - scalar or array[2] with radius parameter
"center" - array[2] with coordinates of hole's center
"bbox" - array[4] with bounding box of a hole
independently from shape any hole can consist both fields "radius" and "center" or single field "bbox"

264
mask/holes.json Normal file
View File

@@ -0,0 +1,264 @@
{
"maskz": 20.0,
"shape": "round", "radius": 0.007500,
"holes": [
{ "ring": 0, "number": 0, "center": [ 0.1742, 0.0172 ] },
{ "ring": 0, "number": 1, "center": [ 0.1675, 0.0508 ] },
{ "ring": 0, "number": 2, "center": [ 0.1543, 0.0825 ] },
{ "ring": 0, "number": 3, "center": [ 0.1353, 0.1110 ] },
{ "ring": 0, "number": 4, "center": [ 0.1110, 0.1353 ] },
{ "ring": 0, "number": 5, "center": [ 0.0825, 0.1543 ] },
{ "ring": 0, "number": 6, "center": [ 0.0508, 0.1675 ] },
{ "ring": 0, "number": 7, "center": [ 0.0172, 0.1742 ] },
{ "ring": 0, "number": 8, "center": [ -0.0172, 0.1742 ] },
{ "ring": 0, "number": 9, "center": [ -0.0508, 0.1675 ] },
{ "ring": 0, "number": 10, "center": [ -0.0825, 0.1543 ] },
{ "ring": 0, "number": 11, "center": [ -0.1110, 0.1353 ] },
{ "ring": 0, "number": 12, "center": [ -0.1353, 0.1110 ] },
{ "ring": 0, "number": 13, "center": [ -0.1543, 0.0825 ] },
{ "ring": 0, "number": 14, "center": [ -0.1675, 0.0508 ] },
{ "ring": 0, "number": 15, "center": [ -0.1742, 0.0172 ] },
{ "ring": 0, "number": 16, "center": [ -0.1742, -0.0172 ] },
{ "ring": 0, "number": 17, "center": [ -0.1675, -0.0508 ] },
{ "ring": 0, "number": 18, "center": [ -0.1543, -0.0825 ] },
{ "ring": 0, "number": 19, "center": [ -0.1353, -0.1110 ] },
{ "ring": 0, "number": 20, "center": [ -0.1110, -0.1353 ] },
{ "ring": 0, "number": 21, "center": [ -0.0825, -0.1543 ] },
{ "ring": 0, "number": 22, "center": [ -0.0508, -0.1675 ] },
{ "ring": 0, "number": 23, "center": [ -0.0172, -0.1742 ] },
{ "ring": 0, "number": 24, "center": [ 0.0172, -0.1742 ] },
{ "ring": 0, "number": 25, "center": [ 0.0508, -0.1675 ] },
{ "ring": 0, "number": 26, "center": [ 0.0825, -0.1543 ] },
{ "ring": 0, "number": 27, "center": [ 0.1110, -0.1353 ] },
{ "ring": 0, "number": 28, "center": [ 0.1353, -0.1110 ] },
{ "ring": 0, "number": 29, "center": [ 0.1543, -0.0825 ] },
{ "ring": 0, "number": 30, "center": [ 0.1675, -0.0508 ] },
{ "ring": 0, "number": 31, "center": [ 0.1742, -0.0172 ] },
{ "ring": 1, "number": 0, "center": [ 0.2458, 0.0242 ] },
{ "ring": 1, "number": 1, "center": [ 0.2364, 0.0717 ] },
{ "ring": 1, "number": 2, "center": [ 0.2178, 0.1164 ] },
{ "ring": 1, "number": 3, "center": [ 0.1909, 0.1567 ] },
{ "ring": 1, "number": 4, "center": [ 0.1567, 0.1909 ] },
{ "ring": 1, "number": 5, "center": [ 0.1164, 0.2178 ] },
{ "ring": 1, "number": 6, "center": [ 0.0717, 0.2364 ] },
{ "ring": 1, "number": 7, "center": [ 0.0242, 0.2458 ] },
{ "ring": 1, "number": 8, "center": [ -0.0242, 0.2458 ] },
{ "ring": 1, "number": 9, "center": [ -0.0717, 0.2364 ] },
{ "ring": 1, "number": 10, "center": [ -0.1164, 0.2178 ] },
{ "ring": 1, "number": 11, "center": [ -0.1567, 0.1909 ] },
{ "ring": 1, "number": 12, "center": [ -0.1909, 0.1567 ] },
{ "ring": 1, "number": 13, "center": [ -0.2178, 0.1164 ] },
{ "ring": 1, "number": 14, "center": [ -0.2364, 0.0717 ] },
{ "ring": 1, "number": 15, "center": [ -0.2458, 0.0242 ] },
{ "ring": 1, "number": 16, "center": [ -0.2458, -0.0242 ] },
{ "ring": 1, "number": 17, "center": [ -0.2364, -0.0717 ] },
{ "ring": 1, "number": 18, "center": [ -0.2178, -0.1164 ] },
{ "ring": 1, "number": 19, "center": [ -0.1909, -0.1567 ] },
{ "ring": 1, "number": 20, "center": [ -0.1567, -0.1909 ] },
{ "ring": 1, "number": 21, "center": [ -0.1164, -0.2178 ] },
{ "ring": 1, "number": 22, "center": [ -0.0717, -0.2364 ] },
{ "ring": 1, "number": 23, "center": [ -0.0242, -0.2458 ] },
{ "ring": 1, "number": 24, "center": [ 0.0242, -0.2458 ] },
{ "ring": 1, "number": 25, "center": [ 0.0717, -0.2364 ] },
{ "ring": 1, "number": 26, "center": [ 0.1164, -0.2178 ] },
{ "ring": 1, "number": 27, "center": [ 0.1567, -0.1909 ] },
{ "ring": 1, "number": 28, "center": [ 0.1909, -0.1567 ] },
{ "ring": 1, "number": 29, "center": [ 0.2178, -0.1164 ] },
{ "ring": 1, "number": 30, "center": [ 0.2364, -0.0717 ] },
{ "ring": 1, "number": 31, "center": [ 0.2458, -0.0242 ] },
{ "ring": 2, "number": 0, "center": [ 0.2936, 0.0289 ] },
{ "ring": 2, "number": 1, "center": [ 0.2823, 0.0856 ] },
{ "ring": 2, "number": 2, "center": [ 0.2602, 0.1391 ] },
{ "ring": 2, "number": 3, "center": [ 0.2280, 0.1871 ] },
{ "ring": 2, "number": 4, "center": [ 0.1871, 0.2280 ] },
{ "ring": 2, "number": 5, "center": [ 0.1391, 0.2602 ] },
{ "ring": 2, "number": 6, "center": [ 0.0856, 0.2823 ] },
{ "ring": 2, "number": 7, "center": [ 0.0289, 0.2936 ] },
{ "ring": 2, "number": 8, "center": [ -0.0289, 0.2936 ] },
{ "ring": 2, "number": 9, "center": [ -0.0856, 0.2823 ] },
{ "ring": 2, "number": 10, "center": [ -0.1391, 0.2602 ] },
{ "ring": 2, "number": 11, "center": [ -0.1871, 0.2280 ] },
{ "ring": 2, "number": 12, "center": [ -0.2280, 0.1871 ] },
{ "ring": 2, "number": 13, "center": [ -0.2602, 0.1391 ] },
{ "ring": 2, "number": 14, "center": [ -0.2823, 0.0856 ] },
{ "ring": 2, "number": 15, "center": [ -0.2936, 0.0289 ] },
{ "ring": 2, "number": 16, "center": [ -0.2936, -0.0289 ] },
{ "ring": 2, "number": 17, "center": [ -0.2823, -0.0856 ] },
{ "ring": 2, "number": 18, "center": [ -0.2602, -0.1391 ] },
{ "ring": 2, "number": 19, "center": [ -0.2280, -0.1871 ] },
{ "ring": 2, "number": 20, "center": [ -0.1871, -0.2280 ] },
{ "ring": 2, "number": 21, "center": [ -0.1391, -0.2602 ] },
{ "ring": 2, "number": 22, "center": [ -0.0856, -0.2823 ] },
{ "ring": 2, "number": 23, "center": [ -0.0289, -0.2936 ] },
{ "ring": 2, "number": 24, "center": [ 0.0289, -0.2936 ] },
{ "ring": 2, "number": 25, "center": [ 0.0856, -0.2823 ] },
{ "ring": 2, "number": 26, "center": [ 0.1391, -0.2602 ] },
{ "ring": 2, "number": 27, "center": [ 0.1871, -0.2280 ] },
{ "ring": 2, "number": 28, "center": [ 0.2280, -0.1871 ] },
{ "ring": 2, "number": 29, "center": [ 0.2602, -0.1391 ] },
{ "ring": 2, "number": 30, "center": [ 0.2823, -0.0856 ] },
{ "ring": 2, "number": 31, "center": [ 0.2936, -0.0289 ] },
{ "ring": 3, "number": 0, "center": [ 0.3384, 0.0333 ] },
{ "ring": 3, "number": 1, "center": [ 0.3254, 0.0987 ] },
{ "ring": 3, "number": 2, "center": [ 0.2999, 0.1603 ] },
{ "ring": 3, "number": 3, "center": [ 0.2628, 0.2157 ] },
{ "ring": 3, "number": 4, "center": [ 0.2157, 0.2628 ] },
{ "ring": 3, "number": 5, "center": [ 0.1603, 0.2999 ] },
{ "ring": 3, "number": 6, "center": [ 0.0987, 0.3254 ] },
{ "ring": 3, "number": 7, "center": [ 0.0333, 0.3384 ] },
{ "ring": 3, "number": 8, "center": [ -0.0333, 0.3384 ] },
{ "ring": 3, "number": 9, "center": [ -0.0987, 0.3254 ] },
{ "ring": 3, "number": 10, "center": [ -0.1603, 0.2999 ] },
{ "ring": 3, "number": 11, "center": [ -0.2157, 0.2628 ] },
{ "ring": 3, "number": 12, "center": [ -0.2628, 0.2157 ] },
{ "ring": 3, "number": 13, "center": [ -0.2999, 0.1603 ] },
{ "ring": 3, "number": 14, "center": [ -0.3254, 0.0987 ] },
{ "ring": 3, "number": 15, "center": [ -0.3384, 0.0333 ] },
{ "ring": 3, "number": 16, "center": [ -0.3384, -0.0333 ] },
{ "ring": 3, "number": 17, "center": [ -0.3254, -0.0987 ] },
{ "ring": 3, "number": 18, "center": [ -0.2999, -0.1603 ] },
{ "ring": 3, "number": 19, "center": [ -0.2628, -0.2157 ] },
{ "ring": 3, "number": 20, "center": [ -0.2157, -0.2628 ] },
{ "ring": 3, "number": 21, "center": [ -0.1603, -0.2999 ] },
{ "ring": 3, "number": 22, "center": [ -0.0987, -0.3254 ] },
{ "ring": 3, "number": 23, "center": [ -0.0333, -0.3384 ] },
{ "ring": 3, "number": 24, "center": [ 0.0333, -0.3384 ] },
{ "ring": 3, "number": 25, "center": [ 0.0987, -0.3254 ] },
{ "ring": 3, "number": 26, "center": [ 0.1603, -0.2999 ] },
{ "ring": 3, "number": 27, "center": [ 0.2157, -0.2628 ] },
{ "ring": 3, "number": 28, "center": [ 0.2628, -0.2157 ] },
{ "ring": 3, "number": 29, "center": [ 0.2999, -0.1603 ] },
{ "ring": 3, "number": 30, "center": [ 0.3254, -0.0987 ] },
{ "ring": 3, "number": 31, "center": [ 0.3384, -0.0333 ] },
{ "ring": 4, "number": 0, "center": [ 0.3772, 0.0371 ] },
{ "ring": 4, "number": 1, "center": [ 0.3627, 0.1100 ] },
{ "ring": 4, "number": 2, "center": [ 0.3342, 0.1787 ] },
{ "ring": 4, "number": 3, "center": [ 0.2930, 0.2404 ] },
{ "ring": 4, "number": 4, "center": [ 0.2404, 0.2930 ] },
{ "ring": 4, "number": 5, "center": [ 0.1787, 0.3342 ] },
{ "ring": 4, "number": 6, "center": [ 0.1100, 0.3627 ] },
{ "ring": 4, "number": 7, "center": [ 0.0371, 0.3772 ] },
{ "ring": 4, "number": 8, "center": [ -0.0371, 0.3772 ] },
{ "ring": 4, "number": 9, "center": [ -0.1100, 0.3627 ] },
{ "ring": 4, "number": 10, "center": [ -0.1787, 0.3342 ] },
{ "ring": 4, "number": 11, "center": [ -0.2404, 0.2930 ] },
{ "ring": 4, "number": 12, "center": [ -0.2930, 0.2404 ] },
{ "ring": 4, "number": 13, "center": [ -0.3342, 0.1787 ] },
{ "ring": 4, "number": 14, "center": [ -0.3627, 0.1100 ] },
{ "ring": 4, "number": 15, "center": [ -0.3772, 0.0371 ] },
{ "ring": 4, "number": 16, "center": [ -0.3772, -0.0371 ] },
{ "ring": 4, "number": 17, "center": [ -0.3627, -0.1100 ] },
{ "ring": 4, "number": 18, "center": [ -0.3342, -0.1787 ] },
{ "ring": 4, "number": 19, "center": [ -0.2930, -0.2404 ] },
{ "ring": 4, "number": 20, "center": [ -0.2404, -0.2930 ] },
{ "ring": 4, "number": 21, "center": [ -0.1787, -0.3342 ] },
{ "ring": 4, "number": 22, "center": [ -0.1100, -0.3627 ] },
{ "ring": 4, "number": 23, "center": [ -0.0371, -0.3772 ] },
{ "ring": 4, "number": 24, "center": [ 0.0371, -0.3772 ] },
{ "ring": 4, "number": 25, "center": [ 0.1100, -0.3627 ] },
{ "ring": 4, "number": 26, "center": [ 0.1787, -0.3342 ] },
{ "ring": 4, "number": 27, "center": [ 0.2404, -0.2930 ] },
{ "ring": 4, "number": 28, "center": [ 0.2930, -0.2404 ] },
{ "ring": 4, "number": 29, "center": [ 0.3342, -0.1787 ] },
{ "ring": 4, "number": 30, "center": [ 0.3627, -0.1100 ] },
{ "ring": 4, "number": 31, "center": [ 0.3772, -0.0371 ] },
{ "ring": 5, "number": 0, "center": [ 0.4120, 0.0406 ] },
{ "ring": 5, "number": 1, "center": [ 0.3962, 0.1202 ] },
{ "ring": 5, "number": 2, "center": [ 0.3651, 0.1952 ] },
{ "ring": 5, "number": 3, "center": [ 0.3200, 0.2626 ] },
{ "ring": 5, "number": 4, "center": [ 0.2626, 0.3200 ] },
{ "ring": 5, "number": 5, "center": [ 0.1952, 0.3651 ] },
{ "ring": 5, "number": 6, "center": [ 0.1202, 0.3962 ] },
{ "ring": 5, "number": 7, "center": [ 0.0406, 0.4120 ] },
{ "ring": 5, "number": 8, "center": [ -0.0406, 0.4120 ] },
{ "ring": 5, "number": 9, "center": [ -0.1202, 0.3962 ] },
{ "ring": 5, "number": 10, "center": [ -0.1952, 0.3651 ] },
{ "ring": 5, "number": 11, "center": [ -0.2626, 0.3200 ] },
{ "ring": 5, "number": 12, "center": [ -0.3200, 0.2626 ] },
{ "ring": 5, "number": 13, "center": [ -0.3651, 0.1952 ] },
{ "ring": 5, "number": 14, "center": [ -0.3962, 0.1202 ] },
{ "ring": 5, "number": 15, "center": [ -0.4120, 0.0406 ] },
{ "ring": 5, "number": 16, "center": [ -0.4120, -0.0406 ] },
{ "ring": 5, "number": 17, "center": [ -0.3962, -0.1202 ] },
{ "ring": 5, "number": 18, "center": [ -0.3651, -0.1952 ] },
{ "ring": 5, "number": 19, "center": [ -0.3200, -0.2626 ] },
{ "ring": 5, "number": 20, "center": [ -0.2626, -0.3200 ] },
{ "ring": 5, "number": 21, "center": [ -0.1952, -0.3651 ] },
{ "ring": 5, "number": 22, "center": [ -0.1202, -0.3962 ] },
{ "ring": 5, "number": 23, "center": [ -0.0406, -0.4120 ] },
{ "ring": 5, "number": 24, "center": [ 0.0406, -0.4120 ] },
{ "ring": 5, "number": 25, "center": [ 0.1202, -0.3962 ] },
{ "ring": 5, "number": 26, "center": [ 0.1952, -0.3651 ] },
{ "ring": 5, "number": 27, "center": [ 0.2626, -0.3200 ] },
{ "ring": 5, "number": 28, "center": [ 0.3200, -0.2626 ] },
{ "ring": 5, "number": 29, "center": [ 0.3651, -0.1952 ] },
{ "ring": 5, "number": 30, "center": [ 0.3962, -0.1202 ] },
{ "ring": 5, "number": 31, "center": [ 0.4120, -0.0406 ] },
{ "ring": 6, "number": 0, "center": [ 0.4458, 0.0439 ] },
{ "ring": 6, "number": 1, "center": [ 0.4287, 0.1300 ] },
{ "ring": 6, "number": 2, "center": [ 0.3951, 0.2112 ] },
{ "ring": 6, "number": 3, "center": [ 0.3463, 0.2842 ] },
{ "ring": 6, "number": 4, "center": [ 0.2842, 0.3463 ] },
{ "ring": 6, "number": 5, "center": [ 0.2112, 0.3951 ] },
{ "ring": 6, "number": 6, "center": [ 0.1300, 0.4287 ] },
{ "ring": 6, "number": 7, "center": [ 0.0439, 0.4458 ] },
{ "ring": 6, "number": 8, "center": [ -0.0439, 0.4458 ] },
{ "ring": 6, "number": 9, "center": [ -0.1300, 0.4287 ] },
{ "ring": 6, "number": 10, "center": [ -0.2112, 0.3951 ] },
{ "ring": 6, "number": 11, "center": [ -0.2842, 0.3463 ] },
{ "ring": 6, "number": 12, "center": [ -0.3463, 0.2842 ] },
{ "ring": 6, "number": 13, "center": [ -0.3951, 0.2112 ] },
{ "ring": 6, "number": 14, "center": [ -0.4287, 0.1300 ] },
{ "ring": 6, "number": 15, "center": [ -0.4458, 0.0439 ] },
{ "ring": 6, "number": 16, "center": [ -0.4458, -0.0439 ] },
{ "ring": 6, "number": 17, "center": [ -0.4287, -0.1300 ] },
{ "ring": 6, "number": 18, "center": [ -0.3951, -0.2112 ] },
{ "ring": 6, "number": 19, "center": [ -0.3463, -0.2842 ] },
{ "ring": 6, "number": 20, "center": [ -0.2842, -0.3463 ] },
{ "ring": 6, "number": 21, "center": [ -0.2112, -0.3951 ] },
{ "ring": 6, "number": 22, "center": [ -0.1300, -0.4287 ] },
{ "ring": 6, "number": 23, "center": [ -0.0439, -0.4458 ] },
{ "ring": 6, "number": 24, "center": [ 0.0439, -0.4458 ] },
{ "ring": 6, "number": 25, "center": [ 0.1300, -0.4287 ] },
{ "ring": 6, "number": 26, "center": [ 0.2112, -0.3951 ] },
{ "ring": 6, "number": 27, "center": [ 0.2842, -0.3463 ] },
{ "ring": 6, "number": 28, "center": [ 0.3463, -0.2842 ] },
{ "ring": 6, "number": 29, "center": [ 0.3951, -0.2112 ] },
{ "ring": 6, "number": 30, "center": [ 0.4287, -0.1300 ] },
{ "ring": 6, "number": 31, "center": [ 0.4458, -0.0439 ] },
{ "ring": 7, "number": 0, "center": [ 0.4757, 0.0469 ] },
{ "ring": 7, "number": 1, "center": [ 0.4574, 0.1388 ] },
{ "ring": 7, "number": 2, "center": [ 0.4216, 0.2253 ] },
{ "ring": 7, "number": 3, "center": [ 0.3695, 0.3032 ] },
{ "ring": 7, "number": 4, "center": [ 0.3032, 0.3695 ] },
{ "ring": 7, "number": 5, "center": [ 0.2253, 0.4216 ] },
{ "ring": 7, "number": 6, "center": [ 0.1388, 0.4574 ] },
{ "ring": 7, "number": 7, "center": [ 0.0469, 0.4757 ] },
{ "ring": 7, "number": 8, "center": [ -0.0469, 0.4757 ] },
{ "ring": 7, "number": 9, "center": [ -0.1388, 0.4574 ] },
{ "ring": 7, "number": 10, "center": [ -0.2253, 0.4216 ] },
{ "ring": 7, "number": 11, "center": [ -0.3032, 0.3695 ] },
{ "ring": 7, "number": 12, "center": [ -0.3695, 0.3032 ] },
{ "ring": 7, "number": 13, "center": [ -0.4216, 0.2253 ] },
{ "ring": 7, "number": 14, "center": [ -0.4574, 0.1388 ] },
{ "ring": 7, "number": 15, "center": [ -0.4757, 0.0469 ] },
{ "ring": 7, "number": 16, "center": [ -0.4757, -0.0469 ] },
{ "ring": 7, "number": 17, "center": [ -0.4574, -0.1388 ] },
{ "ring": 7, "number": 18, "center": [ -0.4216, -0.2253 ] },
{ "ring": 7, "number": 19, "center": [ -0.3695, -0.3032 ] },
{ "ring": 7, "number": 20, "center": [ -0.3032, -0.3695 ] },
{ "ring": 7, "number": 21, "center": [ -0.2253, -0.4216 ] },
{ "ring": 7, "number": 22, "center": [ -0.1388, -0.4574 ] },
{ "ring": 7, "number": 23, "center": [ -0.0469, -0.4757 ] },
{ "ring": 7, "number": 24, "center": [ 0.0469, -0.4757 ] },
{ "ring": 7, "number": 25, "center": [ 0.1388, -0.4574 ] },
{ "ring": 7, "number": 26, "center": [ 0.2253, -0.4216 ] },
{ "ring": 7, "number": 27, "center": [ 0.3032, -0.3695 ] },
{ "ring": 7, "number": 28, "center": [ 0.3695, -0.3032 ] },
{ "ring": 7, "number": 29, "center": [ 0.4216, -0.2253 ] },
{ "ring": 7, "number": 30, "center": [ 0.4574, -0.1388 ] },
{ "ring": 7, "number": 31, "center": [ 0.4757, -0.0469 ] },
{ "mark": 1, "number": 0, "center": [ 0.3141, -0.1301 ] },
{ "mark": 1, "number": 1, "center": [ 0.0933, -0.4688 ] },
]
}

205
mask/json.c Normal file
View File

@@ -0,0 +1,205 @@
#include <sys/mman.h>
#include <json/json.h>
#define FREE(ptr) do{free(ptr); ptr = NULL;}while(0)
typedef struct{
float x0; // left border
float y0; // lower border
float w; // width
float h; // height
} BBox;
typedef enum{
H_SQUARE // square hole
,H_ELLIPSE // elliptic hole
,H_UNDEF
} HoleType;
typedef struct{
BBox box; // bounding box of hole
int type; // type, in case of round hole borders of box are tangents to hole
} aHole;
aHole globHole;
double get_jdouble(json_object *jobj){
enum json_type type = json_object_get_type(jobj);
double val;
switch(type){
case json_type_double:
val = json_object_get_double(jobj);
break;
case json_type_int:
val = json_object_get_int(jobj);
break;
default:
fprintf(stderr, "Wrong value! Get non-number!\n");
exit(-1);
}
return val;
}
double *json_get_array(json_object *jobj, int *getLen){
enum json_type type;
json_object *jarray = jobj;
int arraylen = json_object_array_length(jarray);
double *arr = calloc(arraylen, sizeof(double));
int L = 0;
int i;
json_object *jvalue;
for (i=0; i< arraylen; i++){
jvalue = json_object_array_get_idx(jarray, i);
type = json_object_get_type(jvalue);
if(type == json_type_array){ // nested arrays is error
fprintf(stderr, "Invalid file format! Found nested arrays!\n");
exit(-1);
}
else if (type != json_type_object){
arr[L++] = get_jdouble(jvalue);
}
else{ // non-numerical data?
fprintf(stderr, "Invalid file format! Non-numerical data in array!\n");
exit(-1);
}
}
if(L == 0) FREE(arr);
if(getLen) *getLen = L;
return arr;
}
void get_obj_params(json_object *jobj, aHole *H){
double *arr = NULL;
int Len;
enum json_type type;
if(!H){
fprintf(stderr, "Error: NULL instead of aHole structure!\n");
exit(-1);
}
memcpy(H, &globHole, sizeof(aHole)); // initialize hole by global values
json_object *o = json_object_object_get(jobj, "shape");
if(o){
const char *ptr = json_object_get_string(o);
if(strcmp(ptr, "square") == 0) H->type = H_SQUARE;
else if(strcmp(ptr, "round") == 0 || strcmp(ptr, "ellipse") == 0 ) H->type = H_ELLIPSE;
else H->type = H_UNDEF;
}
o = json_object_object_get(jobj, "radius");
if(o){
type = json_object_get_type(o);
if(type == json_type_int || type == json_type_double){ // circle / square
double R = json_object_get_double(o);
H->box.w = H->box.h = R * 2.;
}else if(type == json_type_array){ // ellipse / rectangle
if(!(arr = json_get_array(o, &Len)) || Len != 2){
fprintf(stderr, "\"radius\" array must consist of two doubles!\n");
exit(-1);
}
H->box.w = arr[0] * 2.; H->box.h = arr[1] * 2.;
FREE(arr);
}else{
fprintf(stderr, "\"radius\" must be a number or an array of two doubles!\n");
exit(-1);
}
}
o = json_object_object_get(jobj, "center");
if(o){
if(!(arr = json_get_array(o, &Len)) || Len != 2){
fprintf(stderr, "\"center\" must contain an array of two doubles!\n");
exit(-1);
}
H->box.x0 = arr[0] - H->box.w/2.;
H->box.y0 = arr[1] - H->box.h/2.;
FREE(arr);
}else{
o = json_object_object_get(jobj, "bbox");
if(o){
if(!(arr = json_get_array(o, &Len)) || Len != 4){
fprintf(stderr, "\"bbox\" must contain an array of four doubles!\n");
exit(-1);
}
H->box.x0 = arr[0]; H->box.y0 = arr[1]; H->box.w = arr[2]; H->box.h = arr[3];
FREE(arr);
}
}
}
aHole *json_parse_holesarray(json_object *jobj, int *getLen){
enum json_type type;
json_object *jarray = jobj;
int arraylen = json_object_array_length(jarray), i;
aHole *H = calloc(arraylen, sizeof(aHole));
json_object *jvalue;
for (i=0; i < arraylen; i++){
jvalue = json_object_array_get_idx(jarray, i);
type = json_object_get_type(jvalue);
if(type == json_type_object){
get_obj_params(jvalue, &H[i]);
}else{
fprintf(stderr, "Invalid holes array format!\n");
exit(-1);
}
}
if(getLen) *getLen = arraylen;
return H;
}
char *gettype(aHole *H){
char *ret;
switch(H->type){
case H_SQUARE:
ret = "square";
break;
case H_ELLIPSE:
ret = "ellipse";
break;
default:
ret = "undefined";
}
return ret;
}
int main(int argc, char **argv){
char *ptr;
struct stat statbuf;
enum json_type type;
int fd, i, HolesNum;
aHole *HolesArray;
size_t Mlen;
if(argc == 2){
if ((fd = open (argv[1], O_RDONLY)) < 0) err (1, "Can't open %s for reading", argv[1]);
if (fstat (fd, &statbuf) < 0) err (1, "Fstat error");
Mlen = statbuf.st_size;
if ((ptr = mmap (0, Mlen, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED)
err(1, "Mmap error for input");
}else{
fprintf(stderr, "No file given!\n");
exit(-1);
}
json_object * jobj = json_tokener_parse(ptr);
get_obj_params(jobj, &globHole);
json_object *o = json_object_object_get(jobj, "holes");
if(!o){
fprintf(stderr, "Corrupted file: no holes found!\n");
exit(-1);
}
type = json_object_get_type(o);
if(type == json_type_object){ // single hole
HolesArray = calloc(1, sizeof(aHole));
assert(HolesArray);
HolesNum = 1;
get_obj_params(o, HolesArray);
}else{ // array of holes
HolesArray = json_parse_holesarray(o, &HolesNum);
}
if(!HolesArray || HolesNum < 1){
fprintf(stderr, "Didn't find any holes in json file!\n");
exit(-1);
}
printf("Readed %d holes\n", HolesNum);
for(i = 0; i < HolesNum; i++){
BBox *B = &HolesArray[i].box;
printf("Hole %d: type=%s, bbox={%g, %g, %g, %g}\n", i, gettype(&HolesArray[i]),
B->x0, B->y0, B->w, B->h);
}
munmap(ptr, Mlen);
return 0;
}

34
mask/make_mask.m Normal file
View File

@@ -0,0 +1,34 @@
function make_mask()
% ÐÏÓÔÒÏÅÎÉÅ ÇÁÒÔÍÁÎÏ×ÓËÏÊ ÍÁÓËÉ
% SS - ÒÁÚÍÅÒ ÍÁÓËÉ
f = fopen("holes.json", "w");
R = [175 247 295 340 379 414 448 478] * 1e-3; % ÒÁÄÉÕÓÙ ËÏÌÅÃ ÎÁ ÇÁÒÔÍÁÎÏÇÒÁÍÍÅ
HoleR = 7.5e-3; % ÒÁÄÉÕÓ ÏÔ×ÅÒÓÔÉÊ - 7.5ÍÍ
R0 = .6; % ÒÁÄÉÕÓ ÓÁÍÏÊ ÇÁÒÔÍÁÎÏÇÒÁÍÍÙ
alpha0 = pi/32; % ÓÍÅÝÅÎÉÅ ÌÕÞÅÊ ÏÔÎÏÓÉÔÅÌØÎÏ ÓÅËÕÝÉÈ ÇÏÒÉÚÏÎÔÁÌÉ/×ÅÒÔÉËÁÌÉ
Angles = [0:31] * 2 * alpha0 + alpha0; % ÕÇÌÙ, ÐÏ ËÏÔÏÒÙÍ ÒÁÓÐÏÌÁÇÁÀÔÓÑ ÌÕÞÉ
% ÄÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÒÁÚÍÅÓÔÉÔØ ÎÁ ÍÁÓËÅ ÏËÒÕÖÎÏÓÔÉ, ÓÏÚÄÁÄÉÍ ÍÁÓËÕ
% ÏËÒÕÖÎÏÓÔÉ: zeros(15) Ó ÅÄÉÎÉÃÁÍÉ ÔÁÍ, ÇÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÄÙÒËÁ. úÁÔÅÍ
% ÐÏÍÅÔÉÍ ÅÄÉÎÉÃÁÍÉ × mask ÔÅ ÔÏÞËÉ, ËÕÄÁ ÄÏÌÖÅÎ ÐÏÐÁÄÁÔØ ÌÅ×ÙÊ ×ÅÒÈÎÉÊ
fprintf(f, "{\n\t\"shape\": \"round\", \"radius\": %f,\n\t\"holes\": [\n" , HoleR);
for i = [1 : size(R,2)] % ÃÉËÌ ÐÏ ËÏÌØÃÁÍ
x = R(i) * cos(Angles);
y = R(i) * sin(Angles);
%fprintf(f, "\t\t{\"ring\": %d, \"center\": [%f, %f]\n", i, x[j], y[j]]);
printR(f, sprintf("\"ring\": %d", i-1), x, y);
endfor
% ÐÏÍÅÞÁÅÍ ÍÁÒËÅÒÙ
x = R([4 8]) .* cos([-2 -7]* 2 * alpha0);
y = R([4 8]) .* sin([-2 -7]* 2 * alpha0);
%fprintf(f, "\t\t{\"marker\", \"center\": [%f, %f]\n", x, y);
printR(f, sprintf("\"mark\": 1"), x, y);
fprintf(f, "\t]\n}\n");
fclose(f);
endfunction
function printR(f, msg, x, y)
for i = 1:size(x,2)
fprintf(f, "\t\t{ %9s, \"number\": %2d, \"center\": [ %7.4f, %7.4f ] },\n", msg, i-1, x(i), y(i));
endfor
endfunction