java - 如何创建一条头部与末端有一段距离的线 - java / awt
问题描述
我有积分
A(x1, y1)
B(x2, y2)
我需要画这条线的箭头,但不是画在最后。距离终点一定有一段距离。这东西要怎么做?
我有:
---------------------->
我需要:
----------------->-----
见图片:
这是角度:
结果:
谢谢你们的帮助。这是另一个。
让我们创建 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;
}
就这样。这就是代码的作用:
解决方案
你的线有方向向量
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
你需要别的东西来建造箭头吗?
推荐阅读
- python - Read multiple excel files in order from folder with Python
- angular - 从祖父类设置子列表值
- c# - 带有 Xaml.Behaviors.Wpf 的 Caliburn Micro,无法在事件触发器中包含操作消息
- npm - 继承或共享 package.json 依赖项
- r - 从 R 中的下一行赋值
- ruby-on-rails - 批量分配现有记录轨道的集合
- android - 我如何访问资产文件夹?
- react-native - 不变违规:分配变量时,对象作为 React 子项无效
- javascript - 无法在 setter 的 p-autocomplete 中将值绑定到 ngModel
- python - 初始化一个字典,其中每个项目都是空唯一列表的列表