package com.elsealabs.xshot.math; import java.awt.*; import java.util.ArrayList; import java.util.Arrays; /** * PointRectangle.java * * An extension of the Java implementation of the Rectangle shape * to include functionality not present in its original form. * * @author Connor Elsea * @version 1.0 */ public class PointRectangle extends Rectangle { private static final long serialVersionUID = 1L; private XPoint CornerUpperLeft; private XPoint CornerUpperRight; private XPoint CornerLowerLeft; private XPoint CornerLowerRight; private XPoint MiddleRight; private XPoint MiddleLeft; private XPoint MiddleUp; private XPoint MiddleDown; private ArrayList<XPoint> pointArray; public PointRectangle(int x, int y, int i, int j) { super(x, y, i, j); } public PointRectangle(Point pnew, Point pbef) { //rectFromPoint(pbef, pnew); // TODO: How to do constructor like this } public static PointRectangle rectFromPoint(Point pnew, Point pbef) { // TODO: Refact PointRectangle to make more beautiful /* Lower Right Quadrant */ if (pnew.x >= pbef.x && pnew.y >= pbef.y) { PointRectangle rec = new PointRectangle(pbef.x, pbef.y, pnew.x - pbef.x, pnew.y - pbef.y); rec.generateCornerPoints(pbef, pnew); rec.generateMidPoints(); return rec; } /* Upper Right Quadrant */ else if (pnew.x >= pbef.x && pnew.y <= pbef.y) { PointRectangle rec = new PointRectangle(pbef.x, pnew.y, pnew.x - pbef.x, pbef.y - pnew.y); rec.generateCornerPoints(pbef, pnew); rec.generateMidPoints(); return rec; } /* Upper Left Quadrant */ else if (pnew.x <= pbef.x && pnew.y <= pbef.y) { PointRectangle rec = new PointRectangle(pnew.x, pnew.y, pbef.x - pnew.x, pbef.y - pnew.y); rec.generateCornerPoints(pbef, pnew); rec.generateMidPoints(); return rec; } /* Lower Left Quadrant */ else if (pnew.x <= pbef.x && pnew.y >= pbef.y) { PointRectangle rec = new PointRectangle(pnew.x, pbef.y, pbef.x - pnew.x, pnew.y - pbef.y); rec.generateCornerPoints(pbef, pnew); rec.generateMidPoints(); return rec; } else { System.err.printf("\n\nPBEF:(%d, %d) PNEW:(%d, %d)\n\n", pbef.x, pbef.y, pnew.x, pnew.x); return null; } } public void generateMidPoints() { MiddleRight = CornerUpperRight.midPoint(CornerLowerRight); MiddleLeft = CornerUpperLeft.midPoint(CornerLowerLeft); MiddleUp = CornerUpperLeft.midPoint(CornerUpperRight); MiddleDown = CornerLowerLeft.midPoint(CornerLowerRight); } public void generateCornerPoints(Point pbef, Point pnew) { CornerUpperLeft = new XPoint(pbef.x, pbef.y); CornerUpperRight = new XPoint(pnew.x, pbef.y); CornerLowerLeft = new XPoint(pbef.x, pnew.y); CornerLowerRight = new XPoint(pnew.x, pnew.y); } public ArrayList<XPoint> getPointsAsArray() { if (pointArray == null) { pointArray = new ArrayList<XPoint>(Arrays.asList( CornerUpperRight, CornerUpperLeft, CornerLowerRight, CornerLowerLeft, MiddleRight, MiddleLeft, MiddleUp, MiddleDown )); } return pointArray; } public Point getCornerUpperLeft() { return CornerUpperLeft; } public Point getCornerUpperRight() { return CornerUpperRight; } public Point getCornerLowerLeft() { return CornerLowerLeft; } public Point getCornerLowerRight() { return CornerLowerRight; } public XPoint getMiddleRight() { return MiddleRight; } public XPoint getMiddleLeft() { return MiddleLeft; } public XPoint getMiddleUp() { return MiddleUp; } public XPoint getMiddleDown() { return MiddleDown; } }