commit dc77289b61c6a3df00eac9275ff59e8bc70dbc04
parent 6c0dc5edf6d161dec71ff10d90571bf1bd132ecd
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Wed, 10 May 2017 16:42:12 +0200
Add a center to circular clips.
Diffstat:
7 files changed, 51 insertions(+), 6 deletions(-)
diff --git a/doc/input b/doc/input
@@ -229,6 +229,7 @@
<circle-descriptor> ::=
circle:
radius: REAL # in ]0, INF)
+[ center: <real2>. Default 0,0 ]
[ segments: INTEGER # in [3, 4096). Default 64 ]
<vertices-list> ::=
diff --git a/src/parser/solparser_geometry.c b/src/parser/solparser_geometry.c
@@ -16,6 +16,7 @@
#define _POSIX_C_SOURCE 200112L /* nextafter support */
#include "solparser_c.h"
+#include <rsys/double2.h>
#include <math.h> /* nextafter */
/*******************************************************************************
@@ -106,7 +107,7 @@ parse_circle
const yaml_node_t* circle,
struct solparser_circleclip* clip)
{
- enum { RADIUS, SEGMENTS };
+ enum { RADIUS, CENTER, SEGMENTS };
intptr_t i, n;
int mask = 0; /* Register the parsed attributes */
res_T res = RES_OK;
@@ -121,6 +122,7 @@ parse_circle
n = circle->data.mapping.pairs.top - circle->data.mapping.pairs.start;
clip->segments = 64; /* default value */
+ d2_splat(clip->center, 0); /* default value */
FOR_EACH(i, 0, n) {
yaml_node_t* key;
yaml_node_t* val;
@@ -146,7 +148,11 @@ parse_circle
SETUP_MASK(RADIUS, "radius");
res = parse_real(parser, val, nextafter(0, 1), DBL_MAX, &clip->radius);
}
- else if (!strcmp((char*)key->data.scalar.value, "segments")) {
+ else if(!strcmp((char*)key->data.scalar.value, "center")) {
+ SETUP_MASK(CENTER, "center");
+ res = parse_real2(parser, doc, val, -DBL_MAX, DBL_MAX, clip->center);
+ }
+ else if(!strcmp((char*)key->data.scalar.value, "segments")) {
SETUP_MASK(SEGMENTS, "segments");
res = parse_integer(parser, val, 3, 4096, &clip->segments);
} else {
diff --git a/src/parser/solparser_shape.h b/src/parser/solparser_shape.h
@@ -49,6 +49,7 @@ enum solparser_shape_type {
******************************************************************************/
struct solparser_circleclip {
double radius;
+ double center[2];
long segments;
};
diff --git a/src/parser/test_solparser6.c b/src/parser/test_solparser6.c
@@ -71,7 +71,7 @@ main(int argc, char** argv)
fprintf(stream, " - plane:\n");
fprintf(stream, " clip :\n");
fprintf(stream, " - operation : AND\n");
- fprintf(stream, " circle : { radius: 1, segments: 8 }\n");
+ fprintf(stream, " circle : { radius: 1, center: [-1, 1], segments: 8 }\n");
fprintf(stream, " material: { ?virtual }\n");
fprintf(stream, " - hemisphere:\n");
fprintf(stream, " radius: 100\n");
@@ -151,6 +151,8 @@ main(int argc, char** argv)
polyclip = darray_polyclip_cdata_get(&plane->polyclips);
CHECK(polyclip->contour_type, SOLPARSER_CLIP_CONTOUR_CIRCLE);
CHECK(polyclip->circle.radius, 1);
+ CHECK(polyclip->circle.center[0], -1);
+ CHECK(polyclip->circle.center[1], 1);
CHECK(polyclip->circle.segments, 8);
obj_id = solparser_geometry_get_object(geom, 4);
@@ -164,6 +166,8 @@ main(int argc, char** argv)
polyclip = darray_polyclip_cdata_get(&hemisphere->polyclips);
CHECK(polyclip->contour_type, SOLPARSER_CLIP_CONTOUR_CIRCLE);
CHECK(polyclip->circle.radius, 1);
+ CHECK(polyclip->circle.center[0], 0); /* default value */
+ CHECK(polyclip->circle.center[1], 0); /* default value */
CHECK(polyclip->circle.segments, 64); /* Default value */
solparser_entity_iterator_next(&it);
diff --git a/src/parser/yaml/test_ko_0.yaml b/src/parser/yaml/test_ko_0.yaml
@@ -406,6 +406,7 @@
# <circle-descriptor> ::=
# circle:
# radius: REAL # in ]0, INF)
+# [ center: <real2>. Default 0,0 ]
# [ segments: INTEGER # in [3, 4096). Default 64 ]
#
#
@@ -496,6 +497,12 @@
clip:
- circle: { radius: }
---
+# missing center description
+- geometry:
+ - plane:
+ clip:
+ - circle: { center: }
+---
# invalid number "dummy"
- geometry:
- plane:
@@ -503,6 +510,20 @@
- operation: AND
circle: { radius: "dummy" }
---
+# invalid point "dummy"
+- geometry:
+ - plane:
+ clip:
+ - operation: AND
+ circle: { center: "dummy" }
+---
+# invalid point 1
+- geometry:
+ - plane:
+ clip:
+ - operation: AND
+ circle: { center: 1 }
+---
# invalid number "dummy"
- geometry:
- plane:
@@ -526,6 +547,12 @@
- geometry:
- plane:
clip:
+ - circle: { center: [4, -10] }
+---
+# missing radius
+- geometry:
+ - plane:
+ clip:
- circle: { segments: 10 }
---
# 2x radius
@@ -534,6 +561,12 @@
clip:
- circle: { radius: 1, radius: 1 }
---
+# 2x center
+- geometry:
+ - plane:
+ clip:
+ - circle: { center: [4, -10], center: [4, -10] }
+---
# 2x segments
- geometry:
- plane:
diff --git a/src/parser/yaml/test_ok_6.yaml b/src/parser/yaml/test_ok_6.yaml
@@ -127,4 +127,4 @@
focals: { real: 1, image: 1 }
clip:
- operation: AND
- circle: { radius: 1, segments: 32 }
+ circle: { radius: 1, center: [1, 1], segments: 32 }
diff --git a/src/solstice_object.c b/src/solstice_object.c
@@ -114,8 +114,8 @@ get_circular(const size_t ivert, double position[2], void* ctx)
struct solparser_circleclip* data = (struct solparser_circleclip*)ctx;
const double a = (double)ivert * 2 * PI / (double)data->segments;
ASSERT(ivert < (size_t)data->segments);
- position[0] = data->radius * cos(a);
- position[1] = data->radius * sin(a);
+ position[0] = data->center[0] + data->radius * cos(a);
+ position[1] = data->center[1] + data->radius * sin(a);
}
static res_T