绘制箭头不起作用
Drawing an arrow doesn't work
我正在尝试在 JavaFX 中绘制箭头。我做了所有的数学计算,甚至计算了弧度。出于某种原因,我的箭头未正确绘制。我几乎认为它与三角函数的domain/range有关,但我不能确定。
这是我的代码:
package com.neonorb.test;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
public class ArrowTest extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
double startx = 200;
double starty = 100;
double endx = 100;
double endy = 300;
double arrowAngle = Math.toRadians(45.0);
double arrowLength = 10.0;
double lineAngle = Math.atan((startx - endx) / (starty - endy));
double x1 = Math.asin((arrowAngle + lineAngle) / arrowLength) + endx;
double y1 = Math.acos((arrowAngle + lineAngle) / arrowLength) + endy;
double x2 = Math.asin((arrowAngle - lineAngle) / arrowLength) + endx;
double y2 = Math.acos((arrowAngle - lineAngle) / arrowLength) + endy;
Group root = new Group();
Line line = new Line(startx, starty, endx, endy);
Line arrowHead1 = new Line(endx, endy, x1, y1);
Line arrowHead2 = new Line(endx, endy, x2, y2);
root.getChildren().addAll(line, arrowHead1, arrowHead2);
primaryStage.setScene(new Scene(root, 800, 600));
primaryStage.show();
}
}
很难"answer"这个(非问题)有超过...
...你的数学在几个方面搞砸了:
- 应该是
sin
和cos
而不是asin
和acos
- 应该是
sin(x)*length
,而不是sin(x/length)
sin
和 cos
已互换
- 线的角度最好用
atan2
来计算(你使用的 atan
函数有一些问题,特别是 starty==endy
)
- 应将 "offsets" 添加到直线角度 - 特别是,它应该是
lineAngle - arrowAngle
而不是 arrowAngle - lineAngle
完整代码,已更新:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
public class ArrowTest extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
double startx = 200;
double starty = 100;
double endx = 100;
double endy = 300;
double arrowAngle = Math.toRadians(45.0);
double arrowLength = 10.0;
double lineAngle = Math.atan2(starty - endy, startx - endx);
double x1 = Math.cos(lineAngle + arrowAngle) * arrowLength + endx;
double y1 = Math.sin(lineAngle + arrowAngle) * arrowLength + endy;
double x2 = Math.cos(lineAngle - arrowAngle) * arrowLength + endx;
double y2 = Math.sin(lineAngle - arrowAngle) * arrowLength + endy;
Group root = new Group();
Line line = new Line(startx, starty, endx, endy);
Line arrowHead1 = new Line(endx, endy, x1, y1);
Line arrowHead2 = new Line(endx, endy, x2, y2);
root.getChildren().addAll(line, arrowHead1, arrowHead2);
primaryStage.setScene(new Scene(root, 800, 600));
primaryStage.show();
}
}
我正在尝试在 JavaFX 中绘制箭头。我做了所有的数学计算,甚至计算了弧度。出于某种原因,我的箭头未正确绘制。我几乎认为它与三角函数的domain/range有关,但我不能确定。
这是我的代码:
package com.neonorb.test;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
public class ArrowTest extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
double startx = 200;
double starty = 100;
double endx = 100;
double endy = 300;
double arrowAngle = Math.toRadians(45.0);
double arrowLength = 10.0;
double lineAngle = Math.atan((startx - endx) / (starty - endy));
double x1 = Math.asin((arrowAngle + lineAngle) / arrowLength) + endx;
double y1 = Math.acos((arrowAngle + lineAngle) / arrowLength) + endy;
double x2 = Math.asin((arrowAngle - lineAngle) / arrowLength) + endx;
double y2 = Math.acos((arrowAngle - lineAngle) / arrowLength) + endy;
Group root = new Group();
Line line = new Line(startx, starty, endx, endy);
Line arrowHead1 = new Line(endx, endy, x1, y1);
Line arrowHead2 = new Line(endx, endy, x2, y2);
root.getChildren().addAll(line, arrowHead1, arrowHead2);
primaryStage.setScene(new Scene(root, 800, 600));
primaryStage.show();
}
}
很难"answer"这个(非问题)有超过...
...你的数学在几个方面搞砸了:
- 应该是
sin
和cos
而不是asin
和acos
- 应该是
sin(x)*length
,而不是sin(x/length)
sin
和cos
已互换- 线的角度最好用
atan2
来计算(你使用的atan
函数有一些问题,特别是starty==endy
) - 应将 "offsets" 添加到直线角度 - 特别是,它应该是
lineAngle - arrowAngle
而不是arrowAngle - lineAngle
完整代码,已更新:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
public class ArrowTest extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
double startx = 200;
double starty = 100;
double endx = 100;
double endy = 300;
double arrowAngle = Math.toRadians(45.0);
double arrowLength = 10.0;
double lineAngle = Math.atan2(starty - endy, startx - endx);
double x1 = Math.cos(lineAngle + arrowAngle) * arrowLength + endx;
double y1 = Math.sin(lineAngle + arrowAngle) * arrowLength + endy;
double x2 = Math.cos(lineAngle - arrowAngle) * arrowLength + endx;
double y2 = Math.sin(lineAngle - arrowAngle) * arrowLength + endy;
Group root = new Group();
Line line = new Line(startx, starty, endx, endy);
Line arrowHead1 = new Line(endx, endy, x1, y1);
Line arrowHead2 = new Line(endx, endy, x2, y2);
root.getChildren().addAll(line, arrowHead1, arrowHead2);
primaryStage.setScene(new Scene(root, 800, 600));
primaryStage.show();
}
}