Как создать линию, начало которой находится на некотором расстоянии от ее конца — java / awt

#java #geometry #awt #line #java-2d

#java #геометрия #awt #линия #java-2d

Вопрос:

У меня есть точки

A(x1, y1)

B(x2, y2)

Мне нужно нарисовать стрелку этой линии, но не в конце. Это должно быть на некотором расстоянии от конца. Каким образом эта вещь будет работать?

У меня есть:

     ---------------------->
  

Мне нужно:

     ----------------->-----
  

Смотрите изображение:

И это с angle:

Результат:

Спасибо вам, ребята, за помощь. Это для другого.

Давайте создадим функцию main и нарисуем линию и наконечник стрелки:

    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;
   }
  

Вот и все. И это то, что делает код:

Комментарии:

1. Пожалуйста, опубликуйте скриншот того, что вы получаете, и черновик того, что вы хотите.

2. проблема в том, что это максимум, что я могу сделать. далее, это математическая задача, с которой я не могу давать советы, поскольку эта часть математики не является моей сильной стороной. Но моя идея заключается в том, что вокруг заданной точки B должна быть создана окружность с центром B и радиусом указанной длины, а точка пересечения круга и линии — это точка, которую я хочу. К сожалению, я не могу интерпретировать это математически.

3. «проблема в том, что это максимум, что я могу сделать». Совет: Добавьте @Aubin (или кого бы то ни было, @ важно), чтобы уведомить пользователя о новом комментарии. Причина, по которой я предложил вам опубликовать MCVE, заключается в том, что он предоставляет полный шаблон, на котором можно протестировать идеи для завершения задачи. Не (строго) нужно показывать попытку сделать это. Но если вам не удалось предоставить этот шаблон, я не могу беспокоиться о дальнейшей помощи. Итак .. ваш звонок.

4. @AndrewThompson Спасибо за информацию, я добавил идею о том, как это должно быть или как я себе это представляю. Но есть математические вычисления, которые, вероятно, должны быть Math.atan2 (), но я не уверен.

5. @Aubin Я добавляю некоторое изображение для этой проблемы.

Ответ №1:

Ваша линия имеет вектор направления

  dx, dy = (x2 - x1), (y2 - y1)
  

Ее длина равна

  len = sqrt(dx*dx   dy*dy)
  

Вектор направления единицы равен

 udx, udy = dx/len, dy/len
  

Укажите на расстоянии D от конца (это начальная точка стрелки, как я понимаю):

 x3, y3 = x2 - D * udx, y2 - D * udy
  

вам нужно что-то еще для построения стрелки?