此方法在我正在开发的较大模拟期间运行。基本上这个Gladiator对象是通过screenY在屏幕screenX上移动(我的variablea设置为1000,720)。 Gladiator.center [0]是x位置,Gladiator.center [1]是y位置。以下方法的目的是使角斗士不要移动到我在屏幕上绘制的椭圆之外:
g.fillArc(0,0, screenX,screenY, 0, 360);
在角斗士完成移动后立即运行,因此终点是其当前中心。起点是端点 - Gladiator.xMove和Gladiator.yMove,描述刚刚在位置上进行的更改的变量。
移动方法这一切都以偏移位置的整数值结束。由于我使用像素作为坐标,我宁愿将输入保持为整数而不是双精度...因此我插入了逻辑语句,以确保最终结果将在椭圆内而不是在其外部。
public void wallsStop(Gladiator glad, int screenX, int screenY) {
double value;
double gladX;
double gladY;
double finalX;
double finalY;
double v;
int n = 1;
double slope;
double rise = (int)glad.yMove;
double run = (int)glad.xMove;
slope = rise/run;
v = run;
gladX = glad.center[0]-(int)glad.xMove;
gladY = glad.center[1]-(int)glad.yMove;
value = (Math.pow((glad.center[0]-(screenX/2)),2)/(Math.pow(screenX/2,2)))+(Math.pow((glad.center[1]-(screenY/2)),2)/(Math.pow(screenY/2,2)));
if (value > 1) {
System.out.println("Centers: ("+glad.center[0]+","+glad.center[1]+")");
while ( value > 1 && n < 8) {
System.out.println("Value: "+value);
if (value > 1) {
v=v-v/Math.pow(2,n);
System.out.println("Testing "+v);
} else if (value <= .99 && n < 8) {
v=v+v/Math.pow(2,n);
System.out.println("Testing "+v);
}
value = (Math.pow(((gladX+v)-(screenX/2)),2)/(Math.pow(screenX/2,2)))+(Math.pow(((gladY+v*slope)-(screenY/2)),2)/(Math.pow(screenY/2,2)));
n++;
}
finalX = v-run;
finalY = v*slope-rise;
if ( v - run < 0 ) {
finalX = v - run - 1;
finalY =v * slope - rise - slope;
} else if (v - run > 0) {
finalX = v - run + 1;
finalY = v * slope - run + slope;
}
System.out.println("Value "+value+" Slope: "+slope+" finals: "+finalX+","+finalY+" Start and end point ("+gladX+","+gladY+"),("+glad.center[0]+","+glad.center[1]+")");
glad.move((int)finalX,(int)finalY);
}
}
本质上,程序会不断分割它向上或向下的位置差异,直到找到小于1的值,但也将差异分成至少8次以确保其足够准确。这个结果意味着它在椭圆形内部。
目前的测试导致Gladiator对象显着减速,但无论如何都会慢慢地移动到椭圆外。
在我刚做的这个测试中,我得到了最佳的错误修复结果,因为坐标与屏幕顶部的中心很好地排列,可以很容易地理解边缘的位置。
起点:(506,8),终点(501,-9) 坡度是3.4 首先测试的是-2.5,值是1.002 第二个v测试是-1.875值是.991 ...使用那个。
总决赛被发现为finalX = 4.125 finalY = 2.025 ......显然不正确。 任何帮助将不胜感激......我对这一个感到难过!
编辑:从早期尝试中删除了一些未使用的变量,我还应该提到我将xMove和yMove转换为int的原因是,虽然它们是双倍的,但无论何时使用它们都会被转换。
编辑2:我正在使用的公式值来自这个页面,最佳答案......他们在那里解释得非常好。 https://math.stackexchange.com/questions/76457/check-if-a-point-is-within-an-ellipse
答案 0 :(得分:1)
假设只有finalY'明显不正确',因为其余的看起来很好。你正在使用'run'来表示你应该使用'rise'。
else if (v - run > 0) {
finalX = v - run + 1;
finalY = v * slope - run + slope;<--- THIS LINE
}