dynamisches Koordinatenkreuz mit scalierung

tanzverfuehrung

Bekanntes Mitglied
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
Java:
/** 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

Java:
/** 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);
				}

			}
		});
	}

;(
 
Zuletzt bearbeitet:
Java:
//				//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:
 
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:
 
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"...
 
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:
 
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
Java:
canvas.setLocation(xDiff, yDiff);
liegt, jedoch weiß ich nicht welche funkton ich dafür nutzen muss, um in canvas den ausschnitt zu verschieben!

Java:
	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:
 
Ist das hier eigentlich erledigt?

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

Neue Themen


Zurück
Oben