Fixed monotone partioning and finished triangulation algorithm
Removed a lot of debug code Added comments Fixed partition monotone not setting the vertex after unlinking edges Added some better java awt stuff Added a method to copy meshes
This commit is contained in:
@@ -1,7 +1,16 @@
|
||||
package com.aaaaahhhhhhh.bananapuncher714.minietest;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.MouseInfo;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseWheelEvent;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
@@ -11,13 +20,13 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.Random;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.Timer;
|
||||
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
@@ -52,12 +61,13 @@ public class MeshingTest2 extends JPanel {
|
||||
// private int centerX = 600;
|
||||
// private int centerY = 400;
|
||||
|
||||
private int centerX = 400;
|
||||
private int centerY = 100;
|
||||
private int offsetX = windowWidth >> 1;
|
||||
private int offsetY = windowHeight >> 1;
|
||||
|
||||
private double centerX = 0;
|
||||
private double centerY = 0;
|
||||
|
||||
private Graphics g;
|
||||
|
||||
private int scale = 8;
|
||||
private double scale = 8;
|
||||
|
||||
private Collection< Vertex > data;
|
||||
private Collection< EdgePolygon > polygons;
|
||||
@@ -78,14 +88,24 @@ public class MeshingTest2 extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
// Select a random plane to draw
|
||||
// draw = planes.get( new Random().nextInt( planes.size() ) );
|
||||
|
||||
// test( planes );
|
||||
System.out.println( "Draw is " + draw );
|
||||
// Attempt to mesh all planes
|
||||
// try {
|
||||
// test( planes );
|
||||
// } catch ( PolygonException e ) {
|
||||
// draw = e.getPlane();
|
||||
// System.out.println( "Draw is now " + draw );
|
||||
// }
|
||||
|
||||
final Collection< Vertex > data = process( draw );
|
||||
final Collection< EdgePolygon > polys = triangulate( draw );
|
||||
// final Collection< EdgePolygon > polys = test();
|
||||
|
||||
System.out.println( "Polygon count: " + polys.size() );
|
||||
|
||||
SwingUtilities.invokeLater( new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@@ -134,7 +154,6 @@ public class MeshingTest2 extends JPanel {
|
||||
// Now that we have a bunch of bounding boxes, do whatever
|
||||
|
||||
MeshBuilder builder = new MeshBuilder();
|
||||
Plane draw = null;
|
||||
for ( AABB box : boxes ) {
|
||||
for ( Facet facet : generateFacetsFor( box ) ) {
|
||||
builder.addFacet( facet );
|
||||
@@ -144,26 +163,40 @@ public class MeshingTest2 extends JPanel {
|
||||
return builder.planes;
|
||||
}
|
||||
|
||||
public static class PolygonException extends RuntimeException {
|
||||
Plane plane;
|
||||
|
||||
PolygonException( Plane plane ) {
|
||||
this.plane = plane;
|
||||
}
|
||||
|
||||
Plane getPlane() {
|
||||
return plane;
|
||||
}
|
||||
}
|
||||
|
||||
private static void test( final Collection< Plane > planes ) {
|
||||
final long processAllStart = System.currentTimeMillis();
|
||||
planes.parallelStream().forEach( plane -> {
|
||||
try {
|
||||
Mesh< RegionSimple > mesh = new Mesh< RegionSimple >( () -> { return new RegionSimple( GluWindingRule.ODD ); } );
|
||||
|
||||
for ( Polygon poly : plane.polygons ) {
|
||||
mesh.addPolygon( poly, RegionRuleWinding.CLOCKWISE );
|
||||
}
|
||||
long start = System.currentTimeMillis();
|
||||
mesh.simplify();
|
||||
mesh.generateRegions();
|
||||
long end = System.currentTimeMillis();
|
||||
System.out.println( plane.polygons.size() + ":\t " + ( end - start ) + "ms" );
|
||||
} catch ( IllegalStateException e ) {
|
||||
e.printStackTrace();
|
||||
final long processAllStart = System.currentTimeMillis();
|
||||
planes.parallelStream().forEach( plane -> {
|
||||
try {
|
||||
Mesh< RegionSimple > mesh = new Mesh< RegionSimple >( () -> { return new RegionSimple( GluWindingRule.ODD ); } );
|
||||
|
||||
for ( Polygon poly : plane.polygons ) {
|
||||
mesh.addPolygon( poly, RegionRuleWinding.CLOCKWISE );
|
||||
}
|
||||
} );
|
||||
final long processAllEnd = System.currentTimeMillis();
|
||||
System.out.println( "Took " + ( processAllEnd - processAllStart ) + "ms to process " + planes.size() + " planes" );
|
||||
long start = System.currentTimeMillis();
|
||||
mesh.simplify();
|
||||
mesh.generateRegions();
|
||||
final Collection< EdgePolygon > polys = mesh.mesh();
|
||||
long end = System.currentTimeMillis();
|
||||
System.out.println( plane.polygons.size() + " to " + polys.size() + ":\t " + ( end - start ) + "ms" );
|
||||
} catch ( IllegalStateException e ) {
|
||||
e.printStackTrace();
|
||||
throw new PolygonException( plane );
|
||||
}
|
||||
} );
|
||||
final long processAllEnd = System.currentTimeMillis();
|
||||
System.out.println( "Took " + ( processAllEnd - processAllStart ) + "ms to process " + planes.size() + " planes" );
|
||||
}
|
||||
|
||||
private static Collection< Vertex > process( final Plane plane ) {
|
||||
@@ -226,6 +259,9 @@ public class MeshingTest2 extends JPanel {
|
||||
System.out.println( "After generating regions vertex count: " + mesh.getVertices().size() );
|
||||
System.out.println( "After generating regions edge count: " + ( mesh.getRuleSize() / 2 ) );
|
||||
|
||||
// Make sure this works
|
||||
mesh = mesh.copyOf();
|
||||
|
||||
final Collection< EdgePolygon > polys = mesh.mesh();
|
||||
long end = System.currentTimeMillis();
|
||||
System.out.println( "Took " + ( end - start ) + "ms" );
|
||||
@@ -360,6 +396,69 @@ public class MeshingTest2 extends JPanel {
|
||||
f = new JFrame( "Drawing Board" );
|
||||
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
|
||||
|
||||
final MouseAdapter adapter = new MouseAdapter() {
|
||||
private boolean dragging = false;
|
||||
private double initX, initY;
|
||||
private int dragX, dragY;
|
||||
private double scroll = Math.log( scale );
|
||||
|
||||
@Override
|
||||
public void mousePressed( MouseEvent e ) {
|
||||
dragging = true;
|
||||
|
||||
initX = centerX;
|
||||
initY = centerY;
|
||||
|
||||
dragX = e.getXOnScreen();
|
||||
dragY = e.getYOnScreen();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseReleased( MouseEvent e ) {
|
||||
dragging = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseDragged( MouseEvent e ) {
|
||||
if ( dragging ) {
|
||||
centerX = initX + ( ( e.getXOnScreen() - dragX ) / scale );
|
||||
centerY = initY + ( ( e.getYOnScreen() - dragY ) / scale );
|
||||
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseWheelMoved( MouseWheelEvent e ) {
|
||||
if ( e.getWheelRotation() < 0 ) {
|
||||
scroll += 0.5;
|
||||
} else {
|
||||
scroll -= 0.5;
|
||||
}
|
||||
scale = Math.exp( scroll );
|
||||
|
||||
repaint();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseMoved( MouseEvent e ) {
|
||||
super.mouseMoved( e );
|
||||
|
||||
repaint();
|
||||
}
|
||||
};
|
||||
|
||||
addMouseListener( adapter );
|
||||
addMouseMotionListener( adapter );
|
||||
addMouseWheelListener( adapter );
|
||||
|
||||
f.addComponentListener( new ComponentAdapter() {
|
||||
public void componentResized( ComponentEvent e ) {
|
||||
offsetX = getWidth() >> 1;
|
||||
offsetY = getHeight() >> 1;
|
||||
};
|
||||
} );
|
||||
|
||||
f.add( this );
|
||||
|
||||
f.setSize( windowWidth, windowHeight );
|
||||
@@ -369,10 +468,6 @@ public class MeshingTest2 extends JPanel {
|
||||
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
|
||||
}
|
||||
|
||||
public void drawPoint( double x, double y ) {
|
||||
g.fillRect( ( int ) x * scale, ( int ) y * scale, scale, scale );
|
||||
}
|
||||
|
||||
private static Vector2d rotate( Vector2d a, double angle ) {
|
||||
double cos = Math.cos( angle );
|
||||
double sin = Math.sin( angle );
|
||||
@@ -384,30 +479,15 @@ public class MeshingTest2 extends JPanel {
|
||||
@Override
|
||||
public void paintComponent( Graphics g ) {
|
||||
super.paintComponent( g );
|
||||
this.g = g;
|
||||
|
||||
g.setColor( new Color( 200, 200, 200 ) );
|
||||
g.drawLine( centerX, 0, centerX, 2000 );
|
||||
g.drawLine( 0, centerY, 2000, centerY );
|
||||
g.drawLine( ( int ) ( scale * centerX ) + offsetX, 0, ( int ) ( scale * centerX ) + offsetX, getHeight() );
|
||||
g.drawLine( 0, ( int ) ( scale * centerY ) + offsetY, getWidth(), ( int ) ( scale * centerY ) + offsetY );
|
||||
g.setColor( Color.BLACK );
|
||||
|
||||
if ( data != null ) {
|
||||
Collection< Vertex > polygons = data;
|
||||
|
||||
// Set< HalfEdge > positiveEdges = new HashSet< HalfEdge >();
|
||||
// Set< HalfEdge > negativeEdges = new HashSet< HalfEdge >();
|
||||
//
|
||||
// for ( Vertex v : polygons ) {
|
||||
// for ( HalfEdge e : v ) {
|
||||
// if ( Mesh.isPositive( e ) ) {
|
||||
// positiveEdges.add( e );
|
||||
// } else {
|
||||
// negativeEdges.add( e );
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
EdgeSet edges = new EdgeSet();
|
||||
for ( Vertex vert : polygons ) {
|
||||
for ( HalfEdge edge : vert ) {
|
||||
@@ -415,10 +495,10 @@ public class MeshingTest2 extends JPanel {
|
||||
Point p1 = edge.getOrigin().getPosition();
|
||||
Point p2 = edge.getDest().getPosition();
|
||||
g.drawLine(
|
||||
( int ) ( p1.getX() * scale ) + centerX,
|
||||
( int ) ( - p1.getY() * scale ) + centerY,
|
||||
( int ) ( p2.getX() * scale ) + centerX,
|
||||
( int ) ( - p2.getY() * scale ) + centerY
|
||||
( int ) ( ( centerX + p1.getX() + 40 ) * scale ) + offsetX,
|
||||
( int ) ( ( centerY - p1.getY() ) * scale ) + offsetY,
|
||||
( int ) ( ( centerX + p2.getX() + 40 ) * scale ) + offsetX,
|
||||
( int ) ( ( centerY - p2.getY() ) * scale ) + offsetY
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -426,36 +506,36 @@ public class MeshingTest2 extends JPanel {
|
||||
final double diff = scale * 0.15;
|
||||
final Point point = vert.getPosition();
|
||||
g.setColor( Color.BLACK );
|
||||
g.drawRect( ( int ) ( point.getX() * scale ) + centerX - ( int ) diff, ( int ) ( - point.getY() * scale ) + centerY - ( int ) diff, ( int ) ( diff * 2 ), ( int ) ( diff * 2 ) );
|
||||
g.drawRect( ( int ) ( ( centerX + point.getX() + 40 ) * scale ) - ( int ) diff + offsetX, ( int ) ( ( centerY - point.getY() ) * scale ) - ( int ) diff + offsetY, ( int ) ( diff * 2 ), ( int ) ( diff * 2 ) );
|
||||
}
|
||||
}
|
||||
|
||||
if ( polygons != null ) {
|
||||
// System.out.println( "Polygon count: " + polygons.size() );
|
||||
g.setColor( Color.BLACK );
|
||||
int count = 2;
|
||||
Random random = new Random( hashCode() );
|
||||
for ( final EdgePolygon p : polygons ) {
|
||||
final Collection< HalfEdge > edges = p.getEdges();
|
||||
|
||||
// g.setColor( Color.BLACK );
|
||||
// for ( HalfEdge edge : edges ) {
|
||||
// Point p1 = edge.getOrigin().getPosition();
|
||||
// Point p2 = edge.getDest().getPosition();
|
||||
// g.drawLine(
|
||||
// ( int ) ( p1.getX() * scale ) + centerX + ( 170 * count ),
|
||||
// ( int ) ( - p1.getY() * scale ) + centerY,
|
||||
// ( int ) ( p2.getX() * scale ) + centerX + ( 170 * count ),
|
||||
// ( int ) ( - p2.getY() * scale ) + centerY
|
||||
// );
|
||||
//
|
||||
// g.drawLine(
|
||||
// ( int ) ( p1.getX() * scale ) + centerX + 170,
|
||||
// ( int ) ( - p1.getY() * scale ) + centerY,
|
||||
// ( int ) ( p2.getX() * scale ) + centerX + 170,
|
||||
// ( int ) ( - p2.getY() * scale ) + centerY
|
||||
// );
|
||||
// }
|
||||
// count++;
|
||||
g.setColor( Color.BLACK );
|
||||
for ( HalfEdge edge : edges ) {
|
||||
Point p1 = edge.getOrigin().getPosition();
|
||||
Point p2 = edge.getDest().getPosition();
|
||||
g.drawLine(
|
||||
( int ) ( ( centerX + p1.getX() + count * 25 ) * scale ) + offsetX,
|
||||
( int ) ( ( centerY - p1.getY() - 150 ) * scale ) + offsetY,
|
||||
( int ) ( ( centerX + p2.getX() + count * 25 ) * scale ) + offsetX,
|
||||
( int ) ( ( centerY - p2.getY() - 150 ) * scale ) + offsetY
|
||||
);
|
||||
|
||||
g.drawLine(
|
||||
( int ) ( ( centerX + p1.getX() ) * scale ) + offsetX,
|
||||
( int ) ( ( centerY - p1.getY() - 150 ) * scale ) + offsetY,
|
||||
( int ) ( ( centerX + p2.getX() ) * scale ) + offsetX,
|
||||
( int ) ( ( centerY - p2.getY() - 150 ) * scale ) + offsetY
|
||||
);
|
||||
}
|
||||
count++;
|
||||
|
||||
int size = edges.size();
|
||||
int[] xPoints = new int[ size ];
|
||||
@@ -464,53 +544,21 @@ public class MeshingTest2 extends JPanel {
|
||||
HalfEdge edge = edges.iterator().next();
|
||||
for ( int i = 0; i < edges.size(); ++i ) {
|
||||
final Point point = edge.getOrigin().getPosition();
|
||||
xPoints[ i ] = ( int ) ( point.getX() * scale ) + centerX + 400;
|
||||
yPoints[ i ] = ( int ) ( - point.getY() * scale ) + centerY;
|
||||
xPoints[ i ] = ( int ) ( ( centerX + point.getX() ) * scale ) + offsetX;
|
||||
yPoints[ i ] = ( int ) ( ( centerY - point.getY() ) * scale ) + offsetY;
|
||||
edge = edge.getNext();
|
||||
}
|
||||
|
||||
g.setColor( new Color( ( int ) ( Math.random() * 0xFFFFFF ) ) );
|
||||
g.setColor( new Color( random.nextInt( 0x1000000 ) ) );
|
||||
g.fillPolygon( xPoints, yPoints, size );
|
||||
}
|
||||
|
||||
// g.setColor( Color.BLACK );
|
||||
// for ( final EdgePolygon p : polygons ) {
|
||||
// for ( final Vertex v : p.getVertices() ) {
|
||||
// final Point point = v.getPosition();
|
||||
//
|
||||
// double diff = scale * .3;
|
||||
// g.drawRect( 400 + ( int ) ( point.getX() * scale ) + centerX - ( int ) diff, ( int ) ( point.getY() * scale ) + centerY - ( int ) diff, ( int ) ( diff * 2 ), ( int ) ( diff * 2 ) );
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
// Point[] points = {
|
||||
// new Point( 0, -2 ),
|
||||
// new Point( 1.5, -3.0 ),
|
||||
// new Point( 0.0, -2.0 ),
|
||||
// new Point( 0.9545454545454546, -1.3636363636363638 ),
|
||||
// new Point( -0.8333333333333334, -1.0 ),
|
||||
// new Point( 0.8333333333333334, -1.0 ),
|
||||
// new Point( -0.5, 0.0 ),
|
||||
// new Point( 0.5, 0.0 ),
|
||||
// new Point( -0.16666666666666669, 1.0 ),
|
||||
// new Point( 0.16666666666666669, 1.0 ),
|
||||
// new Point( -0.16666666666666669, 1.0 ),
|
||||
// new Point( 1, 1 ),
|
||||
// new Point( -0.16666666666666669, 1.0 ),
|
||||
// new Point( 0, 1.5 ),
|
||||
// new Point( 0, 1.5 ),
|
||||
// new Point( 0.16666666666666669, 1.0 ),
|
||||
// new Point( -1, 2 ),
|
||||
// new Point( 1, 2 ),
|
||||
// };
|
||||
//
|
||||
// int size = points.length >> 1;
|
||||
// for ( int i = 0; i < size;i++ ) {
|
||||
// Point a = points[ i << 1 ];
|
||||
// Point b = points[ ( i << 1 ) + 1 ];
|
||||
//
|
||||
// g.drawLine( ( int ) ( a.x * scale ) + centerX, ( int ) ( a.y * scale ) + centerY, ( int ) ( b.x * scale ) + centerX, ( int ) ( b.y * scale ) + centerY );
|
||||
// }
|
||||
java.awt.Point p = MouseInfo.getPointerInfo().getLocation();
|
||||
p = new java.awt.Point( p.x - getLocation().x, p.y - getLocation().y );
|
||||
g.setColor( Color.RED );
|
||||
g.setFont( new Font( Font.MONOSPACED, Font.BOLD, 30 ) );
|
||||
g.drawString( "X: " + ( ( p.x - offsetX ) / scale - centerX ), 10, 30 );
|
||||
g.drawString( "Y: " + ( ( p.y - offsetY ) / scale - centerY ), 10, 60 );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user