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

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

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

Это все. И вот что делает код:

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

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

Aubin 07.04.2019 09:35

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

Peter 07.04.2019 13:06

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

Andrew Thompson 07.04.2019 13:16

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

Peter 07.04.2019 13:22

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

Peter 07.04.2019 13:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

вам нужно что-то еще, чтобы построить стрелу?

Другие вопросы по теме