# dynamisches Koordinatenkreuz mit scalierung



## tanzverfuehrung (23. Apr 2012)

ich programmiere mir grad einen Funktionsplotter... er zeichnet mir schon die funktin und alles....habe doch bis jetzt nur das Korordinatenkreuz selbst hart gecodet....reingehackt!
somit war es nicht wirklich genau und auch der code natürlich nicht schön. Ich versuche nun mein Koordinatenkreuz schön dynamisch zu machen. Die Achsen ahbe ich auch soweit hinbekommen, habe einfach aus den Achsen auch eine lineare Funktion gemacht 

```
/** Zeichnet das Koordinatenkreuz */
	private void drawCross() {
		canvas.addPaintListener(new PaintListener() {

			public void paintControl(PaintEvent event) {
				drawFunction("0");
				drawFunction("10000*x");
			}
		});
	}
```
das funktioniert auch super.alles ist perfect berechnet und gemalt worden....
nun will ich die beschriftung der Achsen auch noch hinbekommen.x Achse hat auch geklappt....aber irgendwie will die y-Achse nciht!Verstehe aber nicht wieso weil ich genau den gleich algorithmus verwende!
kann mir jemand helfen????:L


```
/** Zeichnet die Scala des Koordinatenkreuz */
	private void drawScala() {
		canvas.addPaintListener(new PaintListener() {

			public void paintControl(PaintEvent event) {
				// einteilung
				MathEngine mathEngine = new MathEngine();
				//funktion der x-Achse
				IFunction x_f =mathEngine.eval("0");
				//funktion der y-Achse
				IFunction y_f = mathEngine.eval("1000*x");
				KoordinatenUmrechnerX umrechnerX = new KoordinatenUmrechnerX(event.width,  -10, 10);
				KoordinatenUmrechnerY umrechnerY = new KoordinatenUmrechnerY(event.height, 10,  -10);
				
				//X-Koordinatenachse
				
				// im Koordinatensystem gibt es 500 Pixel
				for (int x = -10; x <= 10; x++) {
					// berechnet für das x das y
					double y = x_f.f(x);
					// berechnet X-Pixel für die bestimmte Funktion
					int px = (int) umrechnerX.f(x);
					// berechnet Y-Pixel für die bestimmte Funktion
					int py = (int) umrechnerY.f(y);

					event.gc.drawLine(px, py-5, px, py+5);
					event.gc.drawString(String.valueOf(x), px, py);
				}
				
//				//Y-Koordinatenachse
				
				// im Koordinatensystem gibt es 500 Pixel
				for (int x = 10; x >= -10; x--) {
					// berechnet für das x das y
					double y = y_f.f(x);
					// berechnet X-Pixel für die bestimmte Funktion
					int px = (int) umrechnerX.f(x);
					// berechnet Y-Pixel für die bestimmte Funktion
					int py = (int) umrechnerY.f(y);

					event.gc.drawLine(px-5, py, px+5, py);
					event.gc.drawString(String.valueOf(x), px, py);
				}

			}
		});
	}
```

