package open.dolphin.impl.scheam.holder; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.awt.geom.PathIterator; import java.awt.geom.Rectangle2D; /** * * @author Minagawa, Kazushi */ public class Line2DHolder implements DrawingHolder { private final Line2D.Double line2D; private final Stroke stroke; private final Paint paint; private final AlphaComposite ac; private boolean p1; private boolean p2; public Line2DHolder(Line2D.Double line2D, Stroke stroke, Paint paint, AlphaComposite ac) { this.line2D = line2D; this.stroke = stroke; this.paint = paint; this.ac = ac; } @Override public boolean contains(Point p) { p1 = false; p2 = false; Rectangle2D r = getRectangle2D(p); if (isAtP1(r)) { p1 = true; return true; } if (isAtP2(r)) { p2 = true; return true; } if (line2D.intersects(r)) { return true; } return false; } @Override public void draw(Graphics2D g2d) { g2d.setStroke(stroke); g2d.setPaint(paint); g2d.setComposite(ac); g2d.draw(line2D); } @Override public void translate(double x, double y) { double x1 = line2D.getX1() + x; double y1 = line2D.getY1() + y; double x2 = line2D.getX2() + x; double y2 = line2D.getY2() + y; line2D.setLine(x1, y1, x2, y2); } /* public void translate(double x, double y) { double x1 = line2D.getX1(); double y1 = line2D.getY1(); double x2 = line2D.getX2(); double y2 = line2D.getY2(); if (p1) { x1 = line2D.getX1() + x; y1 = line2D.getY1() + y; } else if (p2) { x2 = line2D.getX2() + x; y2 = line2D.getY2() + y; } else { x1 = line2D.getX1() + x; y1 = line2D.getY1() + y; x2 = line2D.getX2() + x; y2 = line2D.getY2() + y; } line2D.setLine(x1, y1, x2, y2); } */ private boolean isAtP1(Rectangle2D r) { return r.contains(line2D.getP1()); } private boolean isAtP2(Rectangle2D r) { return r.contains(line2D.getP2()); } private Rectangle2D getRectangle2D(Point p) { Rectangle2D r = new Rectangle2D.Double(); r.setFrameFromDiagonal(p.getX() - 3,p.getY() -3, p.getX() +3, p.getY() + 3); return r; } private void transform(AffineTransform trans) { double[] coords = new double[6]; double x1=0; double y1=0; double x2=0; double y2=0; PathIterator iter = line2D.getPathIterator(trans); while(!iter.isDone()) { int ret = iter.currentSegment(coords); if (ret == PathIterator.SEG_MOVETO) { x1 = coords[0]; y1 = coords[1]; } else if (ret == PathIterator.SEG_LINETO) { x2 = coords[0]; y2 = coords[1]; } iter.next(); } line2D.setLine(x1, y1, x2, y2); } @Override public void rotate(double theta) { //WIND_EVEN_ODD = 0; //WIND_NON_ZERO = 1; //SEG_MOVETO = 0; //SEG_LINETO = 1; //SEG_QUADTO = 2; //SEG_CUBICTO = 3; //SEG_CLOSE = 4; AffineTransform trans = AffineTransform.getRotateInstance(theta); transform(trans); } @Override public void expand(double sx, double sy) { AffineTransform expand = AffineTransform.getScaleInstance(sx, sy); transform(expand); } }