Mega Code Archive

 
Categories / Java / Advanced Graphics
 

Draw Spline

import java.awt.*; import javax.swing.*; import no.geosoft.cc.geometry.Geometry; import no.geosoft.cc.geometry.Matrix4x4; import no.geosoft.cc.geometry.spline.SplineFactory; import no.geosoft.cc.graphics.*; /**  * G demo program. Demonstrates:  *  * <ul>  * <li> A rudimentary sheet music library  * <li> GObject extension  * <li> Advanced geometry generation  * </ul>  *   * @author <a href="mailto:jacob.dreyer@geosoft.no">Jacob Dreyer</a>  */    public class Demo21 extends JFrame {   public Demo21()   {     super ("G Graphics Library - Demo 21");         setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);          // Create the graphic canvas     GWindow window = new GWindow (new Color (255, 255, 255));     getContentPane().add (window.getCanvas());          // Create scene with default viewport and world extent settings     GScene scene = new GScene (window);     // Create a stave     GStave stave1 = new GStave (25);     stave1.setLocation (30, 50, 440);     GNote note;     note = new GNote ("f", 1.0, 10);     stave1.addNote (note);          note = new GNote ("g", 0.5, 10);     stave1.addNote (note);     note = new GNote ("d", 0.5, 10);             stave1.addNote (note);              note = new GNote ("a", 1.0, 10);             stave1.addNote (note);         note = new GNote ("a", 1.0, 10);             stave1.addNote (note);              // Another stave     GStave stave2 = new GStave (25);     stave2.setLocation (30, 250, 440);     note = new GNote ("a", 1.0, 10);     stave2.addNote (note);          note = new GNote ("a", 1.0, 10);     stave2.addNote (note);     note = new GNote ("h", 0.5, 10);             stave2.addNote (note);              note = new GNote ("e", 1.0, 10);             stave2.addNote (note);         note = new GNote ("g", 0.5, 10);             stave2.addNote (note);         scene.add (stave1);     scene.add (stave2);         pack();     setSize (new Dimension (500, 500));     setVisible (true);   }      private class GStave extends GObject   {     private int         x_, y_;     private int         length_;     private int         lineGap_;     private GSegment[]  lines_;     private GSegment    startLine_;     private GSegment    endLine_;     private GSegment    endBar_;     private int         current_;          public GStave (int lineGap)     {       lineGap_ = lineGap;              GStyle style = new GStyle();       style.setBackgroundColor (new Color (0, 0, 0));       style.setForegroundColor (new Color (0, 0, 0));       style.setLineWidth ((int) Math.max ((int) lineGap / 20.0, 1));       setStyle (style);       lines_ = new GSegment[5];       for (int i = 0; i < 5; i++) {         lines_[i] = new GSegment();         addSegment (lines_[i]);       }       startLine_ = new GSegment();       addSegment (startLine_);              endLine_ = new GSegment();       addSegment (endLine_);       endBar_ = new GSegment();       addSegment (endBar_);     }          public void setLocation (int x, int y, int length)     {       x_ = x;       y_ = y;       length_ = length;       current_ = x_ + 2 * lineGap_;     }     public void addNote (GNote note)     {       String value = note.getValue();       int y0 = 0;       if      (value.equals ("c")) y0 = 10;       else if (value.equals ("d")) y0 =  9;       else if (value.equals ("e")) y0 =  8;       else if (value.equals ("f")) y0 =  7;       else if (value.equals ("g")) y0 =  6;       else if (value.equals ("a")) y0 =  5;       else if (value.equals ("h")) y0 =  4;                                            note.setLocation (current_, y_ + (int) Math.round (y0 * lineGap_ * 0.5));       add (note);       current_ += lineGap_ * 3;     }          public void draw()     {       for (int i = 0; i < 5; i++) {         lines_[i].setGeometry (x_, y_ + i * lineGap_,                                x_ + length_, y_ + i * lineGap_);       }       startLine_.setGeometry (x_, y_, x_, y_ + 4 * lineGap_);              endBar_.setGeometry (new int[] {x_ + length_,                          y_,                                       x_ + length_ - (int) (lineGap_ * 0.5), y_,                                       x_ + length_ - (int) (lineGap_ * 0.5), y_ + 4 * lineGap_,                                       x_ + length_,                          y_ + 4 * lineGap_,                                       x_ + length_,                          y_});       endLine_.setGeometry (x_ + length_ - (int) (lineGap_ * 0.9), y_,                             x_ + length_ - (int) (lineGap_ * 0.9),y_ + 4 * lineGap_);     }   }         private class GNote extends GObject   {     private String     value_;     private double     duration_;     private GSegment   head_;     private GSegment   stem_;     private GSegment   flag_;     private int        x_, y_;     private int        headSize_;     private int        stemLength_;     private Matrix4x4  headRotation_;                    public GNote (String value, double duration, int size)     {       value_    = value;       duration_ = duration;       headSize_ = size;              GStyle style = new GStyle();       style.setBackgroundColor (new Color (0, 0, 0));       style.setForegroundColor (new Color (0, 0, 0));             setStyle (style);              head_ = new GSegment();       addSegment (head_);       stem_ = new GSegment();       addSegment (stem_);       flag_ = new GSegment();       addSegment (flag_);     }     public String getValue()     {       return value_;     }               public double getDuration()     {       return duration_;     }               public void setLocation (int x, int y)     {       x_ = x;       y_ = y;     }               public void draw()     {       //       // Head       //       int[] head = Geometry.createEllipse (0, 0,                                            headSize_,                                            (int) ((double) headSize_ * 1.5));       Matrix4x4 m = new Matrix4x4();       m.rotateZ (Math.PI / 3.0);       m.translate (x_, y_, 0.0);       m.transformXyPoints (head);       head_.setGeometry (head);       //       // Stem       //       int stemWidth = (int) Math.round ((double) headSize_ / 5.0);       if (stemWidth < 1) stemWidth = 1;       int stemLength = headSize_ * 8;       int stemX0 = x_ + (int) ((double) headSize_ * 1.40);       int stemY0 = y_ - (int) (headSize_ * 0.2);              int[] stem = new int[] {stemX0,             stemY0,                               stemX0 - stemWidth, stemY0,                               stemX0 - stemWidth, stemY0 - stemLength,                               stemX0,             stemY0 - stemLength,                               stemX0,             stemY0};              stem_.setGeometry (stem);       //       // Flag       //       if (duration_ < 1.0) {         int flagX0 = stemX0;         int flagY0 = stemY0 - stemLength;         double[] cp = new double[]                       {flagX0, flagY0, 0.0,                        flagX0 + (int) (headSize_ * 0.5), flagY0 + (int) (stemLength * 0.2), 0.0,                        flagX0 + (int) (headSize_ * 2.0), flagY0 + (int) (stemLength * 0.5), 0.0,                        flagX0 + (int) (headSize_ * 1.8), flagY0 + (int) (stemLength * 0.9), 0.0};         double[] spline1 = SplineFactory.createCatmullRom (cp, 20);                  cp = new double[]              {flagX0 + (int) (headSize_ * 1.8), flagY0 + (int) (stemLength * 0.9), 0.0,               flagX0 + (int) (headSize_ * 1.7), flagY0 + (int) (stemLength * 0.7), 0.0,               flagX0 + (int) (headSize_ * 0.5), flagY0 + (int) (stemLength * 0.45), 0.0,                                      flagX0,                           flagY0 + (int) (stemLength * 0.35), 0.0};         double[] spline2 = SplineFactory.createCatmullRom (cp, 20);                  int[] flag = new int[(spline1.length + spline2.length) / 3 * 2];                  int j = 0;         for (int i = 0; i < spline1.length; i+=3) {           flag[j++] = (int) Math.round (spline1[i+0]);           flag[j++] = (int) Math.round (spline1[i+1]);         }         for (int i = 0; i < spline2.length; i+=3) {           flag[j++] = (int) Math.round (spline2[i+0]);           flag[j++] = (int) Math.round (spline2[i+1]);         }                  flag_.setGeometry (flag);       }     }   }        public static void main (String[] args)   {     new Demo21();   } }                     G-DrawSpline.zip( 249 k)