一个点在矩形内做弓形运动:
主要运动类MotionTrace.java
package org.lyw.sh.test;
import java.text.DecimalFormat;
public class MotionTrace {
private static int count = 0;
private static boolean runFlag = true;
private double startX;
private double startY;
private double minX;
private double minY;
private double maxX;
private double maxY;
private double increase = 0.0;
private double distance;
private double rate;
private double directionX = 1.0;
private double directionY = 1.0;
public MotionTrace() {
startX = 0;
startY = 0;
minX = 0;
minY = 0;
maxX = 500.0;
maxY = 500.0;
distance = 30;
rate = 0.000009;
}
public void directionY() {
System.err.println("--------------Y:" + directionY + "--------------");
// --------------(+0.000000,0.000000+)--------------
// --------------(+0.009000,0.009000+)--------------
// System.out.println("--------------(+" + doubleFormat(minX * rate) +
// ","
// + doubleFormat(minY * rate) + "+)--------------");
// System.out.println("--------------(+" + doubleFormat(maxX * rate) +
// ","
// + doubleFormat(maxY * rate) + "+)--------------");
if (startX > maxX) {
directionX = -directionX;
startX = startX + distance * directionX;
count = 1;
runFlag = false;
return;
// directionX();
} else if (startX < minX) {
count = 1;
directionX = -directionX;
startX = startX + distance * directionX;
// directionX();
runFlag = false;
return;
}
if (0 == count) {
increase = startY;
} else {
increase = startY + distance * count * directionY;
}
if (!isBeyond(increase, minY, maxY)) {
System.err.println("(" + doubleFormat(startX * rate) + ","
+ doubleFormat(increase * rate) + ")");
} else {
count = -1;
directionY = -directionY;
startY = increase + distance * directionY;
startX = startX + distance * directionX;
//
// if (startX > maxX) {
// directionX = -directionX;
// startX = startX + distance * directionX;
// count = 0;
// directionX();
// } else if (startX < minX) {
// count = 0;
// directionX = -directionX;
// startX = startX + distance * directionX;
// directionX();
// }
}
// } else if (increase > maxY) {
// System.err.println("TOP");
// count = 1;
// directionY = -directionY;
// startY = increase + distance * directionY;
// startX = startX + distance * directionX;
// } else if (increase < minY) {
// System.err.println("BUTTON");
// count = 1;
// directionY = -directionY;
// startY = increase + distance * directionY;
// startX = startX + distance * directionX;
// }
count++;
}
public void directionX() {
System.err.println("--------------X:" + directionX + "--------------");
// --------------(+0.000000,0.000000+)--------------
// --------------(+0.009000,0.009000+)--------------
// System.out.println("--------------(+" + doubleFormat(minX * rate) +
// ","
// + doubleFormat(minY * rate) + "+)--------------");
// System.out.println("--------------(+" + doubleFormat(maxX * rate) +
// ","
// + doubleFormat(maxY * rate) + "+)--------------");
if (startY > maxY) {
directionY = -directionY;
startY = startY + distance * directionY;
count = 1;
runFlag = true;
return;
// directionY();
} else if (startY < minY) {
count = 1;
directionY = -directionY;
startY = startY + distance * directionY;
runFlag = true;
return;
// directionY();
}
if (0 == count) {
increase = startX;
} else {
increase = startX + distance * count * directionX;
}
if (!isBeyond(increase, minX, maxX)) {
System.err.println("(" + doubleFormat(increase * rate) + ","
+ doubleFormat(startY * rate) + ")");
} else {
// System.err.println("BEYOND");
count = -1;
directionX = -directionX;
startX = increase + distance * directionX;
startY = startY + distance * directionY;
// if (startY > maxY) {
// directionY = -directionY;
// startY = startY + distance * directionY;
// count = 0;
// directionY();
// } else if (startY < minY) {
// count = 0;
// directionY = -directionY;
// startY = startY + distance * directionY;
// directionY();
// }
}
// } else if (increase > maxX) {
// System.err.println("TOP");
// count = 1;
// directionX = -directionX;
// startX = increase + distance * directionX;
// startY = startY + distance * directionY;
// } else if (increase < minX) {
// System.err.println("BUTTON");
// count = 1;
// directionX = -directionX;
// startX = increase + distance * directionX;
// startY = startY + distance * directionY;
// }
count++;
}
private String doubleFormat(double dbl) {
DecimalFormat dft = new DecimalFormat("#####0.000000");
return dft.format(dbl);
}
private boolean isBeyond(double ori, double min, double max) {
if (ori < min || ori > max) {
return true;
}
return false;
}
public double getDirectionX() {
return directionX;
}
public void setDirectionX(double directionX) {
this.directionX = directionX;
}
public double getDirectionY() {
return directionY;
}
public void setDirectionY(double directionY) {
this.directionY = directionY;
}
public static boolean isRunFlag() {
return runFlag;
}
public static void setRunFlag(boolean runFlag) {
MotionTrace.runFlag = runFlag;
}
}
用java调度器调用类MotionMain.java
package org.lyw.sh.test;
import java.util.Timer;
import java.util.TimerTask;
public class MotionMain {
public static void main(String[] args) {
TimerTask task = new TimerTask() {
MotionTrace motion = new MotionTrace();
@Override
public void run() {
if (MotionTrace.isRunFlag()) {
motion.directionY();
} else {
motion.directionX();
}
}
};
Timer timer = new Timer();
timer.schedule(task, 0, 100);
}
}