solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

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:
Mdoc/input | 1+
Msrc/parser/solparser_geometry.c | 10++++++++--
Msrc/parser/solparser_shape.h | 1+
Msrc/parser/test_solparser6.c | 6+++++-
Msrc/parser/yaml/test_ko_0.yaml | 33+++++++++++++++++++++++++++++++++
Msrc/parser/yaml/test_ok_6.yaml | 2+-
Msrc/solstice_object.c | 4++--
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