;(


----------



## tanzverfuehrung (23. Apr 2012)

```
//				//Y-Koordinatenachse
				
				// im Koordinatensystem gibt es 500 Pixel
				for (int y = 10; y >= -10; y--) {
					// berechnet für das x das y
					double x = 0;
					// berechnet X-Pixel für die bestimmte Funktion
					int px = (int) umrechnerX.f(x);
					// berechnet Y-Pixel für die bestimmte Funktion
					int py = (int) umrechnerY.f(y);

					event.gc.drawLine(px-5, py, px+5, py);
					event.gc.drawString(String.valueOf(y), px, py-2);
				}
```


so wirds gemacht, habe jetzt nochmal logisch drüber nachgedacht und todaaaa....ich habs:lol:


----------



## tanzverfuehrung (23. Apr 2012)

Ich habe alles auf ein Canvas gezeichnet(koordinatenkreuz, scalierung und funktion)....nun will ich aber immer nur ein ausschnitt sehen könnnen vom canvas.wenn ich mit gedrückter maus hin und her gehe , folgt mir das bild!und rein- und raus zoomen will ich auch noch können!
Ich habe jetzt schon eine Menge gegooglt aber noch nicht das richtige gefunden....
also muss ich das alles über Listener machen oder gibt es da auch schon was fertiges, so wie bei vielen beispielen .... gc.clip() oder setChlip();...oder kann ich das schon beim inizialierung von canvas irgendwie einstellen???

beispiel für funktionsplotter:
Funktionsgraphen plotten - Der Funktionsplotter


wäre nett wenn mir jemand helfen könnte!:toll:


----------



## Marco13 (23. Apr 2012)

Da müssen doch "nur" die Parameter vom "Umrechner" verändert werden? Wüßte nicht, was man mit setClip da machen sollte: Man zeichnet ja schon immer den ganzen Canvas, aber immer nur einen anderen Ausschnitt der "Welt"...


----------



## tanzverfuehrung (24. Apr 2012)

Marco13 hat gesagt.:


> Man zeichnet ja schon immer den ganzen Canvas, aber immer nur einen anderen Ausschnitt der "Welt"...



 ja genau aber wie meinst du das???


Marco13 hat gesagt.:


> Da müssen doch "nur" die Parameter vom "Umrechner" verändert werden



"nur" ist gut!?! b :bahnhof:


----------



## tanzverfuehrung (24. Apr 2012)

ich habe das nun mit 	canvas.setBounds(0, 0, 500, 500); gemacht und das funktioniert soweit auch:toll::toll::toll::toll::toll:

jetzt müsste ich halt noch hinbekommen,das ich es verschieben kann, den "BIldausschnitt" des Canvas...!?! 
dazu muss ich sicherlich ein Listener setzten oder????:shock::bahnhof:


----------



## tanzverfuehrung (24. Apr 2012)

tanzverfuehrung hat gesagt.:


> ich habe das nun mit 	canvas.setBounds(0, 0, 500, 500); gemacht und das funktioniert soweit auch:toll::toll::toll::toll::toll:
> 
> jetzt müsste ich halt noch hinbekommen,das ich es verschieben kann, den "BIldausschnitt" des Canvas...!?!
> dazu muss ich sicherlich ein Listener setzten oder????:shock::bahnhof:



???:L
Also ich habe ein Canvas, worauf ein Koordinatenkreuz gezeichnet wird,  es wird aber immer nur ein Ausschnitt des Canvas gezeigt auf meiner Anwedungsoberfläche!
Ich müsste jetzt das MouseDOwn Event nutzen!oder?
Also das wenn ich die Maus gedrückt halte und bewege, sich das Bild immer mit bewegt!!
Wie kann ich das realisieren??
ich habe es jetzt mal ausprobiert, jedoch wird mir das ganze canvas auf der shell verschoben und nicht der "bildausschnitt" des Canvas!
ich weiß auch das es an der funktion

```
canvas.setLocation(xDiff, yDiff);
```
 liegt, jedoch weiß ich nicht welche funkton ich dafür nutzen muss, um in canvas den ausschnitt zu verschieben!


```
public void guiErstellt() {
		shell.setText("Funktions Plotter");
		shell.setSize(900, 600);
		// Canvas erzeugen und auf shell setzten
		canvas = new Canvas(shell, SWT.BORDER | SWT.MouseDown | SWT.DragDetect | SWT.DRAG);
		canvas.setSize(5000, 5000);
		// Weisse Systemfarbe holen
		Color white = canvas.getDisplay().getSystemColor(SWT.COLOR_WHITE);
		canvas.setBackground(white);
		canvas.setBounds(0, 0, 500, 500);
		canvas.setFocus();
		drawCross();
		drawScala();
		textFields(shell);
		canvas.setDragDetect(true);
		canvas.addMouseListener(new MouseListener() {

			private int xStart;
			private int yStart;
			private int yExit;
			private int xExit;

			@Override
			public void mouseUp(MouseEvent e) {
				xExit = e.x;
				yExit = e.y;
				canvas.removeMouseMoveListener(new MouseMoveListener() {
					
					@Override
					public void mouseMove(MouseEvent e) {
					}
				});

				// canvas.setLocation(xExit, yExit);
			}

			@Override
			public void mouseDown(MouseEvent e) {
				xStart = e.x;
				yStart = e.y;
				canvas.addMouseMoveListener(new MouseMoveListener() {

					private int xDiff;
					private int yDiff;

					@Override
					public void mouseMove(MouseEvent e) {
						xDiff = xExit - xStart;
						yDiff = yExit - yStart;
						canvas.setLocation(xDiff, yDiff);
					}
				});
			}
```

kann mir da jemand helfen?:rtfm:


----------



## Marco13 (6. Mai 2012)

Ist das hier eigentlich erledigt?

Das
canvas.setLocation(xDiff, yDiff); 
wird sicher nicht bewirken, dass sich der _Inhalt_ des Canvas verschiebt...


----------

