Anzeigen eines Grapfen

Status
Nicht offen für weitere Antworten.

activefresh

Mitglied
Hi leute,
ich hab ne Frage und ich wäre froh wenn ihr mir helfen könnt. Ich möchte einen Graphen zeichnen und zwar für die

Funktion f(x)= ax^5+bx^4+cx^3+dx+2+ex+f

Der Benutzer kann a,b,c,d,e,f in ein Textfeld eingeben und das Programm soll ihm dann den Graphen zeichnen.

Das Koordinatensystem hab ich schon. Nur hab ich nicht so wirklich ne ahnung wie ich das machen soll.
Ich würde mich sehr freuen wenn mir jemand helfen könnte. Nur so ne frgae am rande könnte man die Funktion auch farbig machen???
 

ARadauer

Top Contributor
http://members.aon.at/rainerra/krapfen.jpg jam jam jam

ich weiß nicht, obs für das konkrete problem schon eine fertige lösung gibt, abber machs einfach so wie wenn du es mit bleistifft und papier machen würdest....

du hast eine x achse, zb von 0 bis 200, du itterierst von 0 bis 200
und rechnest dir für jeden x wert den y wert aus, dann zeichnest du einfach auf ein panel die resultierenden Punkte als Linienzug...
 

activefresh

Mitglied
Ich muss ganz erlich gestehen, ich hab gehofft das ich vlt nen quelltext hier zusehen bekomme. Meine Java ist nicht grad das beste und ich versuche die Quelltexte durch veränderen und rumprobieren zu verstehen. Ich versteh schon wenn ihr sagt "Kein Bock für jemand die Arbeit zu machen" aber ich wäre euch sehr dankbar. Und ich kann mir irgendwie nicht vorstellen das das für ein Java pro eine so große sache ist
 

Niki

Top Contributor
Hmmm, das wird verdammt schwer darzustellen, rechne das mal mit 20 durch (a bis f sind 0.1), da kommt ein y-Wert mit 336842 raus. Da kann man dann verdammt lang scrollen :)

Was für Werte werden für a bis f z.B. eingegeben?
 

Marco13

Top Contributor
Den Krapfen hätte ich auch gepostet :wink:

Wie groß oder klein die y-Werte sind, ist egal, wenn man es passend skaliert. Abgesehen davon will man ja nicht wirklich die Werte von 0 bis 200 einfügen. Vielleicht will man ja nur das Intervall [0,1] plotten - mit 200 Schritten. Und selbst wenn so große y-Werte rauskommen, dann muss man "nur" den Betragsmäßig größten y-Wert ausrechnen und dann einen Skalierungsfaktor für y wäheln, so, dass der größte Wert noch ins Fenster passt.

Das "entscheidende" ist also, dass man unterscheidet zwischen "Fensterkoordinaten" (in Pixeln), und "Weltkoordinaten" (die x- und y-Werte für die Funktion).

Ganz grob skizziert hatte ich das kürzlich erst in http://www.java-forum.org/de/viewtopic.php?t=67536&highlight=kondensator
Code:
    public void paint(Graphics g)
    {
        for (int x =...)
        {
            // Berechne (abhängig vom aktuellen Koordinatensystem) den x-Wert, der
            // Zur aktuellen x-Fensterkoordinate passt
            float fx0 = valueFor(x);
            float fx1 = valueFor(x+1);
            float fy0 = function.getY(fx0);
            float fy1 = function.getY(fx1);

            // Berechne aus dem y-Wert die y-Fensterkoordinate
            int y0 = coordinateFor(fy0);
            int y1 = coordinateFor(fy1);
             
            // Liniensegmente Zeichnen
           g.drawLine(x, y0, x+1, y1);
        }
    }
aber das ist natürlich nur GANZ grob angedeutet - diese magischen Methoden "valueFor" und "coordinateFor" müßten eben genau die Umrechnung zwischen den Koordinatensystemen machen (und das ganze nicht unbedingt in der paint-Methode :roll: )
 

activefresh

Mitglied
bitte nicht hauen aber ich sehe nicht wo ich eine funktion benutzen. Muss ich nicht irgendwo mein f(x) aufrechnen. Quasi ne Werte Tabelle oder so? Warscheinlich mit na Schleife. Aber müsste man dann nicht nen Wertebereich abstecken??
 

Niki

Top Contributor
Soda, das war ja mal ne nette Aufgabe für einen Donnerstag Vormittag:
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class JFGraph extends JFrame {

	private JTextField tfA = null;
	private JTextField tfB = null;
	private JTextField tfC = null;
	private JTextField tfD = null;
	private JTextField tfE = null;
	private JTextField tfF = null;

	public JFGraph() {
		super("Graph");

		guiInit();
		pack();
		setLocationRelativeTo(null);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}

	private void guiInit() {
		getContentPane().setLayout(new BorderLayout());

		JScrollPane scroller = new JScrollPane();

		final GraphPanel gp = new GraphPanel();

		gp.setBackground(Color.WHITE);

		scroller.getViewport().add(gp);

		getContentPane().add(scroller, BorderLayout.CENTER);

		tfA = new JTextField();
		tfB = new JTextField();
		tfC = new JTextField();
		tfD = new JTextField();
		tfE = new JTextField();
		tfF = new JTextField();

		JPanel jpTF = new JPanel();
		GridLayout gl = new GridLayout(6, 2);
		jpTF.setLayout(gl);
		jpTF.add(new JLabel("a:"));
		jpTF.add(tfA);
		jpTF.add(new JLabel("b:"));
		jpTF.add(tfB);
		jpTF.add(new JLabel("c:"));
		jpTF.add(tfC);
		jpTF.add(new JLabel("d"));
		jpTF.add(tfD);
		jpTF.add(new JLabel("e:"));
		jpTF.add(tfE);
		jpTF.add(new JLabel("f:"));
		jpTF.add(tfF);

		tfA.setText("0.00001");
		tfB.setText("0.001");
		tfC.setText("0.001");
		tfD.setText("0.001");
		tfE.setText("0.001");
		tfF.setText("0.001");

		getContentPane().add(jpTF, BorderLayout.NORTH);

		JButton jbAnzeigen = new JButton("Anzeigen");
		jbAnzeigen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				try {
					double a = Double.parseDouble(tfA.getText());
					double b = Double.parseDouble(tfB.getText());
					double c = Double.parseDouble(tfC.getText());
					double d = Double.parseDouble(tfD.getText());
					double e = Double.parseDouble(tfE.getText());
					double f = Double.parseDouble(tfF.getText());

					double[][] xy = new double[gp.getWidth() - 10][2];
					for (int i = 0; i < xy.length; i++) {
						xy[i][0] = i;
						xy[i][1] = function(a, b, c, d, e, f, i);
					}

					int w = (int) xy[xy.length - 1][0];
					int h = (int) xy[xy.length - 1][1];
					Dimension dim = new Dimension(w + 10, h + 10);
					gp.setPreferredSize(dim);
					gp.setMinimumSize(dim);
					gp.setMaximumSize(dim);

					gp.setXY(xy);
				} catch (NumberFormatException ex) {
					ex.printStackTrace();
					JOptionPane
							.showMessageDialog(
									JFGraph.this,
									ex.getMessage() != null
											&& ex.getMessage().length() > 0 ? ex
											.getMessage()
											: "Es ist ein Fehler aufgetreten\nSiehe mehr in der Konsole",
									"Fehler", JOptionPane.ERROR_MESSAGE);
				}
			}
		});

		getContentPane().add(jbAnzeigen, BorderLayout.SOUTH);

	}

	public static void main(String[] args) {
		new JFGraph().setVisible(true);

	}

	private class GraphPanel extends JPanel {

		private double[][] xy = null;

		private GraphPanel() {

		}

		public void setXY(double[][] xy) {
			this.xy = xy;

			revalidate();
			repaint();
		}

		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);

			if (this.xy == null)
				return;

			int w = getWidth();
			int h = getHeight();

			g.drawLine(5, h - 5, w - 5, h - 5);
			g.drawLine(5, h - 5, 5, 5);

			g.setColor(Color.RED);

			int originX = 5;
			int originY = getHeight() - 5;

			int[][] xy = new int[this.xy.length][2];

			for (int i = 0; i < xy.length; i++) {
				xy[i] = fromOrigin(originX, originY, this.xy[i][0],
						this.xy[i][1]);
			}

			Point p = new Point(xy[0][0], xy[0][1]);
			for (int i = 1; i < xy.length; i++) {
				Point _p = new Point(xy[i][0], xy[i][1]);
				g.drawLine(p.x, p.y, _p.x, _p.y);
				p = _p;
			}
		}

		private int[] fromOrigin(int originX, int originY, double x, double y) {

			int _x = (int) (originX + x);
			int _y = (int) (originY - y);

			return new int[] { _x, _y };

		}
	}

	public static double function(double a, double b, double c, double d,
			double e, double f, double x) {
		double y = 0;

		y = a * (Math.pow(x, 5));
		y += b * (Math.pow(x, 4));
		y += c * (Math.pow(x, 3));
		y += d * (Math.pow(x, 2));
		y += e * x;
		y += f;

		return y;
	}
}
 

activefresh

Mitglied
Hui und das mal eben aus dem Handgelenk. Vielen Dank für eine Mühe. Aber leider kann ich damit nicht so viel mit anfangen. Ich wollte eigentlich die Funktion f(x)=ax^5+bx^4+cx+3+dx+2+ex+f als Graph dagestellt haben. Also a-f werden vom benutzer eingegeben und dann sollen für x z.B. die werte -10 bis 10 in 0,001 Schritten und immer ein Punkt da gesetzt wird weil viele Punkte ganz na bei sammen ist doch auch eine Linie.
 

Niki

Top Contributor
Schade dass es dir nichts bringt, ich hab mir soviel Mühe gegeben :)

Vielleicht kannst du es ja ändern so wie du es brauchst. Ich mach nichts anderes als für jeden Punkt auf der x-Achse ein y zu berechnen und die Punkte miteinander zu verbinden.
 

Marco13

Top Contributor
Aber leider kann ich damit nicht so viel mit anfangen.
Warum? :
Ich wollte eigentlich die Funktion f(x)=ax^5+bx^4+cx+3+dx+2+ex+f als Graph dagestellt haben. Also a-f werden vom benutzer eingegeben ...
Bis hierhin passt's nämlich noch, und...
und dann sollen für x z.B. die werte -10 bis 10 in 0,001 Schritten und immer ein Punkt da gesetzt wird weil viele Punkte ganz na bei sammen ist doch auch eine Linie.
...DAS solltest du sowieso bleiben lassen. Abgesehen davon, dass dort die Funktion 20000 Mal ausgewertet werden muss, obwohl der Bildschirm nur 200 Pixel breit ist, ist "eine Linie" eben doch was anderes als "viele nebeneinander liegende Punkte". Eine Linie ist eher "unendlich viele nebeneinander liegende Punkte", d.h. wenn du nur Punkte setzen würdest, würde deine Linie an einigen stellen "fett" aussehen, und an anderen wäre sie vielleicht unterbrochen oder krisselig. Das einzige, was du noch machen musst, um das Intervall abzubilden, ist, die passenden x-Werte zu verwenden. Du änderst dazu einfach das hier
Code:
               for (int i = 0; i < xy.length; i++) {
                  xy[i][0] = i;
                  xy[i][1] = function(a, b, c, d, e, f, i);
               }
in sowas wie
Code:
               double x0 = -10.0;
               double x1 = 10.0;
               double dx = x1-x0;
               double stepX = dx / xy.length;

               for (int i = 0; i < xy.length; i++) 
               {
                  double x = x0 + i * stepX;
                  xy[i][0] = x;
                  xy[i][1] = function(a, b, c, d, e, f, x);
               }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Gameloop tiles anzeigen Spiele- und Multimedia-Programmierung 3
