我正在上一个学校项目,但不幸的是,我的导师不再工作了,所以我没有人问。
目前,我正在设计一个小型系统,该系统应该能够在现实世界中定位自己,它基本上是一台安装有PC的电动遥控车。这款车应该能够在真实世界中导航并知道它在地图上的位置。由于它需要一个很好的精度,所以GPS不是一种选择(我能得到的最好距离是4米,就我能接受的范围而言),并且以任何方式对车轮进行编码对于我的预算来说都太昂贵,所以解决方法是将一个在这辆车下的鼠标,并将其反馈用作相对定位系统。
我的第一个想法是计算两个瞬间(使用定时器)之间的像素距离差异,我甚至尝试使用mouseMoved事件应用相同的原则,但问题仍然存在:如果我改变鼠标的速度,计算的距离也变化。
在这一点上,我没有其他的想法,你认为我的做法是错误的?JavaFx光标测量
public class Main extends Application {
public static void main(String args[]) {
launch(args);
}
private double cmToPixel = 1;
private int totalX;
private int totalY;
private Robot robot;
private int counter;
@Override
public void start(Stage primaryStage) throws Exception {
VBox pane = new VBox();
pane.setFillWidth(false);
pane.setMinWidth(200);
javafx.scene.control.TextArea textArea = new TextArea();
javafx.scene.control.TextArea logArea = new TextArea();
javafx.scene.control.TextArea debugArea = new TextArea();
pane.getChildren().addAll(textArea, logArea, debugArea);
Scene scene = new Scene(pane);
primaryStage.setScene(scene);
primaryStage.centerOnScreen();
robot = new Robot();
robot.mouseMove((int) (Screen.getPrimary().getBounds().getWidth()/2), (int) (Screen.getPrimary().getBounds().getHeight()/2));
scene.setOnMouseMoved(e -> {
double deltaX = e.getX() - Screen.getPrimary().getBounds().getWidth()/2;
double deltaY = Screen.getPrimary().getBounds().getHeight()/2 - e.getY() ;
totalX += deltaX;
totalY += deltaY;
textArea.appendText((totalX/cmToPixel) + " - " + (totalY/cmToPixel) + "\n");
debugArea.appendText(deltaX+" - "+deltaY+"\n");
logArea.appendText("Center: ["+(int) (Screen.getPrimary().getBounds().getWidth()/2)+";"+(int) (Screen.getPrimary().getBounds().getHeight()/2)+"] cursorPosition: "+e.getX()+" - "+e.getY()+"\n");
robot.mouseMove((int) (Screen.getPrimary().getBounds().getWidth()/2), (int) (Screen.getPrimary().getBounds().getHeight()/2));
});
primaryStage.show();
primaryStage.setFullScreen(true);
}}
非常感谢您的帮助!
利玛窦Formenti
编辑:如果你想复制我的结果,只是标注在一张纸上两条线,并尝试以不同的速度运行这些线之间的鼠标,同时注意在程序
刚刚尝试过你的建议,但没有任何改变。你确定这可能是问题吗?如果是这样,我会调查更多 –
这至少是你的一个问题。当然,我还没有看到更多。我想知道你想如何处理汽车的旋转。 – mipa
旋转由数字指南针处理,不太难;禁用加速后情况不会改变......我将在此期间深入研究此解决方案 –