Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将一个范围内的数字转换为另一个范围内的数字_C#_Math_Scaling - Fatal编程技术网

C# 将一个范围内的数字转换为另一个范围内的数字

C# 将一个范围内的数字转换为另一个范围内的数字,c#,math,scaling,C#,Math,Scaling,可能重复: 所以我有一个函数,它返回0到255之间的值,我需要将这些值转换成-255到255之间的值 所以200大概是145,150大概是45,依此类推。。 我已经看过了,但是那里的公式行不通。 我还可以使用其他公式吗?Adjusted=original/255*510-255 145 = 200 / 255 * 510 - 255 45 = 145 / 255 * 510 - 255 任意范围的一般解 var val1 = 200; var min1 = 0; var max1 = 25

可能重复:

所以我有一个函数,它返回0到255之间的值,我需要将这些值转换成-255到255之间的值 所以200大概是145,150大概是45,依此类推。。 我已经看过了,但是那里的公式行不通。
我还可以使用其他公式吗?

Adjusted=original/255*510-255

145 = 200 / 255 * 510 - 255
 45 = 145 / 255 * 510 - 255

任意范围的一般解

var val1 = 200;
var min1 = 0;
var max1 = 255;
var range1 = max1 - min1;

var min2 = -255;
var max2 = 255;
var range2 = max2 - min2;

var val2 = val1*range2/range1 + min2;
试试这个:

int Adjust( int num )
{
    return num * 2 - 255;
}


为什么那里的公式对你不起作用?提供的链接实际上是最简单的方法。你能举个例子说明它为什么不工作吗?var oldRange=高-低;var newRange=newHigh-newLow;var newNumber=oldNumber*(oldRange/newRange);是这样吗?如果是这样的话,你关于200->145和150->45的数学是关闭的:)0-255已经在-255-255的范围内了…我看不出问题-P@user425291:你在另一个问题的答案中错误地阅读了公式。它说除以(OldMax-OldMin),然后加上NewMin。我看不出这将如何解决签名问题。@Jim Fall,什么签名问题?什么签名问题?插入原始值1得到-253,插入200得到145。似乎有效。@Sir Robert:看起来OP想要将(0到255)之间的给定数字重新缩放为(-255到255)。您的解决方案似乎无法解决将小于128的数字转换为负数的问题。@Jim Fall-操作顺序表示,最终的
-255
发生在所有其他操作之后,正确地将原来的
(0到127)
值调整为新的负数
(-255到-1)
value这是对这个问题的最好回答。请注意,这只是其中(正确)公式的C#实现,这是一个很好的答案。如果要转换的值高于或低于原始范围,则如何将其剪裁为所需范围的最小值或最大值。例如“int val=ConvertRange(20、110、0、100、10);”那么val是0'int val=ConvertRange(20,110,0,100,111);那么val在您的编辑中是100'Typo,应该是
returnnum*2-255?@jball:谢谢。这就是我第一次传球时的表现。抓住那个胖手指的错误真是太好了!我会选择这个,因为这是最简单的。我仍然想知道为什么我不能得到我链接到的示例。一定是看同一件事太久了!谢谢@JimFell你是怎么做这个公式的?请让我知道我有一个奇怪的@JimFell,我有一个奇怪的数字模式,我想转换成24小时格式的时间。
int Adjust( int num )
{
    return num * 2 - 255;
}
public int ConvertRange(
           int originalStart, int originalEnd,
           int newStart, int newEnd,
           int value)
{

  int originalDiff = originalEnd - originalStart;
  int newDiff = newEnd - newStart;
  int ratio = newDiff / originalDiff;
  int newProduct = value * ratio;
  int finalValue = newProduct + newStart;
  return finalValue; 

}