我正在开发一个较大的仿真过程中运行此方法。本质上,此角斗士对象在屏幕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次以确保其精度足够。此结果表示它在椭圆形内部。

当前的测试导致“ Gladiator”对象急剧减速,但无论如何仍会缓慢移动到椭圆形外部。

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

起点:(506,8),终点(501,-9)
坡度是3.4
测试的第一个v是-2.5,值是1.002
测试的第二个v是-1.875,值是.991 ...用的那个。

发现finals为finalX = 4.125 finalY = 2.025 ...显然不正确。
任何帮助将不胜感激...我为此感到困惑!

编辑:从较早的尝试中删除了一些未使用的变量,并且我还应该提到将xMove和yMove转换为int的原因是,当它们为double时,无论何时使用它们都将被转换。

编辑2:我使用的求值公式是从此页面获取的,最重要的答案...他们在那儿很好地解释了它。 https://math.stackexchange.com/questions/76457/check-if-a-point-is-within-an-ellipse

最佳答案

假设只有finalY是“显然不正确的”,因为其余的看起来不错。您正在y处使用“运行”,而应使用“上升”。

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

关于java - 将物体保持在椭圆形失效区域内的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17217697/

10-13 06:48