-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbessel.c
executable file
·72 lines (53 loc) · 1.65 KB
/
bessel.c
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
void bessel_ends(data,knot,l)
/* Computes B-spline points data[1] and data[l+]
according to Bessel end condition.
input: data: sequence of data coordinates data[0] to data[l+2].
Note that data[1] and data[l+1] are expected to
be empty, as they will be filled by this routine.
knot: knot sequence
l: number of intervals
output: data: completed, as above.
*/
float data[], knot[];
int l;
{
float alpha, beta; int i;
if (l==1)
{/* This is not really Bessel, but then what do you do
when you have only one interval? -- make it linear!
*/
data[1]= (2.0*data[0] + data[3])/3.0;
data[2]= (2.0*data[3] + data[0])/3.0;
}
else if (l==2)
{
/* beginning: */
alpha= (knot[2]-knot[1])/(knot[2]-knot[0]);
beta = 1.0 - alpha;
data[1]=(data[2]-alpha*alpha*data[0]-beta*beta*data[4])
/(2.0*alpha*beta);
data[1]=2.0*(alpha*data[0]+beta*data[1])/3.0 + data[0]/3.0;
/* end: */
alpha= (knot[2]-knot[1])/(knot[2]-knot[0]);
beta = 1.0 - alpha;
data[3]=(data[2]-alpha*alpha*data[0]-beta*beta*data[4])
/(2.0*alpha*beta);
data[3]=2.0*(alpha*data[3]+beta*data[4])/3.0+data[4]/3.0;
}
else
{
/* beginning: */
alpha= (knot[2]-knot[1])/(knot[2]-knot[0]);
beta = 1.0 - alpha;
data[1]=(data[2]-alpha*alpha*data[0]-beta*beta*data[3])
/(2.0*alpha*beta);
data[1]=2.0*(alpha*data[0]+beta*data[1])/3.0 + data[0]/3.0;
/* end: */
alpha= (knot[l]-knot[l-1])/(knot[l]-knot[l-2]);
beta = 1.0 - alpha;
data[l+1]=(data[l]-alpha*alpha*data[l-1]-beta*beta*data[l+2])
/(2.0*alpha*beta);
data[l+1]=2.0*(alpha*data[l+1]+beta*data[l+2])/3.0+data[l+2]/3.0;
}
}