Балансировка трех параметров, чтобы при изменении одного из них сумма не менялась - PullRequest
0 голосов
/ 26 марта 2019

Мне нужно сбалансировать три переменные так, чтобы при добавлении значения к одной из них остальные пропорционально менялись, чтобы сумма оставалась оригинальной. Например, треугольник тела в Fallout 4. https://i.imgur.com/Q2cv9Xm.jpg

Я пытался что-то, но это не правильно и на самом деле не работает.
Сначала я просто добавляю недостающее количество к другим переменным, но пропорциональности нет.
Во-вторых, я пытаюсь сбалансировать пропорции:

public class Triangle()
{
    float a = 0.33f;
    float b = 0.33f;
    float c = 0.33f;

    static float sum = 0.99f;
    static float maxVal = 0.97f;

    void AddA(float value)  {
        if (a + value <= maxVal) {
            a += value;         

            float ratio1 = b/sum;
            float ratio2 = c/sum;

            // difference between needed sum and current
            float remainderSum = a+b+c-sum;
            // the excess part is proportional to b
            float rem1 = remainderSum*ratio1;
            // the excess part is proportional to c
            float rem2 = remainderSum*ratio2;
            // subtract excess
            b -= rem1;
            c -= rem2;
        }
    }
}

Результат:

Add(0.5f); =>
  Sum: 1.1566666666666665
  ABC: 0.8300000000000001/0.16333333333333325/0.16333333333333325

но в результате сумма неверна.

1 Ответ

1 голос
/ 26 марта 2019

Каждый раз, когда вы увеличиваете одну переменную на одну, вы хотите уменьшить две другие переменные. Если вы уменьшите их вдвое, сумма всех трех переменных останется неизменной.

псевдокод:

total = 1; //you could change this to anything

x = total/3;
y = total/3;
z = total/3;

def increaseX(amount) {
    x = x + amount;
    y = y - amount/2;
    z = z - amount/2;
}

def increaseY(amount) {
    y = y + amount;
    x = x - amount/2;
    z = z - amount/2;
}

def increaseZ(amount) {
    z = z + amount;
    x = x - amount/2;
    y = y - amount/2;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...