GeomVis  0.1
Набор классов Java для визуализации результатов работы геометрических алгоритмов
GCoordSystem.java
См. документацию.
1 package geom;
2 
3 import geom.GView.EGState;
4 
5 import java.awt.FlowLayout;
6 import java.awt.event.ActionEvent;
7 import java.awt.event.ActionListener;
8 
9 import javax.swing.JCheckBox;
10 import javax.swing.JPanel;
11 import javax.swing.event.ChangeEvent;
12 import javax.swing.event.ChangeListener;
13 
14 import java.awt.Color;
15 import java.awt.Cursor;
16 import java.awt.Graphics;
17 import java.awt.Graphics2D;
18 import java.awt.RenderingHints;
19 import java.awt.event.MouseEvent;
20 import java.awt.event.MouseListener;
21 import java.awt.event.MouseMotionListener;
22 import java.awt.event.MouseWheelEvent;
23 import java.awt.event.MouseWheelListener;
24 import java.util.Iterator;
25 
26 import javax.swing.BorderFactory;
27 import javax.swing.JButton;
28 import javax.swing.JPanel;
29 
31 
36 public class GCoordSystem extends JPanel implements MouseListener,
37  MouseMotionListener, MouseWheelListener,
38  container.IGeomContainerListener
39 {
40  private int x0, y0;
41  private double scale = 0.1;
42 
43  public int gEps = 5;
44 
45  private Graphics2D graphics = null;
46  private GeomContainer gObjects = null;
47 
48  private boolean axes = true;
49  private boolean createSel = true;
50 
51  private GCSControl control;
52 
54  {
55  return control;
56  }
57 
58  public void setAxes(boolean axes)
59  {
60  this.axes = axes;
61  repaint();
62  }
63 
64  public void setCreateSel(boolean createSel)
65  {
66  this.createSel = createSel;
67  }
68 
69  public GCoordSystem(GeomContainer gObjects, boolean axes) {
70  control = new GCSControl(this);
71  this.gObjects = gObjects;
72  setBackground(Color.WHITE);
73  this.axes = axes;
74  x0 = 100;
75  y0 = 100;
76  this.setBorder(BorderFactory.createLineBorder(Color.GRAY, 5));
77  this.addMouseListener(this);
78  this.addMouseMotionListener(this);
79  this.addMouseWheelListener(this);
80  this.gObjects.addListener(this);
81  }
82 
83  public Graphics2D getCanvas()
84  {
85  return graphics;
86  }
87 
88  public void paintComponent(Graphics g)
89  {
90  Graphics2D g2d = (Graphics2D) g;
91  if (graphics == null)
92  {
93  x0 = this.getWidth() / 2;
94  y0 = this.getHeight() / 2;
95  }
96  graphics = g2d;
97  super.paintComponent(g2d);
98 
99  g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
100  RenderingHints.VALUE_ANTIALIAS_ON);
101 
102  if (axes)
103  {
104 
105  g.setColor(Color.LIGHT_GRAY);
106  int step = (int) (2 / getScale());
107  for (int i = x0; i < getWidth(); i += step)
108  {
109  g.drawLine(i, 0, i, getHeight());
110  }
111  for (int i = y0; i < getHeight(); i += step)
112  {
113  g.drawLine(0, i, getWidth(), i);
114  }
115  for (int i = x0; i >= 0; i -= step)
116  {
117  g.drawLine(i, 0, i, getHeight());
118  }
119  for (int i = y0; i >= 0; i -= step)
120  {
121  g.drawLine(0, i, getWidth(), i);
122  }
123 
124  g.setColor(Color.BLACK);
125  g.drawLine(0, y0, getWidth(), y0);
126  g.drawLine(x0, 0, x0, getHeight());
127 
128  }
129 
130  gObjects.draw(this);
131  }
132 
133  public int canvasX(double realX)
134  {
135  return (int) (realX / scale + x0);
136  }
137 
138  public int canvasY(double realY)
139  {
140  return (int) ( -realY / scale + y0);
141  }
142 
143  public double realX(int canvasX)
144  {
145  return ((canvasX - x0) * scale);
146  }
147 
148  public double realY(int canvasY)
149  {
150  return ((y0 - canvasY) * scale);
151  }
152 
153  @Override
154  public void mouseClicked(MouseEvent arg0)
155  {
156 
157  if (highLighted == null)
158  {
159  GObject objHere = gObjects.in(arg0.getX(), arg0.getY(), this);
160  if (objHere == null || !objHere.getClass().equals(Point.class))
161  {
162  Point p = new Point(realX(arg0.getX()), realY(arg0.getY()));
163  p.view().highLight();
164  if (createSel)
165  {
166  p.view().select();
167  }
168  gObjects.add(p);
169  }
170 
171  } else
172  {
173  gObjects.remove(highLighted);
174  if (highLighted.view().getState() != EGState.SELECTED)
175  {
176  highLighted.view().select();
177  } else
178  {
179  highLighted.view().highLight();
180  }
181  gObjects.add(highLighted);
182  }
183  if (highLighted != null)
184  this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
185  else
186  this.setCursor(Cursor.getDefaultCursor());
187  repaint();
188  }
189 
190  @Override
191  public void mouseEntered(MouseEvent arg0)
192  {
193  // TODO Auto-generated method stub
194 
195  }
196 
197  @Override
198  public void mouseExited(MouseEvent arg0)
199  {
200  // TODO Auto-generated method stub
201 
202  }
203 
204  // GPoint last = null;
205 
206  public void mousePressed(MouseEvent arg0)
207  {
208  prevx = arg0.getX();
209  prevy = arg0.getY();
210  if (highLighted == null)
211  this.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
212  }
213 
214  @Override
215  public void mouseReleased(MouseEvent arg0)
216  {
217  if (this.getCursor().equals(
218  Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)))
219  this.setCursor(Cursor.getDefaultCursor());
220 
221  }
222 
223  private int prevx, prevy;
224 
225  @Override
226  public void mouseDragged(MouseEvent arg0)
227  {
228  // TODO Auto-generated method stub
229  x0 += arg0.getX() - prevx;
230  y0 += arg0.getY() - prevy;
231  prevx = arg0.getX();
232  prevy = arg0.getY();
233  repaint();
234  }
235 
237 
238  @Override
239  public void mouseMoved(MouseEvent arg0)
240  {
241  // TODO Auto-generated method stub
242  if (highLighted != null
243  && highLighted.view().getState() == EGState.HIGHLIGHTED)
244  {
245  highLighted.view().deselect();
246  }
247 
248  highLighted = null;
249  boolean found = false;
250  Iterator<GObject> iterator = gObjects.iterator();
251  while (iterator.hasNext())
252  {
253  GObject gobj = iterator.next();
254  if (gobj.in(arg0.getX(), arg0.getY(), this) && !found)
255  {
256  if (gobj.view().getState() == EGState.NORMAL)
257  {
258  gobj.view().highLight();
259  }
260  highLighted = gobj;
261  found = true;
262  }
263  }
264  if (highLighted != null)
265  this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
266  else
267  this.setCursor(Cursor.getDefaultCursor());
268  repaint();
269  }
270 
271  @Override
272  public void onDataChanged(GeomContainer source)
273  {
274  repaint();
275  }
276 
277  public void setScale(double scale)
278  {
279  if (scale > 0.01 && scale < 0.2)
280  {
281  this.scale = scale;
282  repaint();
283  }
284  }
285 
286  public double getScale()
287  {
288  return this.scale;
289  }
290 
291  @Override
292  public void mouseWheelMoved(MouseWheelEvent arg0)
293  {
294  double k = 0.005;
295  this.setScale(this.getScale() - arg0.getWheelRotation() * k);
296 
297  }
298 
299  class GCSControl extends JPanel implements ChangeListener
300  {
301 
302  private GCoordSystem gcs;
303  private JCheckBox axes;
304  private JCheckBox sel;
305 
306  public GCSControl(GCoordSystem gcs) {
307  this.gcs = gcs;
308  this.setLayout(new FlowLayout(FlowLayout.LEFT));
309  axes = new JCheckBox("Axes");
310  axes.getModel().setSelected(true);
311  add(axes);
312  axes.addChangeListener(this);
313  sel = new JCheckBox("Selected Points");
314  sel.getModel().setSelected(true);
315  sel.addChangeListener(this);
316  add(sel);
317  }
318 
319  @Override
320  public void stateChanged(ChangeEvent arg0)
321  {
322  if (arg0.getSource().equals(axes))
323  {
324  if (axes.getModel().isSelected())
325  gcs.setAxes(true);
326  else
327  gcs.setAxes(false);
328  }
329  if (arg0.getSource().equals(sel))
330  {
331  if (sel.getModel().isSelected())
332  gcs.setCreateSel(true);
333  else
334  gcs.setCreateSel(false);
335  }
336 
337  }
338  }
339 }
GCSControl(GCoordSystem gcs)
void setScale(double scale)
Kласс для хранения графических объектов
abstract boolean in(int canvasX, int canvasY, GCoordSystem gcs)
Абстракная функция определяющая принадлежность точки объекту. Переопределяется в подклассах - конкрет...
void setCreateSel(boolean createSel)
void paintComponent(Graphics g)
GView view
Definition: GObject.java:17
void stateChanged(ChangeEvent arg0)
void mouseEntered(MouseEvent arg0)
double realX(int canvasX)
void mousePressed(MouseEvent arg0)
Точка. Определяется двумя числами - координами в декартовой системе координат.
Definition: Point.java:10
GCSControl getControl()
void mouseClicked(MouseEvent arg0)
void setAxes(boolean axes)
void mouseExited(MouseEvent arg0)
GCoordSystem(GeomContainer gObjects, boolean axes)
void mouseReleased(MouseEvent arg0)
Главный класс отображения. У пользователя нет необходимости его использовать напрямую.
void mouseMoved(MouseEvent arg0)
double realY(int canvasY)
Graphics2D getCanvas()
int canvasX(double realX)
void mouseDragged(MouseEvent arg0)
Абстрактный суперкласс для всех графических объектов
Definition: GObject.java:14
void onDataChanged(GeomContainer source)
void mouseWheelMoved(MouseWheelEvent arg0)
int canvasY(double realY)