/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package feuille.drawing.operation;
import java.util.ArrayList;
import java.util.List;
import feuille.drawing.lib.BSpline;
import feuille.drawing.lib.Bezier;
import feuille.drawing.lib.ControlPoint;
import feuille.drawing.lib.IShape;
import feuille.drawing.lib.Line;
import feuille.drawing.lib.Move;
import feuille.drawing.lib.Point;
import feuille.drawing.lib.ReStart;
/**
*
* @author The Wingate 2940
*/
public class Center {
private int xo = -1, yo = -1;
private boolean set = false;
private double rx = 0d, ry = 0d;
private List<IShape> mShapes = new ArrayList<IShape>();
public Center(){
}
public Center(int xo, int yo){
this.xo = xo;
this.yo = yo;
if(xo != -1 && yo != -1){
set = true;
}
}
public void clear(){
xo = -1;
yo = -1;
set = false;
rx = 0d;
ry = 0d;
mShapes.clear();
}
public void setCenter(int xo, int yo){
this.xo = xo;
this.yo = yo;
if(xo != -1 && yo != -1){
set = true;
}
}
public boolean isSet(){
return set;
}
public int getX(){
return xo;
}
public int getY(){
return yo;
}
public void setRotation(int rx, int ry){
this.rx = rx;
this.ry = ry;
}
public double getRX(){
return rx;
}
public double getRY(){
return ry;
}
public void setRotationPreview(List<IShape> pshapes, double angle){
if(angle==0d){
angle = getAngle();
}
mShapes.clear();
java.awt.Point O, L; int xa, ya;
for(IShape s : pshapes){
if(s instanceof ReStart){
ReStart m = (ReStart)s;
xa = m.getOriginPoint().x; ya = m.getOriginPoint().y;
O = rotateWithPoint(xo, yo, xa, ya, angle);
xa = m.getLastPoint().x; ya = m.getLastPoint().y;
L = rotateWithPoint(xo, yo, xa, ya, angle);
mShapes.add(new ReStart(O.x, O.y, L.x, L.y));
}else if(s instanceof Move){
Move n = (Move)s;
xa = n.getOriginPoint().x; ya = n.getOriginPoint().y;
O = rotateWithPoint(xo, yo, xa, ya, angle);
xa = n.getLastPoint().x; ya = n.getLastPoint().y;
L = rotateWithPoint(xo, yo, xa, ya, angle);
mShapes.add(new Move(O.x, O.y, L.x, L.y));
}else if(s instanceof Point){
Point p = (Point)s;
xa = p.getOriginPoint().x; ya = p.getOriginPoint().y;
O = rotateWithPoint(xo, yo, xa, ya, angle);
mShapes.add(new Point(O.x, O.y));
}else if(s instanceof Line){
Line l = (Line)s;
xa = l.getOriginPoint().x; ya = l.getOriginPoint().y;
O = rotateWithPoint(xo, yo, xa, ya, angle);
xa = l.getLastPoint().x; ya = l.getLastPoint().y;
L = rotateWithPoint(xo, yo, xa, ya, angle);
mShapes.add(new Line(O.x, O.y, L.x, L.y));
}else if(s instanceof Bezier){
Bezier b = (Bezier)s;
xa = b.getOriginPoint().x; ya = b.getOriginPoint().y;
O = rotateWithPoint(xo, yo, xa, ya, angle);
xa = b.getLastPoint().x; ya = b.getLastPoint().y;
L = rotateWithPoint(xo, yo, xa, ya, angle);
xa = b.getControl1().getOriginPoint().x; ya = b.getControl1().getOriginPoint().y;
java.awt.Point CP1 = rotateWithPoint(xo, yo, xa, ya, angle);
xa = b.getControl2().getOriginPoint().x; ya = b.getControl2().getOriginPoint().y;
java.awt.Point CP2 = rotateWithPoint(xo, yo, xa, ya, angle);
mShapes.add(new Bezier(O.x, O.y, CP1.x, CP1.y, CP2.x, CP2.y, L.x, L.y));
}else if(s instanceof ControlPoint){
ControlPoint cp = (ControlPoint)s;
xa = cp.getOriginPoint().x; ya = cp.getOriginPoint().y;
java.awt.Point CP1 = rotateWithPoint(xo, yo, xa, ya, angle);
mShapes.add(new ControlPoint(CP1.x, CP1.y));
}else if(s instanceof BSpline){
BSpline bs = (BSpline)s;
xa = (int)bs.getOriginPoint().getX();
ya = (int)bs.getOriginPoint().getY();
java.awt.Point P = rotateWithPoint(xo, yo, xa, ya, angle);
BSpline nbs = new BSpline(P.x, P.y);
for(ControlPoint cp : bs.getControlPoints()){
xa = (int)cp.getOriginPoint().getX();
ya = (int)cp.getOriginPoint().getY();
java.awt.Point CP1 = rotateWithPoint(xo, yo, xa, ya, angle);
nbs.addPoint(CP1.x, CP1.y);
}
if(bs.isNextExist()){
xa = (int)bs.getNextPoint().getX();
ya = (int)bs.getNextPoint().getY();
java.awt.Point NX = rotateWithPoint(xo, yo, xa, ya, angle);
nbs.setNextPoint(NX.x, NX.y);
}
mShapes.add(nbs);
}
}
}
public List<IShape> getPreviewShapes(){
return mShapes;
}
/** Rotation d'un point par rapport à un autre.
* @param xo Centre en xo
* @param yo Centre en yo
* @param xa Abscisse du point
* @param ya Ordonnée du point
* @param angle Angle en degré (positif ou négatif)
* @return Le point modifié avec la rotation */
private java.awt.Point rotateWithPoint(int xo, int yo, int xa, int ya, double angle){
java.awt.Point S = new java.awt.Point(xo, yo);
java.awt.Point P = new java.awt.Point(xa, ya);
java.awt.Point Pprime = P;
double SP = Math.sqrt(Math.pow(P.getX()-S.getX(), 2)+Math.pow(P.getY()-S.getY(), 2));
double tan_PSN = (P.getY() - S.getY()) / (P.getX() - S.getX());
double angle_PSN = Math.toDegrees(Math.atan(tan_PSN));
if(P.getX() - S.getX() > 0 && P.getY() - S.getY() >= 0){
angle_PSN = Math.toDegrees(Math.atan(tan_PSN));
}
if(P.getX() - S.getX() > 0 && P.getY() - S.getY() < 0){
angle_PSN = Math.toDegrees(Math.atan(tan_PSN)+2*Math.PI);
}
if(P.getX() - S.getX() < 0){
angle_PSN = Math.toDegrees(Math.atan(tan_PSN)+Math.PI);
}
double xPprime = SP * Math.cos(Math.toRadians(angle+angle_PSN)) + S.getX();
double yPprime = SP * Math.sin(Math.toRadians(angle+angle_PSN)) + S.getY();
Pprime.setLocation(xPprime, yPprime);
return Pprime;
}
public double getAngle(){
java.awt.Point S = new java.awt.Point(xo, yo);
java.awt.Point P = new java.awt.Point((int)rx, (int)ry);
double tan_PSN = (P.getY() - S.getY()) / (P.getX() - S.getX());
double angle_PSN = Math.toDegrees(Math.atan(tan_PSN));
if(P.getX() - S.getX() > 0 && P.getY() - S.getY() >= 0){
angle_PSN = Math.toDegrees(Math.atan(tan_PSN));
}
if(P.getX() - S.getX() > 0 && P.getY() - S.getY() < 0){
angle_PSN = Math.toDegrees(Math.atan(tan_PSN)+2*Math.PI);
}
if(P.getX() - S.getX() < 0){
angle_PSN = Math.toDegrees(Math.atan(tan_PSN)+Math.PI);
}
return angle_PSN;
}
}