import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Path2D;
import java.awt.geom.PathIterator;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class ShapeIntersectionTest
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
JFrame f = new JFrame();
PaintPanel paintPanel = new PaintPanel();
f.getContentPane().add(paintPanel);
f.setSize(600,600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
});
}
}
class PaintPanel extends JPanel implements MouseMotionListener
{
private Shape shape;
private Point2D p0;
private Point2D p1;
private List<Point2D> intersections = new ArrayList<Point2D>();
public PaintPanel()
{
addMouseMotionListener(this);
Path2D path = new Path2D.Float();
path.moveTo(200,200);
path.lineTo(300,200);
path.lineTo(250,250);
path.lineTo(300,300);
path.lineTo(200,300);
path.closePath();
AffineTransform at = AffineTransform.getRotateInstance(0.2, 120, 280);
Shape s = at.createTransformedShape(new Ellipse2D.Double(100,250, 40, 80));
path.append(s, false);
shape = path;
p0 = new Point2D.Float(220, 220);
p1 = new Point2D.Float(320, 220);
}
@Override
protected void paintComponent(Graphics gr)
{
super.paintComponent(gr);
Graphics2D g = (Graphics2D)gr;
g.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.BLACK);
g.draw(shape);
g.drawString("Intersections:", 10, 20);
for (int i=0; i<intersections.size(); i++)
{
g.drawString(String.valueOf(intersections.get(i)), 10, 40+i*20);
}
g.setColor(Color.BLUE);
paint(g, p0);
paint(g, p1);
g.draw(new Line2D.Float(p0, p1));
for (Point2D intersection : intersections)
{
g.setColor(Color.RED);
paint(g, intersection);
}
}
private static void paint(Graphics g, Point2D p)
{
int x = (int)p.getX();
int y = (int)p.getY();
g.drawOval(x-2, y-2, 5, 5);
}
@Override
public void mouseDragged(MouseEvent e)
{
}
@Override
public void mouseMoved(MouseEvent e)
{
p0.setLocation(e.getPoint());
intersections.clear();
PathIterator pi = shape.getPathIterator(null, 0.1);
double coords[] = new double[6];
Point2D firstPoint = new Point2D.Double();
Point2D previousPoint = new Point2D.Double();
Point2D intersection = null;
while (!pi.isDone())
{
switch (pi.currentSegment(coords))
{
case PathIterator.SEG_MOVETO:
firstPoint.setLocation(coords[0], coords[1]);
previousPoint.setLocation(firstPoint);
break;
case PathIterator.SEG_LINETO:
intersection = Intersection.computeIntersectionSegmentSegment(
previousPoint.getX(), previousPoint.getY(),
coords[0], coords[1],
p0.getX(), p0.getY(),
p1.getX(), p1.getY());
previousPoint.setLocation(coords[0], coords[1]);
if (intersection != null)
{
intersections.add(intersection);
}
break;
case PathIterator.SEG_CLOSE:
intersection = Intersection.computeIntersectionSegmentSegment(
previousPoint.getX(), previousPoint.getY(),
firstPoint.getX(), firstPoint.getY(),
p0.getX(), p0.getY(),
p1.getX(), p1.getY());
previousPoint.setLocation(coords[0], coords[1]);
if (intersection != null)
{
intersections.add(intersection);
}
break;
}
pi.next();
}
repaint();
}
}