Geometry Generation
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import javax.swing.*;
import no.geosoft.cc.geometry.Geometry;
import no.geosoft.cc.graphics.*;
/**
* G demo program. Demonstrates:
*
* <ul>
* <li> A math application
* <li> Polyline performance
* <li> Geometry generation
* </ul>
*
* @author <a href="mailto:[email protected] ">Jacob Dreyer</a>
*/
public class Demo20 extends JFrame
implements ActionListener
{
private JButton addLevelButton_;
private JButton removeLevelButton_;
private JLabel nEdgesLabel_;
private JLabel lengthLabel_;
private JLabel areaLabel_;
private KochSnowflake kochSnowflake_;
public Demo20 ()
{
super ( "G Graphics Library - Demo 20" ) ;
setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE ) ;
JPanel controlPanel = new JPanel () ;
addLevelButton_ = new JButton ( "+" ) ;
addLevelButton_.addActionListener ( this ) ;
controlPanel.add ( addLevelButton_ ) ;
removeLevelButton_ = new JButton ( "-" ) ;
removeLevelButton_.addActionListener ( this ) ;
controlPanel.add ( removeLevelButton_ ) ;
nEdgesLabel_ = new JLabel () ;
controlPanel.add ( nEdgesLabel_ ) ;
lengthLabel_ = new JLabel () ;
controlPanel.add ( lengthLabel_ ) ;
areaLabel_ = new JLabel () ;
controlPanel.add ( areaLabel_ ) ;
getContentPane () .add ( controlPanel, BorderLayout.NORTH ) ;
// Create the graphic canvas
GWindow window = new GWindow ( new Color ( 255 , 255 , 255 )) ;
getContentPane () .add ( window.getCanvas () , BorderLayout.CENTER ) ;
// Create scene with default viewport and world extent settings
GScene scene = new GScene ( window ) ;
double w0 [] = { 0.0 , 0.0 , 0.0 } ;
double w1 [] = { 1.0 , 0.0 , 0.0 } ;
double w2 [] = { 0.0 , 1.0 , 0.0 } ;
scene.setWorldExtent ( w0, w1, w2 ) ;
// Create the graphics object and add to the scene
kochSnowflake_ = new KochSnowflake () ;
scene.add ( kochSnowflake_ ) ;
pack () ;
setSize ( new Dimension ( 500 , 500 )) ;
setVisible ( true ) ;
window.startInteraction ( new ZoomInteraction ( scene )) ;
refresh () ;
}
public void actionPerformed ( ActionEvent event )
{
if ( event.getSource () == addLevelButton_ )
kochSnowflake_.addLevel () ;
else
kochSnowflake_.removeLevel () ;
refresh () ;
}
public void refresh ()
{
nEdgesLabel_.setText ( "#edges = " + kochSnowflake_.getNEdges ()) ;
DecimalFormat format = new DecimalFormat ( "0.00000" ) ;
double length = kochSnowflake_.computeLength () ;
lengthLabel_.setText ( " Length = " + format.format ( length )) ;
double area = kochSnowflake_.computeArea () ;
areaLabel_.setText ( " Area = " + format.format ( area )) ;
kochSnowflake_.refresh () ;
}
/**
* Defines the geometry and presentation for the sample
* graphic object.
*/
private class KochSnowflake extends GObject
{
private GSegment curve_;
private double [] geometry_;
KochSnowflake ()
{
GStyle style = new GStyle () ;
style.setForegroundColor ( new Color ( 255 , 0 , 0 )) ;
style.setBackgroundColor ( new Color ( 255 , 255 , 0 )) ;
setStyle ( style ) ;
curve_ = new GSegment () ;
geometry_ = new double [] { 0.2 , 0.2 ,
0.8 , 0.2 ,
0.5 , 0.2 + 0.6 * Math.sin ( Math.PI / 3.0 ) ,
0.2 , 0.2 } ;
addSegment ( curve_ ) ;
}
public int getNEdges ()
{
return geometry_.length / 2 - 1 ;
}
public double computeLength ()
{
double length = 0 ;
for ( int i = 0 ; i < geometry_.length - 2 ; i += 2 ) {
length += Geometry.length ( geometry_ [ i+ 0 ] , geometry_ [ i+ 1 ] ,
geometry_ [ i+ 2 ] , geometry_ [ i+ 3 ]) ;
}
return length;
}
public double computeArea ()
{
return Geometry.computePolygonArea ( geometry_ ) ;
}
public void addLevel ()
{
int nLegs = geometry_.length / 2 - 1 ;
int nPoints = nLegs * 4 * 2 + 2 ;
double [] geometry = new double [ nPoints ] ;
int j = 0 ;
for ( int i = 0 ; i < nLegs* 2 ; i += 2 ) {
geometry [ j+ 0 ] = geometry_ [ i+ 0 ] ;
geometry [ j+ 1 ] = geometry_ [ i+ 1 ] ;
double [] v0 = Geometry.computePointOnLine ( geometry_ [ i+ 0 ] ,
geometry_ [ i+ 1 ] ,
geometry_ [ i+ 2 ] ,
geometry_ [ i+ 3 ] ,
1.0 / 3.0 ) ;
geometry [ j+ 2 ] = v0 [ 0 ] ;
geometry [ j+ 3 ] = v0 [ 1 ] ;
double [] v1 = Geometry.computePointOnLine ( geometry_ [ i+ 0 ] ,
geometry_ [ i+ 1 ] ,
geometry_ [ i+ 2 ] ,
geometry_ [ i+ 3 ] ,
2.0 / 3.0 ) ;
geometry [ j+ 6 ] = v1 [ 0 ] ;
geometry [ j+ 7 ] = v1 [ 1 ] ;
double length = Geometry.length ( v0 [ 0 ] , v0 [ 1 ] , v1 [ 0 ] , v1 [ 1 ]) ;
double dx = geometry_ [ i+ 2 ] - geometry_ [ i+ 0 ] ;
double dy = geometry_ [ i+ 3 ] - geometry_ [ i+ 1 ] ;
double l = Math.sqrt ( dx * dx + dy * dy ) ;
double angle = Math.acos ( dx / l ) ;
if ( dy < 0 ) angle = 2.0 * Math.PI - angle;
angle -= Math.PI / 3.0 ;
geometry [ j+ 4 ] = geometry [ j+ 2 ] + length * Math.cos ( angle ) ;
geometry [ j+ 5 ] = geometry [ j+ 3 ] + length * Math.sin ( angle ) ;
j+= 8 ;
}
geometry [ geometry.length- 2 ] = geometry [ 0 ] ;
geometry [ geometry.length- 1 ] = geometry [ 1 ] ;
geometry_ = geometry;
redraw () ;
}
public void removeLevel ()
{
int nLegs = geometry_.length / 2 - 1 ;
if ( nLegs == 3 ) return ;
int nPoints = nLegs / 4 * 2 + 2 ;
double [] geometry = new double [ nPoints ] ;
int j = 0 ;
for ( int i = 0 ; i < geometry.length - 2 ; i += 2 ) {
geometry [ i+ 0 ] = geometry_ [ j+ 0 ] ;
geometry [ i+ 1 ] = geometry_ [ j+ 1 ] ;
j += 8 ;
}
geometry [ geometry.length- 2 ] = geometry [ 0 ] ;
geometry [ geometry.length- 1 ] = geometry [ 1 ] ;
geometry_ = geometry;
redraw () ;
}
public void draw ()
{
curve_.setGeometryXy ( geometry_ ) ;
}
}
public static void main ( String [] args )
{
new Demo20 () ;
}
}
G-GemometryGeneration.zip( 229 k)
Related examples in the same category