java - 如何创建一条线,其头部距其末端有一定距离 - java/awt

标签 java geometry awt line java-2d

我有积分

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

仅此而已。这就是代码的作用:

最佳答案

你的线有方向 vector

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

它的长度是

 len = sqrt(dx*dx + dy*dy)

单位方向 vector 为

udx, udy = dx/len, dy/len

点距末端距离D(据我所知,这是箭头的头点):

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

你还需要其他东西来构建箭头吗?

关于java - 如何创建一条线,其头部距其末端有一定距离 - java/awt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55556468/

相关文章:

java - 异步发送邮件

javascript - 使用圆半径查找坐标来创建形状

java - 当用户在 Windows 设置上更改屏幕分辨率时,如何使用 Java 获得正确的显示 DPI?

java - 如何使用 java awt.Graphics2D 绘制锥度轮廓

java - 使用 Gson 将 JSON 数组解析为 java.util.List

javascript - 相机打开时的边界或限制

opencv - 如何从极坐标中找到一条线(霍夫变换混淆)

opencv - 从圆形照片定义 3D 场景

java - Java AWT 的不正确对齐错误。无法移动我的标签

java - tibco 静态桥队列与静态持久队列