2010-06-09 28 views
13

¿Alguien tiene un algoritmo para dibujar una flecha en el medio de una línea determinada? He buscado google pero no he encontrado ninguna buena implementación.Dibujar algoritmo de flecha en línea

P.S. Realmente no me importa el lenguaje, pero sería genial si fuera Java, ya que es el lenguaje que estoy usando para esto.

Gracias de antemano.

+0

¿Es esta una flecha que apunta en el medio de una línea? O viniendo de eso? ¿O una punta de flecha que corre a lo largo de la línea? –

+0

uno que se ejecuta a lo largo de la línea. – nunos

Respuesta

20

Aquí hay una función para dibujar una flecha con su cabeza en un punto p. Usted establecería esto en el punto medio de su línea. dx y dy son la dirección de la línea, que está dada por (x1 - x0, y1 - y0). Esto dará una flecha que se escala a la longitud de la línea. Normalice esta dirección si desea que la flecha siempre tenga el mismo tamaño.

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

¿Cómo se puede ajustar el tamaño de la punta de flecha? Me gusta tenerlo en función de la longitud de la línea, pero la proporción actual entre el tamaño de la punta de flecha y el tamaño de línea es incorrecta para mi aplicación. – renosis

11

Aquí hay un método para agregar una punta de flecha a una línea. Solo tienes que darle las coordenadas de tu punta y cola de flecha.

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

Muchas gracias ... me ahorraste mucho tiempo ... –

Cuestiones relacionadas