org.scilab.forge.jlatexmath.RotateBox Maven / Gradle / Ivy
/* RotateBox.java
* =========================================================================
* This file is part of the JLaTeXMath Library - http://forge.scilab.org/jlatexmath
*
* Copyright (C) 2009-2011 DENIZET Calixte
*
* This program 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 2 of the License, or (at
* your option) any later version.
*
* This program is 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
* General Public License for more details.
*
* A copy of the GNU General Public License can be found in the file
* LICENSE.txt provided with the source distribution of this program (see
* the META-INF directory in the source jar). This license can also be
* found on the GNU website at http://www.gnu.org/licenses/gpl.html.
*
* If you did not receive a copy of the GNU General Public License along
* with this program, contact the lead developer, or write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*
* Linking this library statically or dynamically with other modules
* is making a combined work based on this library. Thus, the terms
* and conditions of the GNU General Public License cover the whole
* combination.
*
* As a special exception, the copyright holders of this library give you
* permission to link this library with independent modules to produce
* an executable, regardless of the license terms of these independent
* modules, and to copy and distribute the resulting executable under terms
* of your choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module.
* An independent module is a module which is not derived from or based
* on this library. If you modify this library, you may extend this exception
* to your version of the library, but you are not obliged to do so.
* If you do not wish to do so, delete this exception statement from your
* version.
*
*/
package org.scilab.forge.jlatexmath;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
/**
* A box representing a rotated box.
*/
public class RotateBox extends Box {
public static final int BL = 0;
public static final int BC = 1;
public static final int BR = 2;
public static final int TL = 3;
public static final int TC = 4;
public static final int TR = 5;
public static final int BBL = 6;
public static final int BBR = 7;
public static final int BBC = 8;
public static final int CL = 9;
public static final int CC = 10;
public static final int CR = 11;
protected double angle = 0;
private Box box;
private float xmax, xmin, ymax, ymin;
private int option;
private float shiftX;
private float shiftY;
public RotateBox(Box b, double angle, float x, float y) {
this.box = b;
this.angle = angle * Math.PI / 180;
height = b.height;
depth = b.depth;
width = b.width;
double s = Math.sin(this.angle);
double c = Math.cos(this.angle);
shiftX = (float) (x * (1 - c) + y * s);
shiftY = (float) (y * (1 - c) - x * s);
xmax = (float) Math.max(-height * s, Math.max(depth * s, Math.max(width * c + depth * s, width * c - height * s))) + shiftX;
xmin = (float) Math.min(-height * s, Math.min(depth * s, Math.min(width * c + depth * s, width * c - height * s))) + shiftX;
ymax = (float) Math.max(height * c, Math.max(-depth * c, Math.max(width * s - depth * c, width * s + height * c)));
ymin = (float) Math.min(height * c, Math.min(-depth * c, Math.min(width * s - depth * c, width * s + height * c)));
width = xmax - xmin;
height = ymax + shiftY;
depth = -ymin - shiftY;
}
public RotateBox(Box b, double angle, Point2D.Float origin) {
this(b, angle, origin.x, origin.y);
}
public RotateBox(Box b, double angle, int option) {
this(b, angle, calculateShift(b, option));
}
public static int getOrigin(String option) {
if (option == null || option.length() == 0) {
return BBL;
}
if (option.length() == 1) {
option += "c";
}
if (option.equals("bl") || option.equals("lb")) {
return BL;
} else if (option.equals("bc") || option.equals("cb")) {
return BC;
} else if (option.equals("br") || option.equals("rb")) {
return BR;
} else if (option.equals("cl") || option.equals("lc")) {
return CL;
} else if (option.equals("cc")) {
return CC;
} else if (option.equals("cr") || option.equals("cr")) {
return CR;
} else if (option.equals("tl") || option.equals("lt")) {
return TL;
} else if (option.equals("tc") || option.equals("ct")) {
return TC;
} else if (option.equals("tr") || option.equals("rt")) {
return TR;
} else if (option.equals("Bl") || option.equals("lB")) {
return BBL;
} else if (option.equals("Bc") || option.equals("cB")) {
return BBC;
} else if (option.equals("Br") || option.equals("rB")) {
return BBR;
} else
return BBL;
}
private static Point2D.Float calculateShift(Box b, int option) {
Point2D.Float p = new Point2D.Float(0, -b.depth);
switch (option) {
case BL :
p.x = 0;
p.y = -b.depth;
break;
case BR :
p.x = b.width;
p.y = -b.depth;
break;
case BC :
p.x = b.width / 2;
p.y = - b.depth;
break;
case TL :
p.x = 0;
p.y = b.height;
break;
case TR :
p.x = b.width;
p.y = b.height;
break;
case TC :
p.x = b.width / 2;
p.y = b.height;
break;
case BBL :
p.x = 0;
p.y = 0;
break;
case BBR :
p.x = b.width;
p.y = 0;
break;
case BBC :
p.x = b.width / 2;
p.y = 0;
break;
case CL :
p.x = 0;
p.y = (b.height - b.depth) / 2;
break;
case CR :
p.x = b.width;
p.y = (b.height - b.depth) / 2;
break;
case CC :
p.x = b.width / 2;
p.y = (b.height - b.depth) / 2;
break;
default :
}
return p;
}
public void draw(Graphics2D g2, float x, float y) {
drawDebug(g2, x, y);
box.drawDebug(g2, x, y, true);
y -= shiftY;
x += shiftX - xmin;
g2.rotate(-angle, x, y);
box.draw(g2, x, y);
box.drawDebug(g2, x, y, true);
g2.rotate(angle, x, y);
}
public int getLastFontId() {
return box.getLastFontId();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy