Java Kurve zwischen zwei Punkten zeichnen

Timmey92

Commodore
Registriert
Okt. 2008
Beiträge
4.571
Moin,

ich probiere schon seit Tagen eine Kurve zwischen zwei Punkten zu zeichnen in einem JPanel.
Gegeben sind mir also x0,y0, x1,y1.

Das was bisher am dichtesten dran ist sieht so aus.. von Kreisgeometrie habe ich aber echt keine Ahnung :/
Code:
int height = y1-y0;
             int width = (int)Math.sqrt(((x1-x0)*(x1-x0)) + ((height)*(height)));
             int startAngle = 0;
             int arcAngle = 180;
             g.drawArc(x0, y0 - height, width, height, startAngle, arcAngle);

Würde mich freuen wenn ihr mir helfen könnt :) Rauskommen soll eine gekrümmte Linie (Kurve) zwischen zwei Punkten.

Danke!!
 
Man muss den Radius nur groß genug machen, dann kann man optisch keinen Unterschied zwischen Gerade und Kreis sehen.

Aber die Frage ist: Was genau willst du?
Du kannst die Punkte mit unendlich viele Kurven verbinden, was willst du konkret? Kannst du ein Beispiel zeichnen in z.B. Paint, um zu zeigen, wie du es dir vorstellst?
 
Danke für die schnelle Antwort.

Zeichnen möchte ich die roten Linien, siehe Anhang.

Am Ende möchte ich dann noch andere Objekte an bestimmten Punkten dieser Kurve zeichnen können (also z.B. Male Objekt A an der Stelle wo 80% der Strecke sind).
Hintergrund: es ist eine kleine Simulation..

beispiel.jpg
 
Zuletzt bearbeitet:
Ein Kreis kann immer durch drei Punkte eines Dreiecks führen. Ich vermute mal, Du willst die Mittelsenkrechten betstimmen und dann daraus den Kreis malen?
 
Leicht misverständlich meine Grafik, ich will wirklich die einzelnen Verbindungen zwischen den gemalten Rechtecken einzeln zeichnen, da es eine dynamische Anzahl von Rechtecken gibt, die untereinander immer verschieden verbunden sind. Soll also auch nicht wirklich Ellipsen oder Kreisförmig sein. Die äußeren Rechtecke sind jeweils durch direkte Linien und eine Kurve verbunden, innere Rechtecke nur durch direkte Linien...

Beim zeichnen gehe ich von dem Objekt dieser Verbindung aus, in dem Start und Endpunkt gespeichert sind, sowie ob es eine gerade oder kurvenförmige Verbindung sein soll.
Falls die X Koordinate vom Startpunkt größer als die X Koordinate vom Zielpunkt ist, muss die Kurve nach unten zeigen.
 
Zuletzt bearbeitet:
Soll es denn ein durchgehender Kreis sein? Ich vermute nicht? Glaube ich weniger, aber das wäre einfacher, weil die Kurven so zu zeichnen, dass sie an den Punkten keine Knicke haben, dürfte etwas aufwändiger werden... [Edit: Ich sehe gerade, dass du auch in deiner Zeichnung Knicks hast, also scheint das doch kein Problem zu sein]

Wenn du allerdings an bestimmten Punkten der Kurve noch was zeichnen willst, dann denke ich, wäre es am sinnvollsten die Kurven komplett selbst zu berechnen...

Und wie gesagt: Es gibt unendlich viele Möglichkeiten, für die Kurven.
 
Was wäre denn eine Möglichkeit so eine Kurve hinzukriegen und wie könnte das in Java Code aussehen?
 
QuadCurve2D ist auch nicht schlecht.

Das Problem ist halt, dass 2 Punkte keine Kurve definieren können.

Code:
import java.awt.*;
import javax.swing.*;
import java.util.Vector;
import java.awt.geom.QuadCurve2D;
import java.awt.geom.Rectangle2D;

@SuppressWarnings("serial")
public class Main extends JApplet {
	Canvas1 canvas;

	public static void main(String[] args) {
		JFrame frame = new JFrame("QuadCurve Example");
		Main curve = new Main();
		curve.init();
		frame.getContentPane().add(curve);
		frame.setSize(600, 250);
		frame.setVisible(true);
	}

	public void init() {
		Container container = getContentPane();
		canvas = new Canvas1();
		container.add(canvas);
	}

	class Canvas1 extends Canvas {
		Vector<QuadCurve2D> vector;
		QuadCurve2D quadCurve = null;
		Rectangle2D rec = null;

