0
    public double getDamage(double distance){
        int damage1 = 30; // (0 - 38.1)
        int damage2 = 20; // (50.8 - *)
        double range1 = 38.1;
        double range2 = 50.8;

        double damage = 0; // FORMULA

        return damage;
    }

我尝试创建一个公式来计算距离造成的伤害量。

(可变距离 =)0 到 38.1 米它将返回 30 点伤害。
50.8 直到 Inifite 它将返回 20 伤害。
从 38.1 到 50.8,它将线性减少 30 -> 20。

我怎样才能使这种方法起作用?
提前致谢。

4

3 回答 3

1

听起来像这样:

double x = (distance - range1) / (range2 - range1);
if (x < 0)
  x = 0;
if (x > 1)
  x = 1;
return damage1 + x * (damage2 - damage1);

基本上,您遵循线性规则并进行调整以保持在线性区间内。

于 2013-08-12T19:34:04.060 回答
0

看起来你想要一个步骤公式,而不是一个线性公式。步骤公式基本上是代码中的一堆 if-else if 比较。像这样的东西:

public double getDamage(double dist){
    if (0 < dist & dist < 38.1)
        return 30;
    else if ( 38.1 < dist & dist < 50.8 )
        return 30 - dist/10;
    else 
        return 

}

编辑:刚刚看到您确实希望它在 38.1 和 50.8 之间呈线性关系。使用类似这样的东西 return 30 - dist/10; dist/10 会给你 27 到 23 的伤害,你需要自己找到一个合适的常数(而不是 10)。(这很容易,因为它的 y = mx + b 并且您的条件有两个点 (38.1, 30) 和 (50.8, 20)。因此,将这些分到 y = mx+b 中,您将获得要使用的公式第二个 else-if。

于 2013-08-12T19:30:00.897 回答
0

您正在寻找的公式是点斜率方程 y = m(x-x1) + y1 方程的简单变体,其中 m = (damage1 - damage2)/(range1 - range2), x1 = range1, y1 = damage1 , x 是可变距离。

public double getDamage(double distance){
    int damage1 = 30;
    int damage2 = 20;
    double range1 = 38.1;
    double range2 = 50.8;

    double damage = 0;
    if(0 <= distance && distance <= range1)
        damage = damage1;
    else if (range1 < distance && distance < range2)
        damage = (damage1 - damage2)/(range1 - range2) * (distance - range1) + damage1;
    else if (distance >= range2)
        damage = damage2;

    return damage;
}
于 2013-08-12T19:56:48.900 回答