File: zoom.c

package info (click to toggle)
evolver 2.30c.dfsg-3
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 9,800 kB
  • ctags: 10,247
  • sloc: ansic: 118,999; makefile: 100
file content (126 lines) | stat: -rw-r--r-- 4,006 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*************************************************************
*  This file is part of the Surface Evolver source code.     *
*  Programmer:  Ken Brakke, brakke@susqu.edu                 *
*************************************************************/

/******************************************************************
*
*  File: zoom.c
*
*  Contents:  Routines to zoom in on vertex.
*
*/

#include "include.h"

/******************************************************************
*
*  Function: zoom_vertex()
*
*  Purpose:  Zoom in on a vertex by chopping off everything beyond
*            a given distance and fixing in place the jagged edges.
*/

void zoom_vertex(v_id,radius)
vertex_id v_id;  /* vertex to zoom on */
REAL radius;      /* cutoff distance from v_id */
{
  vertex_id vv_id;
  edge_id e_id;
  facet_id f_id;
  facetedge_id fe_id,next,prev;
  int i; 

  if ( (web.bodycount != 0) && (web.representation == SOAPFILM) )
     kb_error(1540,"Zoom is not implemented for bodies.\n",RECOVERABLE);

  if ( radius <= 0.0 )
     kb_error(1541,"Must have positive cut-off radius.\n",RECOVERABLE);

  if ( !valid_id(v_id) || !valid_element(v_id) )
     { sprintf(errmsg,"Vertex %s is not valid.\n",ELNAME(v_id));
       kb_error(1542,errmsg,RECOVERABLE);
     }

  /* eliminate all vertices beyond cutoff */
  FOR_ALL_VERTICES(vv_id)
     { 
        if ( distance(v_id,vv_id) > radius )
          set_attr(vv_id,DISSOLVED);
     }

  /* eliminate all edges connected to gone vertices */
  FOR_ALL_EDGES(e_id)
     { int val_head,val_tail;
        
        val_tail = !(get_vattr(get_edge_tailv(e_id)) & DISSOLVED);
        val_head = !(get_vattr(get_edge_headv(e_id)) & DISSOLVED);
        if ( !val_head || !val_tail )
          { if (val_head) 
                { set_attr(get_edge_headv(e_id),FIXED);
                }
            if (val_tail) 
                { set_attr(get_edge_tailv(e_id),FIXED);
                }
             set_attr(e_id,DISSOLVED);
          }
     }

  /* eliminate all facets verging on gone edges */
  FOR_ALL_FACETS(f_id)
     { 
        fe_id = get_facet_fe(f_id);
        for ( i = 0 ; i < FACET_EDGES ; i++ )
          { if ( get_eattr(get_fe_edge(fe_id)) & DISSOLVED )
                { set_attr(f_id,DISSOLVED);
                  break;
                }
             fe_id = get_next_edge(fe_id);
          }
     }
     
  /* eliminate all facet-edges on gone facets */
  FOR_ALL_FACETEDGES(fe_id)
     { 
        e_id = get_fe_edge(fe_id);
        if ( get_eattr(e_id) & DISSOLVED ) 
         { set_attr(fe_id,DISSOLVED); continue; }
        f_id = get_fe_facet(fe_id);
        if ( valid_id(f_id) && (get_fattr(f_id) & DISSOLVED) )
          {    /* have kept edge on removed facet */
                 /* patch up ragged edges */
                 next = get_next_facet(fe_id);
                 prev = get_prev_facet(fe_id);
                 if ( equal_id(next,fe_id) )
                  { /* was only facet on edge */
                     set_edge_fe(e_id,NULLFACETEDGE);
                  }
                 else
                  { /* close ranks */
                     set_next_facet(prev,next);
                     set_prev_facet(next,prev);
                     set_edge_fe(e_id,next);
                  }
            
                 if ( web.representation == SOAPFILM)
                  {
                     /* fix edge in place */
                     set_attr(e_id,FIXED);
                     set_attr(get_edge_tailv(e_id),FIXED);
                     set_attr(get_edge_headv(e_id),FIXED);
                  }
                 set_attr(fe_id,DISSOLVED);
          }
     }
     FOR_ALL_VERTICES(v_id)
        if ( get_vattr(v_id) & DISSOLVED ) free_element(v_id);
     FOR_ALL_EDGES(e_id)
        if ( get_eattr(e_id) & DISSOLVED ) free_element(e_id);
     FOR_ALL_FACETS(f_id)
        if ( get_fattr(f_id) & DISSOLVED ) free_element(f_id);
     FOR_ALL_FACETEDGES(fe_id)
        if ( get_attr(fe_id) & DISSOLVED ) free_element(fe_id);

}