L MJPEG stream mit wechselnden Kameras anzeigen Spiele- und Multimedia-Programmierung 0
Z Anfängerfrage: Text anzeigen mit LWJGL Spiele- und Multimedia-Programmierung 2
H Minecraft Javafehler anzeigen Minecraft Spiele- und Multimedia-Programmierung 5
K Problem beim Anzeigen von Bildern Spiele- und Multimedia-Programmierung 5
D Webcam Livebild wie Spiegelbild anzeigen Spiele- und Multimedia-Programmierung 2
M Das Frequenzspektrum einer WAV/MP3-Datei anzeigen Spiele- und Multimedia-Programmierung 6
K Kanten anzeigen lassen in einem Shape3D-Objekt Spiele- und Multimedia-Programmierung 4
O Wireframe und Fläche gleichzeitig anzeigen Spiele- und Multimedia-Programmierung 3
J Würfel Augenzahl richtig anzeigen Spiele- und Multimedia-Programmierung 16
V FPS anzeigen? Spiele- und Multimedia-Programmierung 6
V Objekt per Tastendruck anzeigen/verschwinden lassen? Spiele- und Multimedia-Programmierung 4
P Rechteck rotieren und frontal anzeigen Spiele- und Multimedia-Programmierung 2
D J3D Neuling: Crosshair erzeugen und anzeigen! Spiele- und Multimedia-Programmierung 5
N Seltsame Exception bei Code eines Spiele-Tutorials Spiele- und Multimedia-Programmierung 6
R Ideen für die Backend-Entwicklung eines Games gesucht Spiele- und Multimedia-Programmierung 8
A Programmieren eines Memorys mit Java (in Eclipse) Spiele- und Multimedia-Programmierung 5
T Position eines Image verändern mithilfe eines Timers Spiele- und Multimedia-Programmierung 6
E Programmierung eines 2.5D Point&Click Adventures ohne Spieleengine machbar? Spiele- und Multimedia-Programmierung 14
K Click innerhalb eines 45° gekippten Rechtecks Spiele- und Multimedia-Programmierung 9
J LibGdx_3D: Klamotten eines Charakters modifizieren Spiele- und Multimedia-Programmierung 2
K Erstellen eines Fotoalbums mit Java Spiele- und Multimedia-Programmierung 8
R Fehler beim Laden eines 2D-Bildes Spiele- und Multimedia-Programmierung 3
L OpenGL TransformationMatrix eines Flugzeugs Spiele- und Multimedia-Programmierung 2
M Programmierung eines "Fantasy Rollenspiels" Spiele- und Multimedia-Programmierung 5
E Laufanimation eines Sprites Spiele- und Multimedia-Programmierung 6
Finalspace Entwicklung eines Jump & Run Spiels Video-Tutorial Spiele- und Multimedia-Programmierung 12
T Hintergrundmusik eines Spiels mit Hilfe von JLayer Spiele- und Multimedia-Programmierung 12
M Cylinder anhand eines Vektors ausrichten (Java3d) Spiele- und Multimedia-Programmierung 0
M bewegen eines Objektes Spiele- und Multimedia-Programmierung 2
U Hilfe bei Implementierung eines PointSounds in Java3D Spiele- und Multimedia-Programmierung 1
gamebreiti Index eines Elements einer ArrayList abfragen Spiele- und Multimedia-Programmierung 1
X "Rebuffen" - Messen der Zeit eines Timers Spiele- und Multimedia-Programmierung 3
S Design eines Schachspiels Spiele- und Multimedia-Programmierung 3
S Mausklicks innerhalb eines JFrames/SWTBrowser ohne richtige Maus simulieren Spiele- und Multimedia-Programmierung 6
F Programmierung eines Bots Spiele- und Multimedia-Programmierung 23
A Wann ist ein Punkt inerhalb eines Polygons? Spiele- und Multimedia-Programmierung 2
F LWJGL Problem mit Erstellen eines Objekts und der Kamera Spiele- und Multimedia-Programmierung 5
R Drehen eines Bildes relativ zur Mauszeigerposition Spiele- und Multimedia-Programmierung 2
M Pattern zur Auswahl eines Objektes anhand vieler Kriterien Spiele- und Multimedia-Programmierung 2
H Skalierung eines Polygons ohne das es verschoben wird Spiele- und Multimedia-Programmierung 3
R Triangulation eines komplexen Polygons Spiele- und Multimedia-Programmierung 4
L Lwjgl Darstellung eines Kreises im Raum Spiele- und Multimedia-Programmierung 3
M Pixel eines BufferedImage bearbeiten (Performance) Spiele- und Multimedia-Programmierung 23
G Rotieren eines Objekts (2D) Spiele- und Multimedia-Programmierung 8
F nur Ausschnitt eines Image zeichnen Spiele- und Multimedia-Programmierung 9
S Umfang eines Polygons erzeugen Spiele- und Multimedia-Programmierung 1
D Highscoreliste eines Applets funktioniert online nicht Spiele- und Multimedia-Programmierung 4
W CannotRealizeException (jmf) beim abspielen eines liedes Spiele- und Multimedia-Programmierung 3
F Meine Aufgabe: Client-Server am Beispiel einer Implementation eines Tic-Tac-Toe Netzwerkspieles Spiele- und Multimedia-Programmierung 7
D Koordinaten eines 2D Sprites Spiele- und Multimedia-Programmierung 2
B Teile eines Bildes laden - BitBlk und drawImage Spiele- und Multimedia-Programmierung 3
S Interpolation eines Bildes Spiele- und Multimedia-Programmierung 6
S Problem beim laden eines Bildes in einer Methode Spiele- und Multimedia-Programmierung 14
N Bildposition innerhalb eines anderen Bildes ermitteln Spiele- und Multimedia-Programmierung 2
G rotation eines würfels Spiele- und Multimedia-Programmierung 9
G Bewegung eines Grafikobjektes Spiele- und Multimedia-Programmierung 7
A Programmieren eines Bruchrechners Spiele- und Multimedia-Programmierung 3
H Decke zeichnen mit Hilfe eines Polygons Spiele- und Multimedia-Programmierung 2
J Rotieren eines 2D Images endet in Java heap space Error Spiele- und Multimedia-Programmierung 15
W Affine Transformation, Rotieren eines Objekts Spiele- und Multimedia-Programmierung 2
S fließende/bewegende Striche eines Auswahlrechtecks Spiele- und Multimedia-Programmierung 9
A Bounds eines gedrehten Objekts berechnen Spiele- und Multimedia-Programmierung 30
T Erstellen eines ausdruckbaren Formulars Spiele- und Multimedia-Programmierung 5
T Umsetzung eines 2D Jump and Runs Spiele- und Multimedia-Programmierung 7
T Brightness eines Bildes [DRINGEND] Spiele- und Multimedia-Programmierung 2
S Java3D - mehrere Instanzen eines Geometrieobjektes erzeugen Spiele- und Multimedia-Programmierung 3
ARadauer Grauwerte eines jpg ermitteln Spiele- und Multimedia-Programmierung 4
R Die korrekte Breite/Höhe eines Bildes wird nicht erkannt. Spiele- und Multimedia-Programmierung 2
S Problem bzgl. Umsetzung eines Rollenspiel Spiele- und Multimedia-Programmierung 6
M Ausschneiden eines Bereichs / Avatar Spiele- und Multimedia-Programmierung 2
G Ermitteln eines Punktes in einer anderen TransformGroup Spiele- und Multimedia-Programmierung 2
M Frage eines Anfängers Spiele- und Multimedia-Programmierung 3
DEvent [2D] Farbe bestimmten Pixels eines Bildes ändern Spiele- und Multimedia-Programmierung 3
V Wie berechnet man das Bild eines Schwarzen Loches in Java? Spiele- und Multimedia-Programmierung 10
G Breite eines Strings Spiele- und Multimedia-Programmierung 2
S Text an einer Seite eines Cubes Spiele- und Multimedia-Programmierung 7
F Image eines bestimmten Bereichs eines JPanels erstellen Spiele- und Multimedia-Programmierung 4
N Grafik als Hintergrund eines Rechtecks verwenden? Spiele- und Multimedia-Programmierung 4
N Rundenstrategiespiel - Problem beim Drehen eines Bildes Spiele- und Multimedia-Programmierung 18
F Brauche Hilfe bei Bewegung eines Rechtecks [Applet] Spiele- und Multimedia-Programmierung 5
T Java2D Spiel, beim Hinzufügen eines Bildes ruckelt das ganze Spiele- und Multimedia-Programmierung 3
F Position eines Objektes auslesen. Spiele- und Multimedia-Programmierung 7
W Rotation eines Objektes Spiele- und Multimedia-Programmierung 2
M Zerschneiden eines Bildes mit Wellenlinien? Spiele- und Multimedia-Programmierung 2
S Simulation in der Art eines Schachbrett Spiele- und Multimedia-Programmierung 2
A 2-Achsen Rotation eines Würfels Spiele- und Multimedia-Programmierung 4
L nicht sichtbare Kanten eines Würfels Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen


Oben