Hallo!
ich habe mir eine eigene Pfeil-Klasse programmiert, der ich zwei Punkte übergebe und sie zeichnet dann einen Pfeil vom ersten zum zweiten Punkt. Ich habe die Klasse auch überladen, so dass ich Farbe, Strichdicke usw. ändern kann, aber das ist nicht das Problem.
Zuerst bin ich so vorgegangen, dass ich einfach eine Linie von P1 zu P2 zeichne und dann aus den Punkten den Winkel zwischen der Linie und der Horizontalen ausrechne. Dadurch kann ich dann das Koordinatensystem in den Endpunkt schieben und dann dort um diesen Winkel drehen und ein Dreieck (die Pfeilspitze) zeichen.
Das hat auch geklappt, nur hatte ich hier das Problem, dass ich, wenn ich einen Pfeil zeichne diesen nicht von P1 zu P2 zeichne, sondern noch ein bisschen weiter, weil ja die Spitze "obendrauf" gezeichnet wird. Dann habe ich das zu korrigieren versucht und bin auf das nächste Problem gestoßen, den Drehwinkel. irgendwie habe ich das mit der Drehung noch nicht richtig verstanden, denn manche Winkel klappen nicht, da wird dann die Vektorspitze wo anders oder falsch gezeichnet.
Ich werde jetzt auf jeden Fall weiter suchen ob ich da noch selbst draufkomme, aber wenn ihr es euch mal durchsehen könntet wäre super.
Hier der Code:
Vielen Dank,
Fabi
ich habe mir eine eigene Pfeil-Klasse programmiert, der ich zwei Punkte übergebe und sie zeichnet dann einen Pfeil vom ersten zum zweiten Punkt. Ich habe die Klasse auch überladen, so dass ich Farbe, Strichdicke usw. ändern kann, aber das ist nicht das Problem.
Zuerst bin ich so vorgegangen, dass ich einfach eine Linie von P1 zu P2 zeichne und dann aus den Punkten den Winkel zwischen der Linie und der Horizontalen ausrechne. Dadurch kann ich dann das Koordinatensystem in den Endpunkt schieben und dann dort um diesen Winkel drehen und ein Dreieck (die Pfeilspitze) zeichen.
Das hat auch geklappt, nur hatte ich hier das Problem, dass ich, wenn ich einen Pfeil zeichne diesen nicht von P1 zu P2 zeichne, sondern noch ein bisschen weiter, weil ja die Spitze "obendrauf" gezeichnet wird. Dann habe ich das zu korrigieren versucht und bin auf das nächste Problem gestoßen, den Drehwinkel. irgendwie habe ich das mit der Drehung noch nicht richtig verstanden, denn manche Winkel klappen nicht, da wird dann die Vektorspitze wo anders oder falsch gezeichnet.
Ich werde jetzt auf jeden Fall weiter suchen ob ich da noch selbst draufkomme, aber wenn ihr es euch mal durchsehen könntet wäre super.
Hier der Code:
Java:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Stroke;
import java.awt.geom.AffineTransform;
public class myVector{
/**zeichnet einen Vektorpfeil zwischen zwei Punkten (Point d, Point i)
* Point d= Startpunkt
* Point i= Endpunkt*/
//variablen
Point start = new Point();
Point ende = new Point();
Point origin= new Point(0, 0);
int apex = 20;
double winkel= 0;
Color color = Color.red;
BasicStroke stroke1
= new BasicStroke(3.0f, BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_MITER);
public myVector(Point d, Point i, Point Ursprung){ //d ist Startpunkt und i Endpunkt des Vektors
start= d;
ende= i;
origin= Ursprung;
}//public Vector(point, point)
public myVector(Point d, Point i, Color c, BasicStroke stroke, int Apex, Point Ursprung){
start= d;
ende= i;
color= c;
stroke1= stroke;
apex= Apex;
origin= Ursprung;
}//public Vector(point, point, color, stroke, apex
void draw( Graphics gr){
Polygon pfeil = new Polygon();
Point eck1 = new Point();
Point eck2 = new Point();
if (start.y- ende.y!= 0){
winkel= Math.atan((ende.x- start.x)/(start.y- ende.y));
//berechnet den drehwinkel für die Pfeilspitze aus den Punkten 'start' und 'ende'
}
else if (start.x> ende.x){
winkel= Math.PI;
}
else if (start.x< ende.x){
winkel= -Math.PI;
}
else {
winkel= 2* Math.PI;
}
AffineTransform origTransform = ((Graphics2D) gr).getTransform();
//originaltransformation speichern
AffineTransform transformer2= new AffineTransform();
transformer2.translate(origin.x, origin.y);
AffineTransform transformer = new AffineTransform();
transformer.translate(ende.x+ origin.x, ende.y+ origin.y- (int)(1.5* apex));
//Rotation des Koordinatensystems
if (ende.y>= start.y && ende.x>= start.x) {
transformer.rotate (winkel );
}
else {
transformer.rotate(winkel);
}
((Graphics2D) gr).setTransform(transformer);
eck1.x = +apex/ 2;
eck1.y = 0;
eck2.x = -apex/ 2;
eck2.y = 0;
pfeil.addPoint(0, (int)(1.5* apex));
pfeil.addPoint(eck1.x, eck1.y);
pfeil.addPoint(eck2.x, eck2.y);
Stroke stroke2 = ((Graphics2D) gr).getStroke();
((Graphics2D) gr).setStroke(stroke1);
gr.setColor(color);
gr.fillPolygon(pfeil);
((Graphics2D) gr).setTransform(transformer2);
gr.drawLine(start.x, start.y, ende.x, ende.y);
gr.fillOval(start.x- 3, start.y- 3, 6, 6);
((Graphics2D) gr).setStroke(stroke2);
((Graphics2D) gr).setTransform(origTransform);
}//void draw
}//public class Vector
Vielen Dank,
Fabi
Zuletzt bearbeitet von einem Moderator: