From 7c2f32bf41577bc8d70d7c19153b68435bc9f73f Mon Sep 17 00:00:00 2001
From: Echigo reiki <e235738@ie.u-ryukyu.ac.jp>
Date: Sat, 8 Feb 2025 09:50:10 +0900
Subject: [PATCH] 7.1

---
 scripts/rep7/rep7.1/LowMouseTracker$1.class | Bin 0 -> 1445 bytes
 scripts/rep7/rep7.1/LowMouseTracker.class   | Bin 0 -> 3552 bytes
 scripts/rep7/rep7.1/LowMouseTracker.java    |  83 ++++++++++++++++++++
 scripts/rep7/rep7.1/MouseTracker$1.class    | Bin 0 -> 1430 bytes
 scripts/rep7/rep7.1/MouseTracker.class      | Bin 0 -> 3534 bytes
 scripts/rep7/rep7.1/MouseTracker.java       |  82 +++++++++++++++++++
 6 files changed, 165 insertions(+)
 create mode 100644 scripts/rep7/rep7.1/LowMouseTracker$1.class
 create mode 100644 scripts/rep7/rep7.1/LowMouseTracker.class
 create mode 100644 scripts/rep7/rep7.1/LowMouseTracker.java
 create mode 100644 scripts/rep7/rep7.1/MouseTracker$1.class
 create mode 100644 scripts/rep7/rep7.1/MouseTracker.class
 create mode 100644 scripts/rep7/rep7.1/MouseTracker.java

diff --git a/scripts/rep7/rep7.1/LowMouseTracker$1.class b/scripts/rep7/rep7.1/LowMouseTracker$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..690f58a7146016906ff35706fb8ac7937e3bfd2e
GIT binary patch
literal 1445
zcmZuxOLH4V5dKD5d;OT$a;)GG2quY4Bst2)CSX8$A~}g%mThcfaKa<w)nv6{y{p<;
zIfmj7aNs}{7s3fHRB<C^DHRSBXMPVC4p8*$nsQ{kCGGS~Kj!PNyZ4WOe*F!=Rfs{P
zkTzj(^r4?&Y%zFL586tuhr<3$hPfGr{;27y+$F6%q%CXj0ggcok=c&$a*oX~wfIo%
zhzGltvZXIATlhOdS+_&cYPz<n1b!rUqw)|qj+q$Y7)6F*a^FYz?zV{Bz_)JxC#}2N
zGNkxdT;GkZF{JZ_jX@m8xQQ&s3B15CdI%W9u&Y*O%M+iwzQe%oYKM~?FX9yG!dO%D
z8*-O)HLZJ@<1}7j7}?g@uLR1~AQVF;&c<p-u4gT}Dk=}-Rh%(#mg5|9<e-5cs2L39
zej#I&HEsGD$9d#w@5qSZM7~x?0(!!CtmUnT(vHd|iVWlTo>NqV_Le7!qzfpSxX59F
z3XqBKiaiqphCwgzoekl&lPec=F0&l3YgWdZuG3rzrR^%pr5-e-*1o~<CgupZCsdSh
zq!}h67W$|sfIo9o&@!%=xXN)2*BMUs6tpE=Ke8%;7f@BwtMgTcQ@tgB&Vo|7iFZv@
zII5UuIM);E=-yy3m5gq=p2u)He^lrd4WV4v(EQxyxPuy1wGnf6z(uwHMmA0e8bh69
z3Cj!v4=C<3^(x(xuhOHVr0^ccs_sKWML~<<?fn0Gy%)#P$O#gKs1Vb-CtY7IwYRrq
zxGt!e)WJ>RH?&~n7qsEAwTOnSE?WEgp|zkL+L96{o9v;MzNm?#sPn$<QFr=IT}I8I
z!SOLZVdztl2&um&4(N)6BQ3hYkuj=)C8?r2fg&Sb^L-gssQyYSYS9#pB9O{t^dJMY
z(zigL(0>$bU|1*VJnhr^q&VFHD_-cpEI!5XFLcE4KE3;C1<ulY10N(#Y?MOkP*00{
zV0#$*4qqqIM6$f}43i8$;?e$gU-=AEDg2JYQmJpYi|IKdIiGoq@ySHIEVFp)+wW1P
zt@#A+ba6vVr8L>!DjE8n#RC1hSkxYydzdipcM#t@*}>(XFqK5=LGlBoN7m^M#)@66
z=;Tsya<ef<Q+l8=M_gP-0h=ho#x%a9F8m55d_z<EGcMr?X3(V({E)myVEm0u69wZh
h%%#r2ATJ&BF7DB4&^&&GPvev0xKHa45vO^l=U*HuQEdPK

literal 0
HcmV?d00001

diff --git a/scripts/rep7/rep7.1/LowMouseTracker.class b/scripts/rep7/rep7.1/LowMouseTracker.class
new file mode 100644
index 0000000000000000000000000000000000000000..dbb121a05b005a72f3d99a529e105d21271b7aab
GIT binary patch
literal 3552
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
IiGQK{KL!xLGynhq

literal 0
HcmV?d00001

diff --git a/scripts/rep7/rep7.1/LowMouseTracker.java b/scripts/rep7/rep7.1/LowMouseTracker.java
new file mode 100644
index 0000000..39acb89
--- /dev/null
+++ b/scripts/rep7/rep7.1/LowMouseTracker.java
@@ -0,0 +1,83 @@
+import javafx.animation.AnimationTimer;
+import javafx.application.Application;
+import javafx.scene.Scene;
+import javafx.scene.canvas.Canvas;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.layout.StackPane;
+import javafx.scene.paint.Color;
+import javafx.stage.Stage;
+import java.util.ArrayList;
+import java.util.List;
+
+public class LowMouseTracker extends Application {
+    private final List<Double[]> mousePositions = new ArrayList<>();
+    private boolean isRecording = false;
+    private boolean isReplaying = false;
+    private long lastReplayTime = 0;
+    private int replayIndex = 0;
+    private boolean highPrecisionMode = false; //鬮倡イセ蠎ヲ繝「繝シ繝�(true: CPU鬮倩イ�闕キ, false: CPU菴手イ�闕キ)
+
+    @Override
+    public void start(Stage primaryStage) {
+        Canvas canvas = new Canvas(800, 600);
+        GraphicsContext gc = canvas.getGraphicsContext2D();
+        gc.setFill(Color.BLACK);
+        gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
+
+        //繝槭え繧ケ縺ョ蜍輔″繧定ィ倬鹸縺吶k
+        canvas.setOnMouseMoved(event -> {
+            if (isRecording) {
+                mousePositions.add(new Double[]{event.getX(), event.getY(), (double) System.nanoTime()});
+            }
+        });
+
+        AnimationTimer replayTimer = new AnimationTimer() {
+            @Override
+            public void handle(long now) {
+                if (isReplaying && replayIndex < mousePositions.size()) {
+                    Double[] pos = mousePositions.get(replayIndex);
+                    long timestamp = pos[2].longValue();
+
+                    if (highPrecisionMode || now - lastReplayTime >= 16_000_000) { // 邏�16ms (60FPS逶ク蠖�)
+                        gc.setFill(Color.RED);
+                        gc.fillOval(pos[0], pos[1], 5, 5);
+                        replayIndex++;
+                        lastReplayTime = now;
+                    }
+                } else if (replayIndex >= mousePositions.size()) {
+                    isReplaying = false;
+                    this.stop();
+                }
+            }
+        };
+
+        //繧ッ繝ェ繝�け縺ァ險倬鹸繝サ蜀咲函繧貞�繧頑崛縺�
+        canvas.setOnMouseClicked(event -> {
+            if (!isRecording && !isReplaying) {
+                //險倬鹸髢句ァ�
+                mousePositions.clear();
+                isRecording = true;
+                System.out.println("Recording started...");
+            } else if (isRecording) {
+                //險倬鹸蛛懈ュ「&蜀咲函髢句ァ�
+                isRecording = false;
+                isReplaying = true;
+                replayIndex = 0;
+                System.out.println("Recording stopped. Replaying...");
+                gc.setFill(Color.BLACK);
+                gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
+                replayTimer.start();
+            }
+        });
+
+        Scene scene = new Scene(new StackPane(canvas));
+        primaryStage.setScene(scene);
+        primaryStage.setTitle("Mouse Tracker");
+        primaryStage.show();
+    }
+
+    public static void main(String[] args) {
+        launch(args);
+    }
+}
+
diff --git a/scripts/rep7/rep7.1/MouseTracker$1.class b/scripts/rep7/rep7.1/MouseTracker$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..ae81ebca36f21f6f09473d39b5b73a1a1c29a00a
GIT binary patch
literal 1430
zcmZuwOLH4V5dKD5d;OT$a_ry`2quY4Bst2)Cd3rV6Uj;Bl5AregA*PZuO_Pv>s{5(
z${312z<~o*Tp%a7P{oaurBpajocTRmI6%>}YsylUx1^b#>BoHib@!kD{`Nb78xX@t
zA#K9o7{DOISUqSfxfu%kGZ|**83v=KtFl)}Q|ncgwBHcNFh<B`Pk33!W|*x#5qskC
zzNKvGOUoAio>11kP_&w^t;&HP$^ED_0*(_V#yG~2VVF7e5x%=CA~*1@JO4|Y?yd|e
z{&m-PqnixrTz+d9CoySaisKYsV&J`~7)D*SE?b`X!u1^n_CQ;o=6D%rNEgPMs^5_N
zq^oM(s~l(X8fCYu^Ii*-s}U%MOq`0<j$F^Gxhg7+;&q%eah~G>vgDvqAE_A(<$ft+
zh*fR+2FFF@=<LXd;Z&}gPXc<vcdXT&C(@2eCJGFb4|^1qpuOWsV(1czCN6VWAnG&m
zTd`+iz%c9uzOyB~cJk!1&Sin)O-;!}({-9_p|o8^xzvM()Y`W=u3?dYdqPDCN19$D
zVtIgC0r)FR)hyw<i5na@af{(}Uo~68^&_hscmb6py}ndoIMZM69t%q04&F6U=BQwa
z;X+@i;~Rs)R5H5jdLF~s+;O4TG=x%qOY?J&<36fX)ke(O5f_!g+f#8u&=~3*D_CV1
zdQ5RwsZr^bT!lUzC587m)^!saDhgT**K++`-Vfq<*o24t%S1E7c+K_YN_%%lhMR&a
zNxj<?enSgJZdn_i*obJh>Y{b1AK3`np)DzEvYF^@=F6Hg3c2Ll9`&W~)MeBR8XO<v
z6NUj5iI6&L`iQ7VIMSl<j*KA<tw<H!4-^^ks_)CNOqEwsQFEqf0)bQ}qvsc(orYiE
z(0?2oVAv$-BAwIvrZCq5D_rWpEIh~PuXM%mKCOea1LtYo!Uu^H8>f&u)bqjt*a0TK
z$2W;IoouhXzzoAr`26sAsC<Fh6#hVdr8uzA#oVHi+|U1j$(cmFDyQ)FcTZ8GqxlT)
zba7it#WdO9EgE{A!ZQ83sA-Sw156u_I*8w$>EP<mm`x(}A^DNgBkObr6NN6;baJUU
zxrLacSv|^FBra|tk8KoSV-8<Y|9y=jzNPv61y}G4^XSs>eMsJ8F#f@|iM;VQ7E|Y7
dke81601s(5Xc9ldr}526JfeMsh||2&_aD*7OJo25

literal 0
HcmV?d00001

diff --git a/scripts/rep7/rep7.1/MouseTracker.class b/scripts/rep7/rep7.1/MouseTracker.class
new file mode 100644
index 0000000000000000000000000000000000000000..259d31b630ec64f90c9bd0f1c3c88e637e4ff717
GIT binary patch
literal 3534
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
HPjvkoth~4P

literal 0
HcmV?d00001

diff --git a/scripts/rep7/rep7.1/MouseTracker.java b/scripts/rep7/rep7.1/MouseTracker.java
new file mode 100644
index 0000000..8a6dc64
--- /dev/null
+++ b/scripts/rep7/rep7.1/MouseTracker.java
@@ -0,0 +1,82 @@
+import javafx.animation.AnimationTimer;
+import javafx.application.Application;
+import javafx.scene.Scene;
+import javafx.scene.canvas.Canvas;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.layout.StackPane;
+import javafx.scene.paint.Color;
+import javafx.stage.Stage;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MouseTracker extends Application {
+    private final List<Double[]> mousePositions = new ArrayList<>();
+    private boolean isRecording = false;
+    private boolean isReplaying = false;
+    private long lastReplayTime = 0;
+    private int replayIndex = 0;
+    private boolean highPrecisionMode = true; //鬮倡イセ蠎ヲ繝「繝シ繝�(true: CPU鬮倩イ�闕キ, false: CPU菴手イ�闕キ)
+
+    @Override
+    public void start(Stage primaryStage) {
+        Canvas canvas = new Canvas(800, 600);
+        GraphicsContext gc = canvas.getGraphicsContext2D();
+        gc.setFill(Color.BLACK);
+        gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
+
+        //繝槭え繧ケ縺ョ蜍輔″繧定ィ倬鹸縺吶k
+        canvas.setOnMouseMoved(event -> {
+            if (isRecording) {
+                mousePositions.add(new Double[]{event.getX(), event.getY(), (double) System.nanoTime()});
+            }
+        });
+
+        AnimationTimer replayTimer = new AnimationTimer() {
+            @Override
+            public void handle(long now) {
+                if (isReplaying && replayIndex < mousePositions.size()) {
+                    Double[] pos = mousePositions.get(replayIndex);
+                    long timestamp = pos[2].longValue();
+
+                    if (highPrecisionMode || now - lastReplayTime >= 16_000_000) { // 邏�16ms (60FPS逶ク蠖�)
+                        gc.setFill(Color.RED);
+                        gc.fillOval(pos[0], pos[1], 5, 5);
+                        replayIndex++;
+                        lastReplayTime = now;
+                    }
+                } else if (replayIndex >= mousePositions.size()) {
+                    isReplaying = false;
+                    this.stop();
+                }
+            }
+        };
+
+        //繧ッ繝ェ繝�け縺ァ險倬鹸繝サ蜀咲函繧貞�繧頑崛縺�
+        canvas.setOnMouseClicked(event -> {
+            if (!isRecording && !isReplaying) {
+                //險倬鹸髢句ァ�
+                mousePositions.clear();
+                isRecording = true;
+                System.out.println("Recording started...");
+            } else if (isRecording) {
+                //險倬鹸蛛懈ュ「&蜀咲函髢句ァ�
+                isRecording = false;
+                isReplaying = true;
+                replayIndex = 0;
+                System.out.println("Recording stopped. Replaying...");
+                gc.setFill(Color.BLACK);
+                gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
+                replayTimer.start();
+            }
+        });
+
+        Scene scene = new Scene(new StackPane(canvas));
+        primaryStage.setScene(scene);
+        primaryStage.setTitle("Mouse Tracker");
+        primaryStage.show();
+    }
+
+    public static void main(String[] args) {
+        launch(args);
+    }
+}
-- 
GitLab