У меня есть очки
A (x1, y1)
B (x2, y2)
Мне нужно нарисовать наконечник стрелкиэта строка, но не в конце.Это должно быть некоторое расстояние от конца.Как бы эта штука сделала?
У меня есть:
---------------------->
Мне нужно:
----------------->-----
См. Изображение:
И это под углом:
Результат:
Спасибо, ребята, что помогли.Это для другого.
Давайте создадим основную функцию и нарисуем линию и стрелку:
private void drawLineWithArrowHead(Point from, Point to, Graphics2D graphics){
Polygon arrowHead = new Polygon();
arrowHead.addPoint( 0,6);
arrowHead.addPoint( -6, -6);
arrowHead.addPoint( 6,-6);int y1,y2,x1,x2;
x1=from.getPosX();
y1=from.getPosY();
x2=to.getPosX();
y2=to.getPosY();
Line2D.Double line = new Line2D.Double(x1,y1,x2,y2);
graphics.draw(line);
Позволяет загрузить старое аффинное преобразование и получить новое из строки:
AffineTransform tx, old_tx = graphics.getTransform();
tx = calcAffineTransformation(line);
Немного математики:
double dx = (x2-x1), dy = (y2-y1);
double len = Math.sqrt(dx*dx + dy*dy);
double udx = dx/len, udy = dy/len;
double cordx = x2 - (size-5) * udx, cordy = y2 - (size-5) * udy;
double r_cordx = x2 - (size+3) * udx, r_cordy = y2 - (size+3) * udy;
А теперь поместите эту стрелку:
tx.setToIdentity(); // null transform to origin
double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1);
!! important !! must firstly translate secondly rotate
tx.translate( cordx, cordy ); // setup of cord of arrowhead
tx.rotate((angle - Math.PI / 2d)); // head rotate
graphics.setTransform(tx); // set transform for graphics
graphics.fill(arrowHead);
graphics.setTransform(old_tx); // get original transform back
Функция CalcAffineTransformation для получения положения строки и поворота:
private AffineTransform calcAffineTransformation(Line2D.Double line) {
AffineTransform transformation = new AffineTransform();
transformation.setToIdentity();
double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1);
transformation.translate(line.x2, line.y2);
transformation.rotate((angle - Math.PI / 2d));
return transformation;
}
Это все.И вот что делает код: