저는 학교 프로젝트를 진행하고 있지만 불행히도 교사는 더 이상 작동하지 않으므로 아무에게도 물어 보지 않습니다.
현재 현실 세계에서 스스로를 찾을 수 있어야하는 작은 시스템을 설계하고 있습니다. 기본적으로 PC에 장착 된 전기 RC 자동차입니다. 이 자동차는 실제 세계를 탐색하고지도 상 어디에 있는지 알 수 있어야합니다. 좋은 정밀도가 필요하기 때문에 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
회전은 디지털 나침반으로 처리됩니다. 가속을 비활성화 한 후에도 상황은 변하지 않습니다 ... 그 동안이 솔루션을 파헤칩니다. –