C# 在有偏差的三个变量之间平衡一个数字
我有一个问题,我也在寻找解决方案。我有三个变量A、B和C。我需要做的是根据第四个数字(输入)在三个变量之间平衡一个值100和一个偏差(我认为这是正确的词) 所以,在开始时,A是100,B和C是0。然后,随着输入的增加,A将减少,B将增加相同的值(因此A+B+C始终等于100)。然后,当B达到100时,增加输入将增加C,同时减少B。反过来也是如此,因此减少输入将使值从C>B>A移动 我希望我已经解释得足够清楚了 编辑:到目前为止,我的尝试是这样的,在本例中,A、B和C是vCam.m_权重0、vCam.m_权重1、vCam.m_权重2 我的问题是,我在切换activeCam时绊倒了,所以下一个会立即跳到100。我相信这是一个糟糕的代码,但我正在努力想另一种方法C# 在有偏差的三个变量之间平衡一个数字,c#,C#,我有一个问题,我也在寻找解决方案。我有三个变量A、B和C。我需要做的是根据第四个数字(输入)在三个变量之间平衡一个值100和一个偏差(我认为这是正确的词) 所以,在开始时,A是100,B和C是0。然后,随着输入的增加,A将减少,B将增加相同的值(因此A+B+C始终等于100)。然后,当B达到100时,增加输入将增加C,同时减少B。反过来也是如此,因此减少输入将使值从C>B>A移动 我希望我已经解释得足够清楚了 编辑:到目前为止,我的尝试是这样的,在本例中,A、B和C是vCam.m_权重0、vCa
//Input is clamped between 0 - 100
private void HandleCameraSwitching(float newWeight)
{
if (activeCam == 0)
{
vCam.m_Weight1 = newWeight;
vCam.m_Weight0 = 100 - newWeight;
}
else if (activeCam == 1)
{
vCam.m_Weight2 = newWeight;
vCam.m_Weight1 = 100 - newWeight;
}
else if (activeCam == 2)
{
vCam.m_Weight2 = newWeight;
vCam.m_Weight1 = 100 - newWeight;
}
if (vCam.m_Weight0 == 100)
{ activeCam = 0; }
else if (vCam.m_Weight1 == 100)
{
if (zoomingIn)
{
activeCam = 1;
} else
{
activeCam = 0;
}
}
else if(vCam.m_Weight2 == 100)
{
if (zoomingIn)
{
activeCam = 2;
}
else
{
activeCam = 1;
}
}
}
我认为您所解释的是您想要实现的特定场景。在编程术语中,这意味着构建一个模型来表示您的场景 假设一开始,A=100,B=0,C=0 然后定义更新函数。这就是你实现你提到的细节的地方
- a) 当a达到100并有输入时,开始从a删除并添加到B
- b) 当b达到100&有输入时,开始从b中删除并添加到C
- c) 当有一些输出时,从最后一个铲斗中取出并添加到上一个铲斗中
public class Camera
{
public Camera()
{
zoomingIn = true;
m_Weight0 = 100;
m_Weight1 = 0;
m_Weight2 = 0;
}
public bool zoomingIn { get; set; }
public float m_Weight0 { get; set; }
public float m_Weight1 { get; set; }
public float m_Weight2 { get; set; }
public void HandleCameraSwitching(float newWeight)
{
if (m_Weight0 == 100) zoomingIn = true;
else if (m_Weight2 == 100) zoomingIn = false;
if (zoomingIn)
{
if (m_Weight0 == 100 || (m_Weight0 > 0 && m_Weight1 > 0))
{
m_Weight0 = 100 - newWeight;
m_Weight1 = newWeight;
}
else if (m_Weight1 == 100 || (m_Weight1 > 0 && m_Weight2 > 0))
{
m_Weight1 = 100 - newWeight;
m_Weight2 = newWeight;
}
}
else
{
if (m_Weight2 == 100 || (m_Weight2 > 0 && m_Weight1 > 0))
{
m_Weight2 = 100 - newWeight;
m_Weight1 = newWeight;
}
else if (m_Weight1 == 100 || (m_Weight1 > 0 && m_Weight0 > 0))
{
m_Weight1 = 100 - newWeight;
m_Weight0 = newWeight;
}
}
}
}
bool放大
在A或C等于100时发生变化如果我理解正确,在我看来,我们可以将这三个变量视为一个整体。似乎我们有一个最小值100
,我们可以将最大值200
添加到此值。为了更好地描述变量,下表显示了A、B和C的初始值,后跟用户输入,然后是添加输入后的值。最后一列显示了我们将要计算的“总”值(即100的起始值加上用户的输入):
如果您查看上表,我们可以看到一种模式:
- 如果
小于Total
,则200
为C
,0
为B
,Total-100
为A
100-B
- 如果
大于或等于Total
,则200
为A
,0
为C
,Total-100
为B
100-C
- 我们可以通过测试
或A
是否C
来计算0
,然后使用上面的公式来计算Total:Total
如果(A==0)Total=200+C;其他合计=100+B
- 计算总数
- 添加输入值
- 根据新的总数设置三个变量
private static int A = 100;
private static int B;
private static int C;
private static void ProcessInput(int input)
{
// Calculate current value new value
var currentValue = C > 0 ? 200 + C : B > 0 ? 100 + B : 100;
var newValue = currentValue + input;
// We don't support values less than 100 or greater than 300
if (newValue < 100 || newValue > 300) throw new ArgumentOutOfRangeException();
C = newValue == 300 ? 100 : newValue < 200 ? 0 : newValue - 200;
B = newValue == 200 ? 100 : newValue > 200 ? 100 - C : newValue - 100;
A = newValue <= 200 ? 100 - B : 0;
}
输出
A、 B和C总是介于0和100之间,但它们的总和必须 始终为100,输入为0.1或-0.1–Ben 我在内部将值表示为0到1000之间的整数。要将它们公开为十进制数,请将其转换为double(或任何您想要的类型)并除以10。这将消除多次增加()和/或减少()时的舍入错误 下面是一个例子:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private CameraWeight cw = new CameraWeight();
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = cw.ToString();
}
private void button1_Click(object sender, EventArgs e)
{
cw.Increase();
label1.Text = cw.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
cw.Decrease();
label1.Text = cw.ToString();
}
}
public class CameraWeight
{
private int _m_Weight0 = 1000;
private int _m_Weight1 = 0;
private int _m_Weight2 = 0;
public double m_Weight0
{
get { return (double)_m_Weight0/10; }
}
public double m_Weight1
{
get { return (double)_m_Weight1/10; }
}
public double m_Weight2
{
get { return (double)_m_Weight2/10; }
}
public void Increase()
{
if(_m_Weight0 > 0)
{
_m_Weight0 += -1;
_m_Weight1 += 1;
}
else if (_m_Weight1 > 0.0)
{
_m_Weight1 += -1;
_m_Weight2 += 1;
}
}
public void Decrease()
{
if (_m_Weight2 > 0.0)
{
_m_Weight2 += -1;
_m_Weight1 += 1;
}
else if (_m_Weight1 > 0.0)
{
_m_Weight1 += -1;
_m_Weight0 += 1;
}
}
public override string ToString()
{
return string.Format("{0}, {1}, {2}", m_Weight0.ToString("F1"), m_Weight1.ToString("F1"), m_Weight2.ToString("F1"));
}
}
你能给出一组有几个给定输入的a、B和C的示例值吗?a、B和C将始终在0和100之间,但它们的总和必须始终为100,输入为0.1或-0。1@Ben你有什么问题?请编辑您的问题,包括您的源代码以及您的问题/挣扎。您的权利对不起。我试图概括,所以我不必解释不相关的东西。但我太笼统了。我发布的代码希望能澄清这一点。再一次,你的权利对不起,从0开始,而不是1。所以它是m_权重0,m_权重1,m_权重2
private static int A = 100;
private static int B;
private static int C;
private static void ProcessInput(int input)
{
// Calculate current value new value
var currentValue = C > 0 ? 200 + C : B > 0 ? 100 + B : 100;
var newValue = currentValue + input;
// We don't support values less than 100 or greater than 300
if (newValue < 100 || newValue > 300) throw new ArgumentOutOfRangeException();
C = newValue == 300 ? 100 : newValue < 200 ? 0 : newValue - 200;
B = newValue == 200 ? 100 : newValue > 200 ? 100 - C : newValue - 100;
A = newValue <= 200 ? 100 - B : 0;
}
private static void ShowValues()
{
Console.WriteLine($"Current values: A = {A}, B = {B}, C = {C}.");
}
private static int GetIntFromUser(string prompt)
{
int input;
do
{
Console.Write(prompt);
} while (!int.TryParse(Console.ReadLine(), out input));
return input;
}
private static void Main(string[] args)
{
while (true)
{
ShowValues();
ProcessInput(GetIntFromUser("Input a value: "));
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private CameraWeight cw = new CameraWeight();
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = cw.ToString();
}
private void button1_Click(object sender, EventArgs e)
{
cw.Increase();
label1.Text = cw.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
cw.Decrease();
label1.Text = cw.ToString();
}
}
public class CameraWeight
{
private int _m_Weight0 = 1000;
private int _m_Weight1 = 0;
private int _m_Weight2 = 0;
public double m_Weight0
{
get { return (double)_m_Weight0/10; }
}
public double m_Weight1
{
get { return (double)_m_Weight1/10; }
}
public double m_Weight2
{
get { return (double)_m_Weight2/10; }
}
public void Increase()
{
if(_m_Weight0 > 0)
{
_m_Weight0 += -1;
_m_Weight1 += 1;
}
else if (_m_Weight1 > 0.0)
{
_m_Weight1 += -1;
_m_Weight2 += 1;
}
}
public void Decrease()
{
if (_m_Weight2 > 0.0)
{
_m_Weight2 += -1;
_m_Weight1 += 1;
}
else if (_m_Weight1 > 0.0)
{
_m_Weight1 += -1;
_m_Weight0 += 1;
}
}
public override string ToString()
{
return string.Format("{0}, {1}, {2}", m_Weight0.ToString("F1"), m_Weight1.ToString("F1"), m_Weight2.ToString("F1"));
}
}