Chr*_*ith 0 java trigonometry javafx
我想在JavaFX中绘制一个箭头.我做了所有的数学计算,甚至考虑了弧度的东西.出于某种原因,我的箭头没有正确绘制.我几乎认为它与三角函数的域/范围有关,但我不能确定.
这是我的代码:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
用一些东西来回答这个问题(非问题)很难......
......你的数学搞砸了几个方面:
sin而cos不是asin和acossin(x)*length,而不是sin(x/length)sin与cos被交换atan2(atan你使用的函数有一些问题,显然特别是starty==endy)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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |