2010-06-09 14 views
13

Hat jemand einen Algorithmus zum Zeichnen eines Pfeils in der Mitte einer gegebenen Linie. Ich habe nach Google gesucht, aber keine gute Implementierung gefunden.Zeichnen Pfeil auf Linie Algorithmus

P.S. Die Sprache macht mir nichts aus, aber es wäre toll, wenn es Java wäre, da es die Sprache ist, die ich dafür benutze.

Vielen Dank im Voraus.

+0

Ist dies ein Pfeil in der Mitte einer Linie? Oder daraus zu kommen? Oder eine Pfeilspitze, die entlang der Linie verläuft? –

+0

eine, die entlang der Linie verläuft. – nunos

Antwort

20

Hier ist eine Funktion, um einen Pfeil mit seinem Kopf an einem Punkt p zu zeichnen. Sie würden dies auf den Mittelpunkt Ihrer Linie setzen. dx und dy sind die Linienrichtung, die gegeben ist durch (x1 - x0, y1 - y0). Dies ergibt einen Pfeil, der auf die Zeilenlänge skaliert wird. Normalisieren Sie diese Richtung, wenn der Pfeil immer die gleiche Größe haben soll.

private static void DrawArrow(Graphics g, Pen pen, Point p, float dx, float dy) 
{ 
    const double cos = 0.866; 
    const double sin = 0.500; 
    PointF end1 = new PointF(
     (float)(p.X + (dx * cos + dy * -sin)), 
     (float)(p.Y + (dx * sin + dy * cos))); 
    PointF end2 = new PointF(
     (float)(p.X + (dx * cos + dy * sin)), 
     (float)(p.Y + (dx * -sin + dy * cos))); 
    g.DrawLine(pen, p, end1); 
    g.DrawLine(pen, p, end2); 
} 
+2

Wie würde man die Größe der Pfeilspitze anpassen? Ich mag es, dass es auf der Länge der Linie basiert, aber das aktuelle Verhältnis von Pfeilspitzengröße zu Liniengröße ist für meine Anwendung falsch. – renosis

11

Hier ist eine Methode zum Hinzufügen einer Pfeilspitze zu einer Linie. Sie müssen nur die Koordinaten Ihrer Pfeilspitze und des Schwanzes angeben.

private static void drawArrow(int tipX, int tailX, int tipY, int tailY, Graphics2D g) 
{ 
    int arrowLength = 7; //can be adjusted 
    int dx = tipX - tailX; 
    int dy = tipY - tailY; 

    double theta = Math.atan2(dy, dx); 

    double rad = Math.toRadians(35); //35 angle, can be adjusted 
    double x = tipX - arrowLength * Math.cos(theta + rad); 
    double y = tipY - arrowLength * Math.sin(theta + rad); 

    double phi2 = Math.toRadians(-35);//-35 angle, can be adjusted 
    double x2 = tipX - arrowLength * Math.cos(theta + phi2); 
    double y2 = tipY - arrowLength * Math.sin(theta + phi2); 

    int[] arrowYs = new int[3]; 
    arrowYs[0] = tipY; 
    arrowYs[1] = (int) y; 
    arrowYs[2] = (int) y2; 

    int[] arrowXs = new int[3]; 
    arrowXs[0] = tipX; 
    arrowXs[1] = (int) x; 
    arrowXs[2] = (int) x2; 

    g.fillPolygon(arrowXs, arrowYs, 3); 
} 
+0

Vielen Dank ... du hast mir viel Zeit gespart ... –