3599
|
1 |
/***************************************************************************
|
|
2 |
Title: GraphBrowser/Spline.java
|
|
3 |
Author: Stefan Berghofer, TU Muenchen
|
50473
|
4 |
Options: :tabSize=4:
|
3599
|
5 |
|
|
6 |
This class is used for drawing spline curves (which are not yet
|
|
7 |
supported by the Java AWT).
|
|
8 |
***************************************************************************/
|
|
9 |
|
|
10 |
package GraphBrowser;
|
|
11 |
|
|
12 |
import java.awt.*;
|
|
13 |
import java.util.*;
|
|
14 |
import java.io.*;
|
|
15 |
|
|
16 |
class SplineSection {
|
|
17 |
|
|
18 |
/*** Section of a spline function ***/
|
|
19 |
|
|
20 |
double x_b,x_c,x_d;
|
|
21 |
double y_b,y_c,y_d;
|
|
22 |
int dx,dy;
|
|
23 |
|
|
24 |
public SplineSection(double xb,double xc,double xd,
|
|
25 |
double yb,double yc,double yd,int dx2,int dy2) {
|
|
26 |
x_b=xb;x_c=xc;x_d=xd;
|
|
27 |
y_b=yb;y_c=yc;y_d=yd;
|
|
28 |
dx=dx2;dy=dy2;
|
|
29 |
}
|
|
30 |
|
|
31 |
public Point draw(Graphics g,Point s) {
|
|
32 |
double m;
|
|
33 |
int s_x,s_y,e_x=0,e_y=0;
|
|
34 |
int x,y;
|
|
35 |
|
|
36 |
s_x=s.x;s_y=s.y;
|
|
37 |
if (dx>=dy) {
|
|
38 |
if (dx==0) return s;
|
|
39 |
m=1/((double)dx);
|
|
40 |
for (x=0;x<dx;x++) {
|
|
41 |
e_x=(int)(Math.round((x_b*x*m+x_c)*x*m+x_d));
|
|
42 |
e_y=(int)(Math.round((y_b*x*m+y_c)*x*m+y_d));
|
|
43 |
g.drawLine(s_x,s_y,e_x,e_y);
|
|
44 |
s_x=e_x;s_y=e_y;
|
|
45 |
}
|
|
46 |
} else {
|
|
47 |
m=1/((double)dy);
|
|
48 |
for (y=0;y<dy;y++) {
|
|
49 |
e_x=(int)(Math.round((x_b*y*m+x_c)*y*m+x_d));
|
|
50 |
e_y=(int)(Math.round((y_b*y*m+y_c)*y*m+y_d));
|
|
51 |
g.drawLine(s_x,s_y,e_x,e_y);
|
|
52 |
s_x=e_x;s_y=e_y;
|
|
53 |
}
|
|
54 |
}
|
|
55 |
return new Point(e_x,e_y);
|
|
56 |
}
|
|
57 |
}
|
|
58 |
|
|
59 |
public class Spline {
|
|
60 |
|
|
61 |
Vector sections;
|
|
62 |
Vector points;
|
|
63 |
Point start,end;
|
|
64 |
|
|
65 |
public Spline(Vector pts) {
|
|
66 |
int i;
|
|
67 |
double d0,d1,d2,d3;
|
|
68 |
Point p0,p1,p2;
|
|
69 |
SplineSection s;
|
|
70 |
|
|
71 |
start=(Point)(pts.firstElement());
|
|
72 |
end=(Point)(pts.lastElement());
|
|
73 |
|
|
74 |
sections=new Vector(10,10);
|
|
75 |
for (i=1;i<=pts.size()-4;i+=3) {
|
|
76 |
p0=(Point)(pts.elementAt(i));
|
|
77 |
p1=(Point)(pts.elementAt(i+1));
|
|
78 |
p2=(Point)(pts.elementAt(i+2));
|
|
79 |
s=new SplineSection(
|
|
80 |
(double)(p2.x-2*p1.x+p0.x),
|
|
81 |
2.0*(p1.x-p0.x),
|
|
82 |
(double)(p0.x),
|
|
83 |
|
|
84 |
(double)(p2.y-2*p1.y+p0.y),
|
|
85 |
2.0*(p1.y-p0.y),
|
|
86 |
(double)(p0.y),
|
|
87 |
|
|
88 |
Math.abs(p2.x-p0.x),
|
|
89 |
Math.abs(p2.y-p0.y)
|
|
90 |
);
|
|
91 |
|
|
92 |
sections.addElement(s);
|
|
93 |
}
|
|
94 |
points=pts;
|
|
95 |
}
|
|
96 |
|
|
97 |
public void draw(Graphics g) {
|
|
98 |
Enumeration e1=sections.elements();
|
|
99 |
Point p=start;
|
|
100 |
|
|
101 |
while (e1.hasMoreElements())
|
|
102 |
p=((SplineSection)(e1.nextElement())).draw(g,p);
|
|
103 |
g.drawLine(p.x,p.y,end.x,end.y);
|
|
104 |
}
|
|
105 |
|
6541
|
106 |
public void PS(PrintWriter p) {
|
3599
|
107 |
Point p0,p1,p2;
|
|
108 |
int i;
|
|
109 |
|
|
110 |
p.println("n "+start.x+" "+start.y+" m");
|
|
111 |
for (i=1;i<=points.size()-4;i+=3) {
|
|
112 |
p0=(Point)(points.elementAt(i));
|
|
113 |
p1=(Point)(points.elementAt(i+1));
|
|
114 |
p2=(Point)(points.elementAt(i+2));
|
|
115 |
p.println(p0.x+" "+p0.y+" l");
|
|
116 |
p.println(p0.x+" "+p0.y+" "+p1.x+" "+p1.y+" "+p2.x+" "+p2.y+" c");
|
|
117 |
}
|
|
118 |
p.println(end.x+" "+end.y+" l s");
|
|
119 |
}
|
|
120 |
}
|