File: compact.c

package info (click to toggle)
gnuplot 3.5beta6.340-5
  • links: PTS
  • area: main
  • in suites: hamm
  • size: 4,792 kB
  • ctags: 4,205
  • sloc: ansic: 41,878; asm: 539; makefile: 498; objc: 379; csh: 297; sh: 277; pascal: 194; perl: 138; lisp: 88
file content (100 lines) | stat: -rw-r--r-- 2,494 bytes parent folder | download
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
/* compact.c -- contains routines to compress a vector stream without
modifying it */

#ifndef COMPACT

/* replaces runs of constant slope in the buffer with single vectors 
   returns the number of points eliminated */
int compact_slope (xp,yp,isa_move,sz,delta)
int xp[], yp[], isa_move[];
int *sz;
double delta;
{
	int dx,dy,old_size,new_index,i,start;
	float slope,old_slope;

	old_size = *sz;
	new_index = 0;
	start = 0;
	if (xp[1]!=xp[0])
		old_slope = (float)(yp[1]-yp[0])/(float)(xp[1]-xp[0]);
	else
		old_slope = (float)(yp[1]-yp[0])/(float)(0.00001+xp[1]-xp[0]);
	for (i=2;i<old_size;i++){
		dx = xp[i] - xp[i-1];
		dy = yp[i] - yp[i-1];
		if (dx!=0)
			slope = (float) dy / (float) dx;
		else
			slope = (float) dy / ((float) dx + 0.00001);
		if ((ABS(slope-old_slope) > delta)||(isa_move[i])){	
			xp[new_index] = xp[start];
			yp[new_index] = yp[start];
			isa_move[new_index] = isa_move[start];
			new_index++;
			if (start != i-1){
				xp[new_index] = xp[i-1];
				yp[new_index] = yp[i-1];
				isa_move[new_index] = isa_move[i-1];
				new_index++;
			}
			start = i;
			/* this is the slope for the new run */
			old_slope = slope;
		}
	}
	/* copy the last point into the new array */
	xp[new_index] = xp[old_size-1];
	yp[new_index] = yp[old_size-1];
	isa_move[new_index] = isa_move[old_size-1];
	new_index++;
	*sz = new_index;
	return (old_size - *sz);
}

/* compacts the vector list by compressing runs of constant 
   dx&dy into one vector
   use this if floating point is too expensive!
   more naive than compact_slope; doesn't compact as much as possible
   returns the number of points eliminated */
int compact_int(xp,yp,isa_move,size)
int xp[],yp[], isa_move[], *size;
{
	int dx,dy,old_dx,old_dy,start,index,i,old_size;

	start = index = 0;
	old_dx = xp[1]-xp[0];
	old_dy = yp[1]-yp[0];
	for (i=2;i<*size;i++){
		dx = xp[i]-xp[i-1];
		dy = yp[i]-yp[i-1];
		if ((ABS(dx-old_dx)+ABS(dy-old_dy)!=0)||(isa_move[i])){
			/*  we've reached the end of a run */
			xp[index] = xp[start];
			yp[index] = yp[start];
			isa_move[index] = isa_move[start];
			index++;
			if (start != i-1){
				xp[index] = xp[i-1];
				yp[index] = yp[i-1];
				isa_move[index] = isa_move[i-1];
				index++;
			}
			start = i;
			old_dx = dx;
			old_dy = dy;
		}
	}  /* end for */
	/* include the last point */
	xp[index] = xp[*size-1];
	yp[index] = yp[*size-1];
	isa_move[index] = isa_move[*size-1];
	index++;
	old_size = *size;
	*size = index;
	return(old_size - *size);
}
#endif

#define COMPACT