Hallo Forum,
weiss jemand ob, bzw. wie es möglich ist einen geschlossenen Spline aus einer gegebenen Punktemenge zu erzeugen. Es müsste nicht unbedingt ein Spline sein, aber die Kurve soll glatt sein und durch die gegebenen Punkte gehen.
Anbei mein hilfloser und offensichtlich ungeeigneter Versuch einen Kreis anzunaehern, ich verwende als Kontrollpunkte für curveTo jeweils den vorigen und den folgenden Punkt.
Grüße,
bronkowitz
weiss jemand ob, bzw. wie es möglich ist einen geschlossenen Spline aus einer gegebenen Punktemenge zu erzeugen. Es müsste nicht unbedingt ein Spline sein, aber die Kurve soll glatt sein und durch die gegebenen Punkte gehen.
Anbei mein hilfloser und offensichtlich ungeeigneter Versuch einen Kreis anzunaehern, ich verwende als Kontrollpunkte für curveTo jeweils den vorigen und den folgenden Punkt.
Grüße,
bronkowitz
Java:
package spline;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Arc2D;
import java.awt.geom.GeneralPath;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.border.Border;
public class Main {
private static Hauptfenster hauptfenster;
private static GeneralPath spline = new GeneralPath();
private static Arc2D.Double kreis = new Arc2D.Double();
private static double mitteX, mitteY, radius, delta, phi;
private static double xprev, yprev, x, y, xnext, ynext;
public static void main(String[] args) {
hauptfenster = new Hauptfenster();
hauptfenster.pack();
hauptfenster.setVisible(true);
hauptfenster.setExtendedState(Frame.MAXIMIZED_BOTH);
mitteX = 300.0;
mitteY = 300.0;
radius = 100.0;
// Aufloesung
int n = 8;
// Winkelinkrement
delta = 2.0 * Math.PI / ((double)n);
// Startpunkt
spline.moveTo(mitteX + radius, mitteY);
// erstes Segment
xprev = radius + mitteX;
yprev = mitteY;
x = radius * Math.cos(delta) + mitteX;
y = radius * Math.sin(delta) + mitteY;
xnext = radius * Math.cos(2.0 * delta) + mitteX;
ynext = radius * Math.sin(2.0 * delta) + mitteY;
spline.curveTo(xprev, yprev, xnext, ynext, x, y);
// weitere Segmente
for (int i = 2; i < n - 1; i++)
{
xprev = x;
yprev = y;
x = xnext;
y = ynext;
phi = delta * (i + 1);
xnext = radius * Math.cos(phi) + mitteX;
ynext = radius * Math.sin(phi) + mitteY;
spline.curveTo(xprev, yprev, xnext, ynext, x, y);
}
// letztes Segment
xprev = x;
yprev = y;
x = xnext;
y = ynext;
xnext = radius + mitteX;
ynext = mitteY;
spline.curveTo(xprev, yprev, xnext, ynext, x, y);
// Kurve schliessen
spline.closePath();
// Kreis zum Vergleich
kreis = new Arc2D.Double(200.0, 200.0, 200.0, 200.0, 0.0, 360.0, Arc2D.OPEN);
}
public static void zeichnen(Graphics2D g){
g.draw(spline);
g.draw(kreis);
}
}
class Hauptfenster extends JFrame {
private Zeichenflaeche zeichenflaeche;
public Hauptfenster(){
super();
zeichenflaeche = new Zeichenflaeche();
add(zeichenflaeche);
zeichenflaeche.setBackground(Color.WHITE);
this.pack();
validate();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
class Zeichenflaeche extends JPanel {
public Zeichenflaeche(){
super();
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Main.zeichnen(g2);
}
}