0

此方法在我正在开发的更大模拟期间运行。本质上,这个 Gladiator 对象在屏幕 screenX 上通过 screenY 移动(我的变量设置为 1000,720)。Gladiator.center[0] 是 x 位置,Gladiator.center[1] 是 y 位置。以下方法的目的是防止角斗士移动到我使用此命令在屏幕上绘制的椭圆之外:

g.fillArc(0,0, screenX,screenY, 0, 360);    

它在角斗士完成移动后立即运行,因此终点是其当前中心。起点是终点 - Gladiator.xMove 和 Gladiator.yMove,这些变量描述了刚刚在位置上所做的更改。

move 方法这一切都以将位置偏移一个整数值结束。当我使用像素作为坐标时,我更愿意将输入保持在整数而不是双精度数......因此我插入了确保最终结果将在椭圆形内部而不是在椭圆形外部的逻辑语句。

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 次以确保其足够准确。这个结果意味着它在椭圆内。

目前的测试导致角斗士物体的速度显着减慢,但无论如何都会缓慢地移出椭圆形。

在我刚刚做的这个测试中,我得到了修复错误的最佳结果,因为坐标与屏幕顶部的中心很好地对齐,可以轻松理解边缘应该在哪里。

起点:(506,8),终点 (501,-9) 斜率为 3.4 第一个 v 测试为 -2.5,值为 1.002 第二个 v 测试为 -1.875 值为 0.991...使用那个。

最终发现为 finalX = 4.125 finalY = 2.025... 显然不正确。任何帮助将不胜感激......我很难过这个!

编辑:从早期尝试中删除了一些未使用的变量,而且我应该提到我将 xMove 和 yMove 转换为 int 的原因是,虽然它们是双精度数,但无论何时使用它们都会被转换。

编辑2:我用于价值的公式取自this page,最佳答案......他们在那里解释得很好。https://math.stackexchange.com/questions/76457/check-if-a-point-is-within-an-ellipse

4

1 回答 1

1

假设只有 finalY 是“明显不正确的”,因为其余的看起来都很好。您在应该使用 'rise' 的地方使用 'run'。

else if (v - run > 0) {
    finalX = v - run + 1;
    finalY = v * slope - run + slope;<--- THIS LINE
    }
于 2013-06-20T17:48:32.450 回答