/** * Draws an arrow on the given Graphics2D context * @param g The Graphics2D context to draw on * @param x The x location of the "tail" of the arrow * @param y The y location of the "tail" of the arrow * @param xx The x location of the "head" of the arrow * @param yy The y location of the "head" of the arrow */ private void drawArrow( Graphics2D g, int x, int y, int xx, int yy ) { float arrowWidth = 10.0f ; float theta = 0.423f ; int[] xPoints = new int[ 3 ] ; int[] yPoints = new int[ 3 ] ; float[] vecLine = new float[ 2 ] ; float[] vecLeft = new float[ 2 ] ; float fLength; float th; float ta; float baseX, baseY ; xPoints[ 0 ] = xx ; yPoints[ 0 ] = yy ; // build the line vector vecLine[ 0 ] = (float)xPoints[ 0 ] - x ; vecLine[ 1 ] = (float)yPoints[ 0 ] - y ; // build the arrow base vector - normal to the line vecLeft[ 0 ] = -vecLine[ 1 ] ; vecLeft[ 1 ] = vecLine[ 0 ] ; // setup length parameters fLength = (float)Math.sqrt( vecLine[0] * vecLine[0] + vecLine[1] * vecLine[1] ) ; th = arrowWidth / ( 2.0f * fLength ) ; ta = arrowWidth / ( 2.0f * ( (float)Math.tan( theta ) / 2.0f ) * fLength ) ; // find the base of the arrow baseX = ( (float)xPoints[ 0 ] - ta * vecLine[0]); baseY = ( (float)yPoints[ 0 ] - ta * vecLine[1]); // build the points on the sides of the arrow xPoints[ 1 ] = (int)( baseX + th * vecLeft[0] ); yPoints[ 1 ] = (int)( baseY + th * vecLeft[1] ); xPoints[ 2 ] = (int)( baseX - th * vecLeft[0] ); yPoints[ 2 ] = (int)( baseY - th * vecLeft[1] ); g.drawLine( x, y, (int)baseX, (int)baseY ) ; g.fillPolygon( xPoints, yPoints, 3 ) ; }