src/Tools/GraphBrowser/graphbrowser/Spline.java
changeset 74015 12b1f4649ab1
parent 74011 1d366486a812
equal deleted inserted replaced
74014:3b8b1da2ff29 74015:12b1f4649ab1
       
     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 }