Added single chain link resolution and many debug prints and commented out blocks of code

This commit is contained in:
2025-05-21 02:40:24 -04:00
parent be12cf26e0
commit c101c2e1dd
2 changed files with 928 additions and 195 deletions

View File

File diff suppressed because it is too large Load Diff

View File

@@ -18,8 +18,10 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.Set;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JPanel; import javax.swing.JPanel;
@@ -178,7 +180,7 @@ public class MeshingTest2 extends JPanel {
private static void test( final Collection< Plane > planes ) { private static void test( final Collection< Plane > planes ) {
final long processAllStart = System.currentTimeMillis(); final long processAllStart = System.currentTimeMillis();
planes.parallelStream().forEach( plane -> { planes.stream().forEach( plane -> {
try { try {
Mesh< RegionSimple > mesh = new Mesh< RegionSimple >( () -> { return new RegionSimple( GluWindingRule.ODD ); } ); Mesh< RegionSimple > mesh = new Mesh< RegionSimple >( () -> { return new RegionSimple( GluWindingRule.ODD ); } );
@@ -188,7 +190,7 @@ public class MeshingTest2 extends JPanel {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
mesh.simplify(); mesh.simplify();
mesh.generateRegions(); mesh.generateRegions();
final Collection< EdgePolygon > polys = mesh.copyOf().mesh(); final Collection< EdgePolygon > polys = mesh.copyOf().mesh( false );
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
System.out.println( plane.polygons.size() + " to " + polys.size() + ":\t " + ( end - start ) + "ms" ); System.out.println( plane.polygons.size() + " to " + polys.size() + ":\t " + ( end - start ) + "ms" );
} catch ( IllegalStateException e ) { } catch ( IllegalStateException e ) {
@@ -263,7 +265,7 @@ public class MeshingTest2 extends JPanel {
// Make sure this works // Make sure this works
mesh = mesh.copyOf(); mesh = mesh.copyOf();
final Collection< EdgePolygon > polys = mesh.mesh(); final Collection< EdgePolygon > polys = mesh.mesh( false );
chains = mesh.chains; chains = mesh.chains;
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
System.out.println( "Took " + ( end - start ) + "ms" ); System.out.println( "Took " + ( end - start ) + "ms" );
@@ -278,20 +280,138 @@ public class MeshingTest2 extends JPanel {
private static Collection< EdgePolygon > test() { private static Collection< EdgePolygon > test() {
Mesh< RegionSimple > mesh = new Mesh< RegionSimple >( () -> { return new RegionSimple( GluWindingRule.ODD ); } ); Mesh< RegionSimple > mesh = new Mesh< RegionSimple >( () -> { return new RegionSimple( GluWindingRule.ODD ); } );
mesh.addPolygon( new Polygon( Arrays.asList( // mesh.addPolygon( new Polygon( Arrays.asList(
new Point( -1, 0 ), // new Point( -1, 0 ),
new Point( 1, -2 ), // new Point( 1, -2 ),
new Point( 1, -1 ), // new Point( 1, -1 ),
new Point( 2, -1 ), // new Point( 2, -1 ),
new Point( 1, 0 ), // new Point( 1, 0 ),
new Point( 1, 1 ) // new Point( 1, 1 )
) ), RegionRuleWinding.CLOCKWISE ); // ) ), RegionRuleWinding.CLOCKWISE );
// mesh.addPolygon( new Polygon( Arrays.asList(
// new Point( 0, 0 ),
// new Point( 5, 0 ),
// new Point( 5, 1 ),
// new Point( 4, 1 ),
// new Point( 4, 2 ),
// new Point( 3, 2 ),
// new Point( 3, 3 ),
// new Point( 2, 3 ),
// new Point( 2, 4 ),
// new Point( 0, 4 )
// ) ), RegionRuleWinding.CLOCKWISE );
// mesh.addPolygon( new Polygon( Arrays.asList(
// new Point( 0, 0 ),
// new Point( 2, 0 ),
// new Point( 2, 1 ),
// new Point( 1, 1 ),
// new Point( 1, 2 ),
// new Point( 2, 2 ),
// new Point( 2, 4 ),
// new Point( 1, 4 ),
// new Point( 1, 3 ),
// new Point( 0, 3 )
// ) ), RegionRuleWinding.CLOCKWISE );
// mesh.addPolygon( new Polygon( Arrays.asList(
// new Point( 0, 0 ),
// new Point( 3, 0 ),
// new Point( 3, 1 ),
// new Point( 4, 1 ),
// new Point( 4, 2 ),
// new Point( 2, 2 ),
// new Point( 2, 1 ),
// new Point( 1, 1 ),
// new Point( 0, 1 )
// ) ), RegionRuleWinding.CLOCKWISE );
// mesh.addPolygon( new Polygon( Arrays.asList(
// new Point( 0, 0 ),
// new Point( 2, 0 ),
// new Point( 2, 1 ),
// new Point( 3, 1 ),
// new Point( 3, 2 ),
// new Point( 2, 2 ),
// new Point( 2, 5 ),
// new Point( 1, 5 ),
// new Point( 1, 7 ),
// new Point( 0, 7 ),
// new Point( 0, 4 ),
// new Point( 1, 4 ),
// new Point( 1, 1 ),
// new Point( 0, 1 )
// ) ), RegionRuleWinding.CLOCKWISE );
// mesh.addPolygon( new Polygon( Arrays.asList(
// new Point( 1, 0 ),
// new Point( 6, 0 ),
// new Point( 6, 1 ),
// new Point( 4, 1 ),
// new Point( 4, 2 ),
// new Point( 2, 2 ),
// new Point( 2, 3 ),
// new Point( 0, 3 ),
// new Point( 0, 1 ),
// new Point( 1, 1 )
// ) ), RegionRuleWinding.CLOCKWISE );
// mesh.addPolygon( new Polygon( Arrays.asList(
// new Point( 3, 1 ),
// new Point( 3, 0 ),
// new Point( 10, 0 ),
// new Point( 10, 6 ),
// new Point( 9, 6 ),
// new Point( 9, 4 ),
// new Point( 8, 4 ),
// new Point( 8, 3 ),
// new Point( 5, 3 ),
// new Point( 5, 2 ),
// new Point( 0, 2 ),
// new Point( 0, 1 )
// ) ), RegionRuleWinding.CLOCKWISE );
// mesh.addPolygon( new Polygon( Arrays.asList(
// new Point( 7, 2 ),
// new Point( 9, 2 ),
// new Point( 9, 3 ),
// new Point( 7, 3 )
// ) ), RegionRuleWinding.CLOCKWISE );
// mesh.addPolygon( new Polygon( Arrays.asList(
// new Point( 0, 0 ),
// new Point( 6, 1 ),
// new Point( 7, 2 ),
// new Point( 1, 1 )
// ) ), RegionRuleWinding.CLOCKWISE );
// mesh.addPolygon( new Polygon( Arrays.asList(
// new Point( 2, 2 ),
// new Point( 8, 3 ),
// new Point( 9, 4 ),
// new Point( 3, 3 )
// ) ), RegionRuleWinding.CLOCKWISE );
// mesh.addPolygon( new Polygon( Arrays.asList(
// new Point( 2.816104467407629, -3.7472939407853763 ),
// new Point( 2.815383313894849, -2.9972942874937156 ),
// new Point( 2.0028836894955497, -2.9980755371325607 ),
// new Point( 2.0036048430083304, -3.7480751904242213 )
// ) ), RegionRuleWinding.CLOCKWISE );
// mesh.addPolygon( new Polygon( Arrays.asList(
// new Point( 2.8144217758778085, -1.9972947497715015 ),
// new Point( 2.0019221514785093, -1.998075999410347 ),
// new Point( 2.00264330499129, -2.748075652702007 ),
// new Point( 2.8151429293905887, -2.747294403063162 )
// ) ), RegionRuleWinding.CLOCKWISE );
mesh.simplify(); mesh.simplify();
mesh.generateRegions(); mesh.generateRegions();
final Collection< EdgePolygon > polys = mesh.mesh(); try {
final Collection< EdgePolygon > polys = mesh.mesh( false );
chains = mesh.chains;
return polys;
} catch ( Exception e ) {
e.printStackTrace();
}
final Collection< EdgePolygon > polys = mesh.mesh( true );
chains = mesh.chains; chains = mesh.chains;
return polys; return polys;
@@ -492,9 +612,13 @@ public class MeshingTest2 extends JPanel {
g.drawLine( 0, ( int ) ( scale * centerY ) + offsetY, getWidth(), ( int ) ( scale * centerY ) + offsetY ); g.drawLine( 0, ( int ) ( scale * centerY ) + offsetY, getWidth(), ( int ) ( scale * centerY ) + offsetY );
g.setColor( Color.BLACK ); g.setColor( Color.BLACK );
int highestX = 40;
if ( data != null ) { if ( data != null ) {
Collection< Vertex > polygons = data; Collection< Vertex > polygons = data;
highestX = ( int ) ( polygons.parallelStream()
.max( ( a, b ) -> { return Double.compare( a.getPosition().getX(), b.getPosition().getX() ); } ).get().getPosition().getX() + 40.5 );
EdgeSet edges = new EdgeSet(); EdgeSet edges = new EdgeSet();
for ( Vertex vert : polygons ) { for ( Vertex vert : polygons ) {
for ( HalfEdge edge : vert ) { for ( HalfEdge edge : vert ) {
@@ -502,9 +626,9 @@ public class MeshingTest2 extends JPanel {
Point p1 = edge.getOrigin().getPosition(); Point p1 = edge.getOrigin().getPosition();
Point p2 = edge.getDest().getPosition(); Point p2 = edge.getDest().getPosition();
g.drawLine( g.drawLine(
( int ) ( ( centerX + p1.getX() + 40 ) * scale ) + offsetX, ( int ) ( ( centerX + p1.getX() + highestX ) * scale ) + offsetX,
( int ) ( ( centerY - p1.getY() ) * scale ) + offsetY, ( int ) ( ( centerY - p1.getY() ) * scale ) + offsetY,
( int ) ( ( centerX + p2.getX() + 40 ) * scale ) + offsetX, ( int ) ( ( centerX + p2.getX() + highestX ) * scale ) + offsetX,
( int ) ( ( centerY - p2.getY() ) * scale ) + offsetY ( int ) ( ( centerY - p2.getY() ) * scale ) + offsetY
); );
} }
@@ -513,7 +637,7 @@ public class MeshingTest2 extends JPanel {
final double diff = scale * 0.15; final double diff = scale * 0.15;
final Point point = vert.getPosition(); final Point point = vert.getPosition();
g.setColor( Color.BLACK ); g.setColor( Color.BLACK );
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 ) ); g.drawRect( ( int ) ( ( centerX + point.getX() + highestX ) * scale ) - ( int ) diff + offsetX, ( int ) ( ( centerY - point.getY() ) * scale ) - ( int ) diff + offsetY, ( int ) ( diff * 2 ), ( int ) ( diff * 2 ) );
} }
} }
@@ -521,9 +645,11 @@ public class MeshingTest2 extends JPanel {
g.setColor( Color.BLACK ); g.setColor( Color.BLACK );
int count = 2; int count = 2;
Random random = new Random( hashCode() ); Random random = new Random( hashCode() );
for ( final EdgePolygon p : polygons ) { for ( final EdgePolygon p : polygons ) {
final Collection< HalfEdge > edges = p.getEdges(); final Collection< HalfEdge > edges = p.getEdges();
final Set< Vertex > verts = new HashSet< Vertex >();
g.setColor( Color.BLACK ); g.setColor( Color.BLACK );
for ( HalfEdge edge : edges ) { for ( HalfEdge edge : edges ) {
Point p1 = edge.getOrigin().getPosition(); Point p1 = edge.getOrigin().getPosition();
@@ -541,6 +667,11 @@ public class MeshingTest2 extends JPanel {
( int ) ( ( centerX + p2.getX() ) * scale ) + offsetX, ( int ) ( ( centerX + p2.getX() ) * scale ) + offsetX,
( int ) ( ( centerY - p2.getY() - 150 ) * scale ) + offsetY ( int ) ( ( centerY - p2.getY() - 150 ) * scale ) + offsetY
); );
final double diff = scale * 0.15;
if ( !verts.add( edge.getOrigin() ) ) {
g.drawRect( ( int ) ( ( centerX + p1.getX() + count * 25 ) * scale ) - ( int ) diff + offsetX, ( int ) ( ( centerY - p1.getY() - 150 ) * scale ) - ( int ) diff + offsetY, ( int ) ( diff * 2 ), ( int ) ( diff * 2 ) );
}
} }
count++; count++;
@@ -548,11 +679,22 @@ public class MeshingTest2 extends JPanel {
int[] xPoints = new int[ size ]; int[] xPoints = new int[ size ];
int[] yPoints = new int[ size ]; int[] yPoints = new int[ size ];
final Set< Vertex > verts2 = new HashSet< Vertex >();
HalfEdge edge = edges.iterator().next(); HalfEdge edge = edges.iterator().next();
for ( int i = 0; i < edges.size(); ++i ) { for ( int i = 0; i < edges.size(); ++i ) {
final Point point = edge.getOrigin().getPosition(); final Point point = edge.getOrigin().getPosition();
xPoints[ i ] = ( int ) ( ( centerX + point.getX() ) * scale ) + offsetX; xPoints[ i ] = ( int ) ( ( centerX + point.getX() ) * scale ) + offsetX;
yPoints[ i ] = ( int ) ( ( centerY - point.getY() ) * scale ) + offsetY; yPoints[ i ] = ( int ) ( ( centerY - point.getY() ) * scale ) + offsetY;
final double diff = scale * 0.15;
if ( !verts2.add( edge.getOrigin() ) ) {
g.setColor( Color.ORANGE );
} else {
g.setColor( Color.BLACK );
}
g.drawRect( ( int ) ( ( centerX + point.getX() + highestX ) * scale ) - ( int ) diff + offsetX, ( int ) ( ( centerY - point.getY() ) * scale ) - ( int ) diff + offsetY, ( int ) ( diff * 2 ), ( int ) ( diff * 2 ) );
edge = edge.getNext(); edge = edge.getNext();
} }
@@ -562,16 +704,30 @@ public class MeshingTest2 extends JPanel {
} }
if ( chains != null ) { if ( chains != null ) {
int i = 0;
for ( Chain chain : chains ) { for ( Chain chain : chains ) {
Point p1 = chain.getOrigin().getPosition(); Point p1 = chain.getOrigin().getPosition();
Point p2 = chain.getDest().getPosition(); Point p2 = chain.getDest().getPosition();
g.setColor( Color.RED ); g.setColor( Color.RED );
g.drawLine( g.drawLine(
( int ) ( ( centerX + p1.getX() + 40 ) * scale ) + offsetX, ( int ) ( ( centerX + p1.getX() + highestX ) * scale ) + offsetX + i,
( int ) ( ( centerY - p1.getY() ) * scale ) + offsetY, ( int ) ( ( centerY - p1.getY() ) * scale ) + offsetY + i,
( int ) ( ( centerX + p2.getX() + 40 ) * scale ) + offsetX, ( int ) ( ( centerX + p2.getX() + highestX ) * scale ) + offsetX + i,
( int ) ( ( centerY - p2.getY() ) * scale ) + offsetY ( int ) ( ( centerY - p2.getY() ) * scale ) + offsetY + i
); );
// for ( HalfEdge e : chain.getLinks() ) {
// Point e1 = e.getOrigin().getPosition();
// Point e2 = e.getSym().getOrigin().getPosition();
// g.setColor( Color.BLUE );
// g.drawLine(
// ( int ) ( ( centerX + e1.getX() + 40 ) * scale ) + offsetX + i + 1,
// ( int ) ( ( centerY - e1.getY() ) * scale ) + offsetY + i + 1,
// ( int ) ( ( centerX + e2.getX() + 40 ) * scale ) + offsetX + i + 1,
// ( int ) ( ( centerY - e2.getY() ) * scale ) + offsetY + i + 1
// );
// }
// i += 2;
} }
} }