|
1 /*************************************************************************** |
|
2 Title: graphbrowser/Spline.java |
|
3 Author: Stefan Berghofer, TU Muenchen |
|
4 Options: :tabSize=4: |
|
5 |
|
6 This class is used for drawing spline curves (which are not yet |
|
7 supported by the Java AWT). |
|
8 ***************************************************************************/ |
|
9 |
|
10 package isabelle.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 |
|
106 public void PS(PrintWriter p) { |
|
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 } |