本文介绍了JavaFX - 用箭头绘制线条(画布)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我将此代码重写为JavaFX时遇到问题:
I have problem with rewrite this code to JavaFX:
private final int ARR_SIZE = 8;
void drawArrow(Graphics g1, int x1, int y1, int x2, int y2) {
Graphics2D g = (Graphics2D) g1.create();
g.setPaint(Color.BLACK);
double dx = x2 - x1, dy = y2 - y1;
double angle = Math.atan2(dy, dx);
int len = (int) Math.sqrt(dx * dx + dy * dy);
AffineTransform at = AffineTransform.getTranslateInstance(x1, y1);
at.concatenate(AffineTransform.getRotateInstance(angle));
g.transform(at);
g.drawLine(0, 0, len, 0);
g.fillPolygon(new int[] { len, len - ARR_SIZE, len - ARR_SIZE, len }, new int[] { 0, -ARR_SIZE, ARR_SIZE, 0 },
4);
}
我的解决方案无法正常运行,因为代码的结果:
my solution is not working correctly because the result of code:
drawArrow(gc, 200, 50, 50, 50);
。
预期结果是
。
private final int ARR_SIZE = 8;
void drawArrow(GraphicsContext gc, int x1, int y1, int x2, int y2) {
gc.setFill(Color.BLACK);
double dx = x2 - x1, dy = y2 - y1;
double angle = Math.atan2(dy, dx);
int len = (int) Math.sqrt(dx * dx + dy * dy);
Affine affine = new Affine(Affine.translate(x1, y1));
affine.createConcatenation(Affine.rotate(angle, 0, 0));
gc.setTransform(affine);
gc.strokeLine(0, 0, len, 0);
gc.fillPolygon(new double[]{len, len - ARR_SIZE, len - ARR_SIZE, len}, new double[]{0, -ARR_SIZE, ARR_SIZE, 0},
4);
}
你可以帮帮我吗?
推荐答案
这有两个原因:
- 旋转方式弧度而不是度:
Transform.rotate
期望以度为单位的角度(参见; javadoc forTransform.rotate
重定向那里),但返回弧度。 - 创建新的
转换
,而不是修改现有的转换
。
- Rotating by radians instead of degrees:
Transform.rotate
expects the angle in degrees (see javadoc forRotate
constructor; javadoc forTransform.rotate
"redirects" there), butMath.atan2
returns radians. Transform.createConcatenation
creates a newTransform
instead of modifying the existingTransform
.
此代码应该有效:
void drawArrow(GraphicsContext gc, int x1, int y1, int x2, int y2) {
gc.setFill(Color.BLACK);
double dx = x2 - x1, dy = y2 - y1;
double angle = Math.atan2(dy, dx);
int len = (int) Math.sqrt(dx * dx + dy * dy);
Transform transform = Transform.translate(x1, y1);
transform = transform.createConcatenation(Transform.rotate(Math.toDegrees(angle), 0, 0));
gc.setTransform(new Affine(transform));
gc.strokeLine(0, 0, len, 0);
gc.fillPolygon(new double[]{len, len - ARR_SIZE, len - ARR_SIZE, len}, new double[]{0, -ARR_SIZE, ARR_SIZE, 0},
4);
}
这篇关于JavaFX - 用箭头绘制线条(画布)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!