diff options
author | blazy <blazy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2006-10-20 12:37:13 +0000 |
---|---|---|
committer | blazy <blazy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2006-10-20 12:37:13 +0000 |
commit | ca0c62265eb8cdd5fb0d8a8b34ee77baf3de987e (patch) | |
tree | 50a139db8e2ac51c6ff41f3790ff72aa417ed3be /test/ccured_olden/voronoi/output.c | |
parent | 43668d9109b1f36329646fd07324d435be6f0050 (diff) | |
download | compcert-ca0c62265eb8cdd5fb0d8a8b34ee77baf3de987e.tar.gz compcert-ca0c62265eb8cdd5fb0d8a8b34ee77baf3de987e.zip |
Ajout du banc de tests de CCured (Olden benchmark suite, cf.
CCured: type-safe retrofitting of legacy code, G.Necula et al.)
rapportCompcert_all.txt liste les erreurs produites par ccomp.
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@121 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'test/ccured_olden/voronoi/output.c')
-rw-r--r-- | test/ccured_olden/voronoi/output.c | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/test/ccured_olden/voronoi/output.c b/test/ccured_olden/voronoi/output.c new file mode 100644 index 00000000..a9331f99 --- /dev/null +++ b/test/ccured_olden/voronoi/output.c @@ -0,0 +1,173 @@ +/* For copyright information, see olden_v1.0/COPYRIGHT */ + +#define ODEFINE_GLOBALS +#include "defines.h" + +#ifdef SS_PLAIN +#include "ssplain.h" +#endif SS_PLAIN + +extern struct VEC2 V2_sum(); +extern struct VEC2 V2_sub(); +extern struct VEC2 V2_times(); +extern double V2_cprod(); +extern struct VEC2 V2_cross(); +extern double V2_dot(); +extern double V2_magn(); + +/****************************************************************/ +/* Voronoi Output Routines */ +/****************************************************************/ + +void +plot_dedge(p1, p2) +VERTEX_PTR p1, p2; +{ + double x1,x2,y1,y2; + + x1=X(p1); + y1=Y(p1); + x2=X(p2); + y2=Y(p2); + /* plots a Delaunay-triangulation edge on your favorite device. */ + chatting("Dedge %g %g %g %g \n",(float) x1, (float) y1, + (float) x2, (float) y2); +} + +void +plot_vedge(p1, p2) + struct VEC2 p1, p2; +{ + /* plots a Voronoi-diagram edge on your favorite device. */ + chatting("Vedge %g %g %g %g \n",(float) p1.x, (float) p1.y, (float) p2.x, + (float) p2.y); +} + +struct VEC2 circle_center(a,b,c) + /* returns the center of the circle passing through A, B & C. */ + struct VEC2 a,b,c; +{ + struct VEC2 p; + double d1,d2,d3,d4; + struct VEC2 vv1, vv2, vv3, vv4, vv5, vv6, vv7 ; + vv1 = V2_sub(b,c); + d1 = V2_magn( vv1 ); + vv1 = V2_sum(a,b); + vv2 = V2_times(0.5, vv1); + if (d1 < 0.0) /*there is no intersection point, the bisectors coincide. */ + return(vv2); + else { + vv3 = V2_sub(b,a); + vv4 = V2_sub(c,a); + d3 = V2_cprod(vv3, vv4) ; + d2 = -2.0 * d3 ; + vv5 = V2_sub(c,b); + d4 = V2_dot(vv5, vv4); + vv6 = V2_cross(vv3); + vv7 = V2_times(d4/ d2 , vv6); + p = V2_sum(vv2, vv7); + return(p); + } +} + +int *earray; + +void +output_voronoi_diagram(edge,nv,my_stack) + QUAD_EDGE edge; + int nv; + struct EDGE_STACK *my_stack; +{ + QUAD_EDGE nex, prev, snex, sprev; + struct VEC2 cvxvec, center; + double ln; + double d1; + struct VEC2 vv1, vv2, vv3; + + if (voronoi) { + zero_seen(my_stack,edge); + nex = edge; + /* Plot VD edges with one endpoint at infinity. */ + do { + struct VEC2 v21,v22,v23; + QUAD_EDGE tmp; + + v21=destv(nex); + v22=origv(nex); + tmp=onext(nex); + v23=destv(tmp); + cvxvec = V2_sub(v21,v22/*destv(nex), origv(nex)*/); + center = circle_center(v22,v21,v23 + /*origv(nex), destv(nex), destv(onext(nex))*/); + vv1 = V2_sum(v22,v21/*origv(nex), destv(nex)*/) ; + vv2 = V2_times(0.5, vv1); + vv3 = V2_sub(center, vv2) ; + ln = 1.0 + V2_magn(vv3); + d1 = ln/V2_magn(cvxvec); + vv1 = V2_cross(cvxvec); + vv2 = V2_times(d1, vv1) ; + vv3 = V2_sum(center, vv2); + plot_vedge( center, vv3 ) ; + nex = rnext(nex); + } while (nex != edge); + } + + /* Plot DT edges and finite VD edges. */ + + my_stack->ptr = 0; + push_ring(my_stack, edge); + chatting("mystack_ptr = %d\n",my_stack->ptr); + while (my_stack->ptr != 0) { + VERTEX_PTR v1,v2,v3,v4; + double d1,d2; + + + edge = pop_edge(my_stack); + if (seen(edge) == 1) + { + { + prev = edge; + nex = onext(edge); + do { + v1=orig(prev); + d1=X(v1); + v2=dest(prev); + d2=X(v2); + if (d1 >= d2 /*X(orig(prev)) >= X(dest(prev))*/) + { + /*plot_dedge(orig(prev), dest(prev));*/ + plot_dedge(v1,v2); + sprev = sym(prev); + snex = onext(sprev); + v1=orig(prev); + v2=dest(prev); + v3=dest(nex); + v4=dest(snex); + if (ccw(v1,v2,v3/*orig(prev), dest(prev), dest(nex)*/) + != ccw(v1,v2,v4/*orig(prev),dest(prev),dest(snex)*/)) + { + struct VEC2 v21, v22, v23; + v21 = origv(prev); + v22 = destv(prev); + v23 = destv(nex); + vv1 = circle_center(v21,v22,v23/*origv(prev), + destv(prev),destv(nex)*/); + v21 = origv(sprev); + v22 = destv(sprev); + v23 = destv(snex); + vv2 = circle_center(v21,v22,v23/*origv(sprev), + destv(sprev),destv(snex)*/); + plot_vedge( vv1 , vv2 ); + } + } + seen(prev) = 2; + prev = nex; + nex = onext(nex); + } while (prev != edge); + } + } + push_ring(my_stack, sym(edge)); + } + zero_seen(my_stack, edge); +} + |