		public Canvas1() {
			setBackground(Color.white);
			setSize(500, 250);

			vector = new Vector<QuadCurve2D>();
			vector.addElement(new QuadCurve2D.Float(30, 30, 30, 130, 30, 200));
			vector.addElement(new QuadCurve2D.Float(30, 30, 180, 100, 30, 150));
			vector.addElement(new QuadCurve2D.Float(150, 30, 150, 130, 150, 200));
			vector.addElement(new QuadCurve2D.Float(150, 30, 220, 30, 220, 30));
			vector.addElement(new QuadCurve2D.Float(150, 130, 220, 130, 220,
					130));
			vector.addElement(new QuadCurve2D.Float(150, 200, 220, 200, 220,
					200));
			vector.addElement(new QuadCurve2D.Float(250, 30, 250, 130, 250, 200));
			vector.addElement(new QuadCurve2D.Float(250, 30, 350, 150, 350, 200));
			vector.addElement(new QuadCurve2D.Float(350, 30, 350, 130, 350, 200));
			vector.addElement(new QuadCurve2D.Float(420, 30, 420, 130, 420, 200));
			vector.addElement(new QuadCurve2D.Float(560, 30, 420, 70, 490, 120));
			vector.addElement(new QuadCurve2D.Float(490, 120, 560, 150, 450,
					200));

		}

		public void paint(Graphics g) {
			Graphics2D g2 = (Graphics2D) g;
			Stroke s = new BasicStroke(2.0f);
			g2.setStroke(s);
			for (int k = 0; k < vector.size(); k++) {
				g2.draw((QuadCurve2D) vector.elementAt(k));
			}
		}
	}
}
 
F_GXdx schrieb:
QuadCurve2D ist auch nicht schlecht.

Das Problem ist halt, dass 2 Punkte keine Kurve definieren können.

Code:
import java.awt.*;
import javax.swing.*;
import java.util.Vector;
import java.awt.geom.QuadCurve2D;
import java.awt.geom.Rectangle2D;

@SuppressWarnings("serial")
public class Main extends JApplet {
    Canvas1 canvas;

    public static void main(String[] args) {
        JFrame frame = new JFrame("QuadCurve Example");
        Main curve = new Main();
        curve.init();
        frame.getContentPane().add(curve);
        frame.setSize(600, 250);
        frame.setVisible(true);
    }

    public void init() {
        Container container = getContentPane();
        canvas = new Canvas1();
        container.add(canvas);
    }

    class Canvas1 extends Canvas {
        Vector<QuadCurve2D> vector;
        QuadCurve2D quadCurve = null;
        Rectangle2D rec = null;

        public Canvas1() {
            setBackground(Color.white);
            setSize(500, 250);

            vector = new Vector<QuadCurve2D>();
            vector.addElement(new QuadCurve2D.Float(30, 30, 30, 130, 30, 200));
            vector.addElement(new QuadCurve2D.Float(30, 30, 180, 100, 30, 150));
            vector.addElement(new QuadCurve2D.Float(150, 30, 150, 130, 150, 200));
            vector.addElement(new QuadCurve2D.Float(150, 30, 220, 30, 220, 30));
            vector.addElement(new QuadCurve2D.Float(150, 130, 220, 130, 220,
                    130));
            vector.addElement(new QuadCurve2D.Float(150, 200, 220, 200, 220,
                    200));
            vector.addElement(new QuadCurve2D.Float(250, 30, 250, 130, 250, 200));
            vector.addElement(new QuadCurve2D.Float(250, 30, 350, 150, 350, 200));
            vector.addElement(new QuadCurve2D.Float(350, 30, 350, 130, 350, 200));
            vector.addElement(new QuadCurve2D.Float(420, 30, 420, 130, 420, 200));
            vector.addElement(new QuadCurve2D.Float(560, 30, 420, 70, 490, 120));
            vector.addElement(new QuadCurve2D.Float(490, 120, 560, 150, 450,
                    200));

        }

        public void paint(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            Stroke s = new BasicStroke(2.0f);
            g2.setStroke(s);
            for (int k = 0; k < vector.size(); k++) {
                g2.draw((QuadCurve2D) vector.elementAt(k));
            }
        }
    }
}



HAHAHAHAHHA good one bro!
 
Kannst du deinen so "gehaltvollen" Beitrag auf dieses 6 Jahre alte Thema evtl. noch etwas naeher erlaeutern?

Und bevor du antwortest, den Unterschied zwischen Kurve und Gerade kennst du ja sicherlich?
 
  • Gefällt mir
Reaktionen: Ebrithil
Zurück
Oben