[go: up one dir, main page]

File: close_up.c

package info (click to toggle)
circlepack 5.1-3
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, lenny, sarge
  • size: 2,828 kB
  • ctags: 1,683
  • sloc: ansic: 43,152; makefile: 46
file content (136 lines) | stat: -rw-r--r-- 4,039 bytes parent folder | download | duplicates (3)
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
127
128
129
130
131
132
133
134
135
136
#include "cp_types.h"
#include "cp_proto.h"

/* identify edges/vert on opposite sides of bdry vert 'vert'. */

int close_up(struct p_data *p,int vert)
{
  int next,v,i,ii,j,jj,w,*newflower,newnum,hold;
  double vert_next_angle=0.0,next_w_angle=0.0,*newoverlaps=NULL;
  struct K_data *pK_ptr;

  pK_ptr=p->packK_ptr;
  /* fix up 'next', vertex after vert */
  if (pK_ptr[vert].num<3) return 0; /* too few faces */
  v=pK_ptr[vert].flower[0];
  next=pK_ptr[vert].flower[pK_ptr[vert].num];
  /* if next==v, then vert and next should be interior; nothing more to do */
  if (next==v)
    {
      pK_ptr[vert].bdry_flag=pK_ptr[next].bdry_flag=0;
      p->packR_ptr[vert].aim=p->packR_ptr[next].aim=2*M_PI; 
      return 1;
    } 
  /* fix up vert */
  pK_ptr[vert].flower[0]=next;
  pK_ptr[vert].bdry_flag=0;
  p->packR_ptr[vert].aim=2*M_PI;
  if (p->overlap_status) /* average the overlaps with v and next */
    {
      vert_next_angle=(0.5)*(pK_ptr[vert].overlaps[0]+
			     pK_ptr[vert].overlaps[pK_ptr[vert].num]);
      pK_ptr[vert].overlaps[0]=
	pK_ptr[vert].overlaps[pK_ptr[vert].num]=
	vert_next_angle;
    }

  /* if next and v share common neighbors: either <v,vert,next> or
     <v,vert,next,w> is a closed bdry comp; in former case, modify w
     to put in latter case (one face disappears). */

  else if ((pK_ptr[v].flower[0]==
	       (w=pK_ptr[next].flower[pK_ptr[next].num]))
	   || pK_ptr[v].flower[0]==next)
    {
      if (pK_ptr[v].flower[0]==next)
	{
	  remove_edge(p,v,next);
	  w=pK_ptr[next].flower[pK_ptr[next].num];
	}
      newnum=pK_ptr[v].num+pK_ptr[next].num;
      newflower=(int *)calloc((size_t)(newnum+1),sizeof(int));
      if (p->overlap_status) 
	{
	  newoverlaps=(double *)calloc((size_t)(newnum+1),
				       sizeof(double));
	  next_w_angle=(0.5)*
	    (pK_ptr[w].overlaps[0]+
	     pK_ptr[w].overlaps[pK_ptr[w].num]);
	}
      hold=pK_ptr[next].num;
      for (i=0;i<=pK_ptr[next].num;i++)
	{
	  newflower[i]=pK_ptr[next].flower[i];
	  if (p->overlap_status) newoverlaps[i]=
				   pK_ptr[next].overlaps[i];
	}
      for (i=1;i<=pK_ptr[v].num;i++)
	{
	  newflower[i+pK_ptr[next].num]=pK_ptr[v].flower[i];
	  if (p->overlap_status) newoverlaps[i+pK_ptr[next].num]=
				   pK_ptr[next].overlaps[i];
	}
      free(pK_ptr[next].flower);
      pK_ptr[next].flower=newflower;
      pK_ptr[next].num=newnum;
      if (p->overlap_status)
	{
	  free(pK_ptr[next].overlaps);
	  pK_ptr[next].overlaps=newoverlaps;
	  pK_ptr[next].overlaps[0]=
	    pK_ptr[next].overlaps[newnum]=vert_next_angle;
	  pK_ptr[next].overlaps[hold]=next_w_angle;	
	}
      /* fix up w */
      pK_ptr[w].flower[pK_ptr[w].num]=next;
      if (p->overlap_status)
	pK_ptr[w].overlaps[0]=pK_ptr[w].overlaps[pK_ptr[w].num]
	  = vert_next_angle;
      pK_ptr[next].bdry_flag=	pK_ptr[w].bdry_flag=0;
      p->packR_ptr[next].aim=p->packR_ptr[w].aim=2*M_PI;
    }

  /* otherwise, next remains boundary vertex */
  else
    {
      newnum=pK_ptr[v].num+pK_ptr[next].num;
      newflower=(int *)calloc((size_t)(newnum+1),sizeof(int));
      if (p->overlap_status) 
	newoverlaps=(double *)calloc((size_t)(newnum+1),sizeof(double));
      for (i=0;i<=pK_ptr[v].num;i++)
	{
	  newflower[i]=pK_ptr[v].flower[i];
	  if (p->overlap_status)
	    newoverlaps[i]=pK_ptr[v].overlaps[i];
	}
      for (i=1;i<=pK_ptr[next].num;i++)
	{
	  newflower[i+pK_ptr[v].num]=pK_ptr[next].flower[i];
	  if (p->overlap_status)
	    newoverlaps[i+pK_ptr[v].num]=pK_ptr[v].overlaps[i];
	}
      if (p->overlap_status)
	newflower[pK_ptr[v].num]=vert_next_angle;
      pK_ptr[next].flower=newflower;
      pK_ptr[next].num=newnum;
      if (p->overlap_status)
	{
	  free(pK_ptr[w].overlaps);
	  pK_ptr[w].overlaps=newoverlaps;
	}
      p->packR_ptr[next].aim=-1.0;
    }

  /* fix up things with v in their flowers (v will be removed) */
  for (i=0;i<=pK_ptr[v].num;i++)
    {
      ii=pK_ptr[v].flower[i];
      for (j=0;j<=pK_ptr[ii].num;j++)
	{
	  jj=pK_ptr[ii].flower[j];
	  if (jj==v) pK_ptr[ii].flower[j]=next;
	}
    }
  delete(p,v);
  return 1;
} /* close_up */