1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
| import javax.vecmath.Point2d;
import javax.vecmath.Vector2d;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Transform;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Rotate45Degrees {
private final static double AXE_MAX = 1000;
private final static int SECTOR_NB = 8;
private final static double DX = 100;
private final static double DY = 60;
private final static int NX = 50;
private final static int NY = 60;
private static float angle = 0;
private static boolean isDrag = false;
public static void main(String[] args) {
final Display display = new Display();
final Image image = new Image(display, 110, 60);
GC gc = new GC(image);
Font font = new Font(display, "Times", 30, SWT.BOLD);
gc.setFont(font);
gc.setBackground(display.getSystemColor(SWT.COLOR_RED));
gc.fillRectangle(0, 0, 110, 60);
gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
gc.drawText("SWT", 10, 10, true);
font.dispose();
gc.dispose();
Shell shell = new Shell(display);
shell.setText("Matrix Tranformations");
shell.setLayout(new FillLayout());
final Canvas canvas = new Canvas(shell, SWT.DOUBLE_BUFFERED);
canvas.addPaintListener(new PaintListener() {
@Override
public void paintControl(PaintEvent e) {
GC gc = e.gc;
gc.setAdvanced(true);
int width = canvas.getSize().x;
int height = canvas.getSize().y;
Point center = new Point(width / 2, height / 2);
double maxGrid = Math.max(NX * DX, NY * DY);
double max = Math.max(maxGrid / 2.0, AXE_MAX);
int unit = Math.min(width, height);
double ratio = unit / 2.0 / max;
double valueMax = ratio * AXE_MAX;
double valueMin = valueMax * 0.5;
Transform transform = new Transform(display);
transform.translate(center.x, center.y);
transform.rotate(angle);
gc.setTransform(transform);
// the sector lines
gc.drawLine(0, 0, 0, (int) (-valueMax));
gc.setForeground(display.getSystemColor(SWT.COLOR_DARK_GRAY));
double stepSector = 2.0 * Math.PI / (1.0 * SECTOR_NB);
for (int i = 1; i < SECTOR_NB; i++) {
int xEnd = (int) (Math.cos(Math.PI / 2 - i * stepSector) * valueMin);
int yEnd = (int) (Math.sin(Math.PI / 2 - i * stepSector) * valueMax);
gc.drawLine(0, 0, xEnd, -yEnd);
}
// the ellipse
gc.drawOval((int) -valueMin, (int) -valueMax, (int) (2 * valueMin), (int) (2 * valueMax));
// image
gc.drawImage(image, 30, 30);
transform.dispose();
}
});
canvas.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
isDrag = (e.button == 1);
}
@Override
public void mouseUp(MouseEvent e) {
isDrag = false;
}
});
canvas.addMouseMoveListener(new MouseMoveListener() {
@Override
public void mouseMove(MouseEvent e) {
if (isDrag) {
int width = canvas.getSize().x;
int height = canvas.getSize().y;
Point2d center = new Point2d(width / 2., height / 2.);
Vector2d vectOld = new Vector2d(1, 0);
Vector2d vectNew = new Vector2d(e.x - center.x, center.y - e.y);
if (vectNew.y < 0) {
angle = (float) (180. * vectOld.angle(vectNew) / Math.PI);
} else {
angle = (float) (360 - 180. * vectOld.angle(vectNew) / Math.PI);
}
canvas.redraw();
}
}
});
shell.setSize(350, 550);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
image.dispose();
display.dispose();
}
} |
Partager