import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class Arrows
{
public static void main(String[] args)
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new ArrowPanel());
f.setSize(500,400);
f.setLocation(200,200);
f.setVisible(true);
}
}
class ArrowPanel extends JPanel
{
int barb;
double phi;
public ArrowPanel()
{
barb = 20; // barb length
phi = Math.PI/6; // 30 degrees barb angle
setBackground(Color.white);
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int w = getWidth();
int h = getHeight();
double theta, x, y;
g2.setPaint(Color.blue);
double x1 = w*3/24, y1 = h*3/32, x2 = w*11/24, y2 = y1;
g2.draw(new Line2D.Double(x1, y1, x2, y2));
// draw this arrow head at point x2, y2 and measure
// angle theta relative to same point, ie, y2 - and x2 -
theta = Math.atan2(y2 - y1, x2 - x1);
drawArrow(g2, theta, x2, y2);
x1 = w*3/8; y1 = h*13/15; x2 = w*2/3; y2 = y1;
g2.draw(new Line2D.Double(x1, y1, x2, y2));
theta = Math.atan2(y1 - y2, x1 - x2);
drawArrow(g2, theta, x1, y1);
g2.setPaint(Color.red);
x1 = w*3/24; y1 = h*4/32; x2 = x1; y2 = h*18/32;
g2.draw(new Line2D.Double(x1, y1, x2, y2));
theta = Math.atan2(y2 - y1, x2 - x1);
drawArrow(g2, theta, x2, y2);
g2.setPaint(Color.orange);
x1 = w*5/32; y1 = h*27/32; x2 = w*27/32; y2 = h*5/32;
g2.draw(new Line2D.Double(x1, y1, x2, y2));
theta = Math.atan2(y2 - y1, x2 - x1);
drawArrow(g2, theta, x2, y2);
g2.setPaint(Color.green.darker());
x1 = w/2; y1 = h/2; x2 = w*27/32; y2 = h*27/32;
g2.draw(new Line2D.Double(x1, y1, x2, y2));
theta = Math.atan2(y2 - y1, x2 - x1);
drawArrow(g2, theta, x2, y2);
}
private void drawArrow(Graphics2D g2, double theta, double x0, double y0)
{
double x = x0 - barb * Math.cos(theta + phi);
double y = y0 - barb * Math.sin(theta + phi);
g2.draw(new Line2D.Double(x0, y0, x, y));
x = x0 - barb * Math.cos(theta - phi);
y = y0 - barb * Math.sin(theta - phi);
g2.draw(new Line2D.Double(x0, y0, x, y));
}
}