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);
}
|