Bonjour,

J'ai une erreur avec la fonction rotate de la classe Transform.
A 45 DEGRE (et 135, etc.), j'ai une translation de l'ellipse (voir snippet ci-dessous) que je n'ai pas demandé.

Si vous avez une idée...
Merci

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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();
	}
}