Hallo,
ich lasse eine Bezier Kurve zeichnen, die dann von Hand veränderbar ist. Ich suche nun nach einer Möglichkeit die Koordinaten von einigen weiteren Punkten auf der Kurve zu erhalten.
Wird die Bezier Kurve mit Hilfe der draw-Methode stückchenweise interpoliert und dann jeweils gezeichnet? Wenn das stimmt, gibt es vielleicht eine Möglichkeit die Koordinaten der einzelnen Punkte auszugeben, zwischen denen interpoliert wird? Oder eine andere Möglichkeit die Koordinaten von weiteren Punkten zu erhalten, die auf der Kurve liegen?
Bitte um eine Antwort für Java Anfänger =)
Hier mal der Code:
Gruß und Danke vorab
ich lasse eine Bezier Kurve zeichnen, die dann von Hand veränderbar ist. Ich suche nun nach einer Möglichkeit die Koordinaten von einigen weiteren Punkten auf der Kurve zu erhalten.
Wird die Bezier Kurve mit Hilfe der draw-Methode stückchenweise interpoliert und dann jeweils gezeichnet? Wenn das stimmt, gibt es vielleicht eine Möglichkeit die Koordinaten der einzelnen Punkte auszugeben, zwischen denen interpoliert wird? Oder eine andere Möglichkeit die Koordinaten von weiteren Punkten zu erhalten, die auf der Kurve liegen?
Bitte um eine Antwort für Java Anfänger =)
Hier mal der Code:
Code:
package test;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.CubicCurve2D;
import java.awt.geom.GeneralPath;
import java.awt.geom.PathIterator;
public class SplineLab extends Frame implements MouseListener, MouseMotionListener {
private int[] xs = { 100, 500, 600, 1000 };
private int[] ys = { 500, 300, 300, 500 };
private int dragIndex = NOT_DRAGGING;
private final static int NEIGHBORHOOD = 15;
private final static int NOT_DRAGGING = -1;
public static void main(String[] args) {
(new SplineLab()).setVisible(true);
}
SplineLab() {
setSize(1100, 1000);
addMouseListener(this);
addMouseMotionListener(this);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void paint(Graphics g) {
for (int i = 0; i < 4; i++) {
if (i == 0 || i == 3)
g.setColor(Color.blue);
else
g.setColor(Color.cyan);
g.fillOval(xs[i] - 6, ys[i] - 6, 12, 12);
}
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.black);
GeneralPath path = new GeneralPath();
path.moveTo(xs[0], ys[0]);
path.curveTo(xs[1], ys[1], xs[2], ys[2], xs[3], ys[3]);
g2d.draw(path);
}
public void mousePressed(MouseEvent e) {
dragIndex = NOT_DRAGGING;
int minDistance = Integer.MAX_VALUE;
int indexOfClosestPoint = -1;
for (int i = 0; i < 4; i++) {
int deltaX = xs[i] - e.getX();
int deltaY = ys[i] - e.getY();
int distance = (int) (Math.sqrt(deltaX * deltaX + deltaY * deltaY));
if (distance < minDistance) {
minDistance = distance;
indexOfClosestPoint = i;
}
}
if (minDistance > NEIGHBORHOOD)
return;
dragIndex = indexOfClosestPoint;
}
public void mouseReleased(MouseEvent e) {
if (dragIndex == NOT_DRAGGING)
return;
xs[dragIndex] = e.getX();
ys[dragIndex] = e.getY();
dragIndex = NOT_DRAGGING;
repaint();
}
public void mouseDragged(MouseEvent e) {
if (dragIndex == NOT_DRAGGING)
return;
xs[dragIndex] = e.getX();
ys[dragIndex] = e.getY();
repaint();
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
}
}
Gruß und Danke vorab