Java examples for 2D Graphics:Line
intersect Line2D and Shape
/* ------------------------------------------------------------------------ * PlantUML : a free UML diagram generator * ------------------------------------------------------------------------ * * (C) Copyright 2009, Arnaud Roques//from w w w . j a v a 2s .co m * * Project Info: http://plantuml.sourceforge.net * * This file is part of PlantUML. * * PlantUML is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PlantUML distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * Original Author: Arnaud Roques * * Revision $Revision: 4236 $ * */ import java.awt.Shape; import java.awt.geom.CubicCurve2D; import java.awt.geom.Line2D; import java.awt.geom.Point2D; public class Main { public static Point2D intersect(Line2D.Double orig, Shape shape) { final Line2D.Double copy = new Line2D.Double(orig.x1, orig.y1, orig.x2, orig.y2); final boolean contains1 = shape.contains(copy.x1, copy.y1); final boolean contains2 = shape.contains(copy.x2, copy.y2); if (contains1 ^ contains2 == false) { // return new Point2D.Double(orig.x2, orig.y2); throw new IllegalArgumentException(); } while (true) { final double mx = (copy.x1 + copy.x2) / 2; final double my = (copy.y1 + copy.y2) / 2; final boolean containsMiddle = shape.contains(mx, my); if (contains1 == containsMiddle) { copy.x1 = mx; copy.y1 = my; } else { copy.x2 = mx; copy.y2 = my; } if (dist(copy) < 0.1) { if (contains1) { return new Point2D.Double(copy.x2, copy.y2); } if (contains2) { return new Point2D.Double(copy.x1, copy.y1); } throw new IllegalStateException(); } } } static double dist(CubicCurve2D.Double seg) { return Point2D.distance(seg.x1, seg.y1, seg.x2, seg.y2); } static double dist(Line2D.Double seg) { return Point2D.distance(seg.x1, seg.y1, seg.x2, seg.y2); } }