2010-06-09 17 views
13

Qualcuno ha un algoritmo per disegnare una freccia nel mezzo di una determinata linea. Ho cercato google ma non ho trovato alcuna buona implementazione.Algoritmo freccia su linea

P.S. In realtà non mi interessa il linguaggio, ma sarebbe fantastico se fosse Java, dal momento che è la lingua che sto usando per questo.

Grazie in anticipo.

+0

Si tratta di una freccia che punta al centro di una linea? O venendo da esso? O una punta di freccia che corre lungo la linea? –

+0

uno che corre lungo la linea. – nunos

risposta

20

Ecco una funzione per disegnare una freccia con la testa in un punto p. Lo imposteresti nel punto medio della tua linea. dx e dy sono la direzione della linea, che è data da (x1 - x0, y1 - y0). Questo darà una freccia che è ridimensionata alla lunghezza della linea. Normalizza questa direzione se vuoi che la freccia abbia sempre le stesse dimensioni.

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

Come si può regolare la dimensione della punta della freccia? Mi piace averlo basato sulla lunghezza della linea, ma il rapporto attuale tra la dimensione della punta della freccia e la dimensione della linea non è corretto per la mia applicazione. – renosis

11

Ecco un metodo per aggiungere una freccia a una linea. Devi solo dargli le coordinate della punta e della coda della tua freccia.

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

Grazie mille ... mi hai salvato un sacco di tempo ... –

Problemi correlati