2010-06-09 7 views
13

Est-ce que quelqu'un a un algorithme pour dessiner une flèche au milieu d'une ligne donnée? J'ai cherché google mais je n'ai trouvé aucune bonne implémentation.Dessiner une flèche sur l'algorithme

P.S. Cela ne me dérange pas vraiment la langue, mais ce serait génial si c'était Java, puisque c'est la langue que j'utilise pour cela.

Merci d'avance.

+0

Est-ce une flèche pointant vers le milieu d'une ligne? Ou en venant? Ou une pointe de flèche qui court le long de la ligne? –

+0

celui qui court le long de la ligne. – nunos

Répondre

20

Voici une fonction pour dessiner une flèche avec sa tête en un point p. Vous placeriez ceci au milieu de votre ligne. dx et dy sont la direction de la ligne, qui est donnée par (x1 - x0, y1 - y0). Cela donnera une flèche qui est mise à l'échelle de la longueur de la ligne. Normalisez cette direction si vous voulez que la flèche soit toujours de la même taille.

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

Comment ajuster la taille de la tête de flèche? J'aime l'avoir en fonction de la longueur de la ligne, mais le ratio actuel de la taille de la pointe de flèche à la taille de la ligne est incorrect pour mon application. – renosis

11

Voici une méthode pour ajouter une tête de flèche à une ligne. Il vous suffit de lui donner les coordonnées de votre flèche et de votre queue.

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

Merci beaucoup ... vous avez économisé beaucoup de temps ... –