保持椭圆形物体失效的方法

时间:2013-06-20 15:26:39

标签: java math methods collision-detection

此方法在我正在开发的较大模拟期间运行。基本上这个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

1 个答案:

答案 0 :(得分:1)

假设只有finalY'明显不正确',因为其余的看起来很好。你正在使用'run'来表示你应该使用'rise'。

else if (v - run > 0) {
    finalX = v - run + 1;
    finalY = v * slope - run + slope;<--- THIS LINE
    }