我尝试在sin波形图案中移动光标,但因为mouseMove函数将整数作为参数,所以我只能将鼠标移动到波形上的坐标,其中x和y值都是整数。当"身高"这不是问题。波的较小但随着它变大,您可以更容易地看到间隙,因为具有x和y值为整数的两个坐标之间的距离更大。有没有办法我可以将光标移动到接近这些非整数坐标的坐标,使它看起来像一个完整的波?
import java.awt.Robot;
public class WaveMotion {
public static void MoveMouseWave(int startX, int startY, int waveHeight, int waveLength, int speed) {
int a = 0;
while(a < waveLength) {
int x = (a * waveHeight) + startX;
int y = (int) ((Math.sin(a) * waveHeight) + startY);
System.out.println(x + "," + y);
a++;
try{
Robot robot = new Robot();
robot.delay(((speed * -1) + 10) * 100);
robot.mouseMove(x, y);
}
catch(Exception e) {}
}
}
}
答案 0 :(得分:0)
mouseMove
采用整数参数的事实不要求您在整个计算中使用整数。例如,没有必要只将整数传递给Math.sin
,实际上这些也会转换为双精度。您可以使用double
或float
进行中间计算,然后在计算最终值时转换为int
。
光标看起来从一点到另一点跳跃的另一个原因并不是与坐标是整数的事实直接相关,而是因为你正沿着x走一个等于{的值每次{1}},这是一个比整数限制强大的跳跃:
waveHeight
或者,你可以每次x步1(所以没有大的跳跃),并且在调用int x = (a * waveHeight) + startX;
时除以waveHeight
以反映你沿波浪移动了一个较小的步骤:
sin()
小心检查零int x = a + startX;
int y = (int)(Math.sin((double)a / (double)waveHeight) * (double)waveHeight) + startY;
以避免被零除错误。您还可以将waveHeight
的类型更改为waveHeight
,以避免必须将其转换为double
。由于您每次踩的距离较小,因此需要将waveLength
增加waveHeight
因子才能得到相同长度的波。
答案 1 :(得分:0)
考虑到你的节目,你似乎想通过一次提升1度来移动一个圆圈。正弦将该圆上的运动转换为线上的回文运动。只有你必须意识到正弦需要弧度。因此:
int y = (int) ((Math.sin(Math.toRadians(a)) * waveHeight) + startY);
并与
的使用保持一致 int x = (Math.toRadians(a) * waveHeight) + startX;