Added resizing and scrolling

Still buggs while dragging scaled.
This commit is contained in:
xrgman
2015-03-16 19:36:03 +01:00
parent dccdccb573
commit c3ca87ad8f
7 changed files with 261 additions and 245 deletions
+118 -7
View File
@@ -1,9 +1,12 @@
package Applicatie;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
@@ -14,12 +17,24 @@ public class DrawObject {
Point2D position;
double rotation;
double scale;
Image image;
private Image image;
private Image rotateImage;
protected boolean selected;
private Rectangle2D rektAngle;
private Rectangle2D upperLeftCorner;
private Rectangle2D upperRightCorner;
private Rectangle2D bottomLeftCorner;
private Rectangle2D bottomRightCorner;
private Ellipse2D rotateDot;
static final int UPPERLEFT = 0;
static final int UPPERRIGHT = 1;
static final int BOTTOMLEFT = 2;
static final int BOTTOMRIGHT = 3;
public DrawObject(String filename, Point2D position)
{
image = new ImageIcon(filename).getImage();
rotateImage = new ImageIcon("rotate.png").getImage();
scale = 1;
rotation = 0;
this.position = position;
@@ -29,6 +44,26 @@ public class DrawObject {
{
AffineTransform tx = getTransform();
g.drawImage(image, tx, null);
if(selected) {
g.setColor(Color.BLACK);
g.setStroke(new BasicStroke(7));
rektAngle = new Rectangle2D.Double((int) position.getX(), (int) position.getY(), image.getWidth(null), image.getHeight(null));
tx = getTransformRectangle();
rektAngle.setFrame(tx.createTransformedShape(rektAngle).getBounds());
g.draw(rektAngle);
g.setColor(Color.YELLOW);
upperLeftCorner = new Rectangle2D.Double(rektAngle.getX()-7,rektAngle.getY()-7,15,15);
upperRightCorner = new Rectangle2D.Double(rektAngle.getX() + rektAngle.getWidth()-8,rektAngle.getY()-7,15,15);
bottomLeftCorner = new Rectangle2D.Double(rektAngle.getX()-7,rektAngle.getY() + rektAngle.getHeight()-8,15,15);
bottomRightCorner = new Rectangle2D.Double(rektAngle.getX() + rektAngle.getWidth()-8,rektAngle.getY() + rektAngle.getHeight()-8,15,15);
g.fill(upperLeftCorner); //upperleft
g.fill(upperRightCorner); //upperright
g.fill(bottomLeftCorner); //bottomleft
g.fill(bottomRightCorner); //bottomright
g.setColor(Color.RED);
rotateDot = new Ellipse2D.Double((rektAngle.getX() + (rektAngle.getWidth()/2))-8,rektAngle.getY()-8,15,15);
g.fill(rotateDot);
}
}
protected AffineTransform getTransform() {
@@ -38,14 +73,83 @@ public class DrawObject {
tx.rotate(Math.toRadians(rotation), image.getWidth(null) / 2, image.getHeight(null) / 2);
return tx;
}
protected AffineTransform getTransformSelection() {
AffineTransform tx = new AffineTransform();
tx.scale(scale, scale);
tx.translate(position.getX(), position.getY());
return tx;
}
public boolean contains(Point2D clickPoint) {
Shape shape = new Rectangle2D.Double(0,0,image.getWidth(null), image.getHeight(null));
return getTransform().createTransformedShape(shape).contains(clickPoint);
/**
* Special transformation for the selection rectangle, because the translation of the image one places the rectangle translated from the image.
* @return affineTransform
*/
private AffineTransform getTransformRectangle() {
AffineTransform tx = new AffineTransform();
tx.scale(scale, scale);
return tx;
}
public void setSelected(boolean b)
{
public boolean contains(Point2D clickPoint) {
Shape shape;
if(rektAngle == null) {
shape = new Rectangle2D.Double(0,0,image.getWidth(null), image.getHeight(null));
return getTransform().createTransformedShape(shape).contains(clickPoint);
}
else {
shape = new Rectangle2D.Double(-7,-7,image.getWidth(null)+7, image.getHeight(null)+7);
return getTransformSelection().createTransformedShape(shape).contains(clickPoint);
}
}
public Point2D getObjectPoint(Point2D point) {
try {
return getTransform().inverseTransform(point, null);
} catch (NoninvertibleTransformException e) {
e.printStackTrace();
}
return null;
}
/**
* This method checks if the place thats clicked is inside one of the corners.
*
* @param point
* @param corner
* @return if the clicked point is inside one of the corners
*/
public boolean containsCorner(Point2D point, int corner) {
Rectangle2D chosenCorner = null;
switch(corner) {
case 0:
chosenCorner = upperLeftCorner;
break;
case 1:
chosenCorner = upperRightCorner;
break;
case 2:
chosenCorner = bottomLeftCorner;
break;
case 3:
chosenCorner = bottomRightCorner;
break;
case 4:
if(point.getX() > rotateDot.getX() && point.getX() < rotateDot.getX() + rotateDot.getWidth()
&& point.getY() > rotateDot.getY() && point.getY() < rotateDot.getY() + rotateDot.getHeight())
return true;
else
return false;
}
if(point.getX() > chosenCorner.getX() && point.getX() < chosenCorner.getX() + chosenCorner.getWidth()
&& point.getY() > chosenCorner.getY() && point.getY() < chosenCorner.getY() + chosenCorner.getHeight())
return true;
else
return false;
}
public void setSelected(boolean b) {
selected = b;
}
@@ -85,5 +189,12 @@ public class DrawObject {
return selected;
}
public Rectangle2D getRectangle() {
return rektAngle;
}
public void setRectangle(Rectangle2D rectangle) {
rektAngle = rectangle;
}
}