- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将双精度值(介于0和1之间)转换为RGB颜色。在下面的代码中,您可以看到Im试图执行的操作,但我认为该算法存在问题。我没有得到所有的颜色。当我从double转换为int或Im不确定时,信息可能会很松散。但是请查看一下,如果您有任何建议或任何其他方法(已验证的一种方法),请告诉我:
private Color generateRGB(double X)
{
Color color;
if (X >= 0.5) //red and half of green colors
{
int Red = (int)((2 * X - 1) * 255);
int Green = (int)((2 - 2 * X) * 255);
int Blue = 0;
color = Color.FromArgb(Red, Green, Blue);
}
else // blue and half of green colors
{
int Red = 0;
int Green = (int)((2 * X) * 255);
int Blue = (int)((1 - 2 * X) * 255);
color = Color.FromArgb(Red, Green, Blue);
}
return color;
}
m extending this interval to [0, 360] in order to use the algorithm for converting HSV to RGB. I
m。这是用于更好解释的代码。
private Color generateRGB(double X)
{
Color color;
int red;
int green;
int blue;
HsvToRgb(X*360,1,1,out red,out green,out blue);
color = Color.FromArgb(red, green, blue);
return color;
}
最佳答案
在您的评论中,您说过:“不,我的目的不是要包含所有颜色,我也不想支持它们中的任何一种。简单地说,我想将double值转换为RGB颜色的最佳方法”
因此,您不必担心double
和Color
之间的实际关系是什么,并且您不想以某种方式与double
对应项保持一致的方式对Color
值进行操作。
在这种情况下,事情比您预期的要容易。
可能我提醒您,RGB颜色由3个字节组成,尽管由于组合原因,.NET BCL类Color
提供了3个分量作为int
值。
所以你有3个字节!double
占用8个字节。
如果我的假设是正确的,那么在此答案的结尾,您可能会考虑将float
作为更好的选择(当然,如果较小的占用空间对您很重要)。
聊够了,再谈实际问题。
我将要介绍的方法与其在数学上的联系不大,而与内存管理和编码紧密相关。
您是否听说过StructLayoutAttribute
属性及其随行对象FieldOffsetAttribute
属性?
如果没有,您可能会被他们敬畏。
假设您有一个结构,我们称之为CommonDenominatorBetweenColoursAndDoubles
。
假设它包含4个公共字段,如下所示:
public struct CommonDenominatorBetweenColoursAndDoubles {
public byte R;
public byte G;
public byte B;
public double AsDouble;
}
R
,
G
和
B
字段(每个字段占用1个字节)连续排列,并且
AsDouble
的布局这一事实(请注意,功能强大,责任重大)
struct
,
R
和
G
从
B
的第0、1和2个字节开始的事实(因为我们知道
struct
占用1个字节),而
byte
也从0处开始字节,在
AsDouble
中。
struct
命名空间下的
mscorlib.dll
中找到,您可以在
StructLayout和
FieldOffset处阅读有关它们的信息。
[StructLayout(LayoutKind.Explicit)]
public struct CommonDenominatorBetweenColoursAndDoubles {
[FieldOffset(0)]
public byte R;
[FieldOffset(1)]
public byte G;
[FieldOffset(2)]
public byte B;
[FieldOffset(0)]
public double AsDouble;
}
System.Runtime.InteropServices
(种类)实例中的内存如下所示:
public static double ToDouble(this Color @this) {
CommonDenominatorBetweenColoursAndDoubles denom = new CommonDenominatorBetweenColoursAndDoubles ();
denom.R = (byte)@this.R;
denom.G = (byte)@this.G;
denom.B = (byte)@this.B;
double result = denom.AsDouble;
return result;
}
public static Color ToColor(this double @this) {
CommonDenominatorBetweenColoursAndDoubles denom = new CommonDenominatorBetweenColoursAndDoubles ();
denom.AsDouble = @this;
Color color = Color.FromArgb (
red: denom.R,
green: denom.G,
blue: denom.B
);
return color;
}
for (int x = 0; x < 255; x++) {
for (int y = 0; y < 255; y++) {
for (int z = 0; z < 255; z++) {
var c1 = Color.FromArgb (x, y, z);
var d1 = c1.ToDouble ();
var c2 = d1.ToColor ();
var x2 = c2.R;
var y2 = c2.G;
var z2 = c2.B;
if ((x != x2) || (y != y2) || (z != z2))
Console.Write ("1 error");
}
}
}
struct
encoding standard(这在所有语言,框架和大多数处理器之间很常见),您将得出结论(我也测试了),该结论是通过迭代所有8字节双精度码中的3个最低有效字节(24个最低有效位),这就是我们在这里所做的,最终将得到
double
值,该值在数学上受下限由
double
和< cc>在另一端(包括两端)。当然,如果剩余的更高5个字节用
0
填充,那是对的。
double.Epsilon * (256 * 3 - 1)
是一个很小的数字,人们甚至都不会发音。
0
和大于
double.Epsilon * (256 * 3 - 1)
的最小正数
2²⁴
之间的乘积(这是很小的),或者它更适合您:
double
。
0
值,该值是
8.28904556439245E-317
“连续的”
256 * 3
值,这些值以
2²⁴
开头,并以最小的
double
距离分隔。
0
数字范围从原始
double
扩展到
2²⁴
。
0 .. double.Epsilon * (2²⁴ - 1)
(或
0 .. 1
)误认为是指数字母
double.Epsilon
。
ε
以某种方式表示微积分的对应部分,这可能意味着大于
e
的最小实数。
double.Epsilon
(
0
是
N
)
N
个数字,它们从
2²⁴
开始,以
double
结尾(其中
0
或
ε * (N-1)
小于
ε
的最小
double.Epsilon
) 。
double
实际上只是在帮助我们实现这一点:
double[] allDoubles = new double[256 * 256 * 256];
double cursor = 0;
int index = 0;
for (int r = 0; r < 256; r++)
for (int g = 0; g < 256; g++)
for (int b = 0; b < 256; b++) {
allDoubles[index] = cursor;
index++;
cursor += double.Epsilon;
}
0
的所有麻烦呢?
struct
,
struct
和
N
输入来随机访问任何
R
值。
G
和
B
之间的均等分布):
0
中,我们将重命名
1
字段,将其设置为私有,并创建一个名为
struct
的新属性来处理转换(两种方式):
[StructLayout(LayoutKind.Explicit)]
public struct CommonDenominatorBetweenColoursAndDoubles {
[FieldOffset(0)]
public byte R;
[FieldOffset(1)]
public byte G;
[FieldOffset(2)]
public byte B;
// we renamed this field in order to avoid simple breaks in the consumer code
[FieldOffset(0)]
private double _AsDouble;
// now, a little helper const
private const int N_MINUS_1 = 256 * 256 * 256 - 1;
// and maybe a precomputed raw range length
private static readonly double RAW_RANGE_LENGTH = double.Epsilon * N_MINUS_1;
// and now we're adding a property called AsDouble
public double AsDouble {
get { return this._AsDouble / RAW_RANGE_LENGTH; }
set { this._AsDouble = value * RAW_RANGE_LENGTH; }
}
}
AsDouble
。
关于c# - 在C#中将 double 值转换为RGB颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20120781/
这个问题在这里已经有了答案: How to initialize var? (11 个答案) 关闭 8 年前。 我想给一个变量赋初值 null,并在下一个 if-else block 中赋值,但是编
我正在使用 TypeScript 3.8 编写 JS 和 TS 混合的代码。我写了以下行: export * as Easing from './easing'; 应该是 fair game在 Typ
我需要将 R 代码中的“/”更改为“\”。我有这样的事情: tmp <- paste(getwd(),"tmp.xls",sep="/") 所以我的 tmp是 c:/Study/tmp.xls 我希望
我有个问题。例如我有这个: id truth count 1 1 1 2 1 2 3 0 0 4 1 1 5 1 2 6 1
我正在尝试使用“IN”和“=”来查找一些 bean。我目前正在使用此代码: $ids = array(1,2,3,4); $user = 1; $things = R::find( 'thing'
是否可以在 Xcode 中部署到其他人的手机上?我没有 iPhone,但我想测试我在 friend 手机上制作的应用程序。在我支付 99 美元之前,我想确保这不会造成麻烦。 谢谢。 最佳答案 不会有任
我试图得到一个非常大的数字(超过 unsigned long long int )。所以我把它作为一个字符串,然后一个数字一个数字地转换成整数并使用它。 #include #include int
我在 Rust 中有 C 语言库的绑定(bind),但它们并不完整。 在 C 代码中,我定义了一个简化的宏,如下所示: #define MY_MACROS1(PTR) (((my_struct1
我正在努力解决这个问题。 http://jsfiddle.net/yhcqfy44/ 动画应该自动相对于 滚动到顶部每次出现滚动条时的高度。 我已经写了这个,但没有运气: var hheight =
我正在处理一个将数字作为字符串返回的 JSON API。例如 "12" ,但是,该字段值也可以是非数字的,例如:"-" . 我已将 JSON 数据解析为映射,我想将此字段提取为 elixir 中的整数
我正在尝试编写一个类,将.wav文件转换为.aiff文件作为项目的一部分。 我遇到了几个库Alvas.Audio(http://alvas.net/alvas.audio,overview.aspx)
我想在 Lucene 中将像“New York”这样的“复合词”索引为单个术语,而不是像“new”、“york”那样。这样,如果有人搜索“new place”,则包含“new york”的文档将不会匹
我希望这个解释能让我更好地了解使用宏的优点。 最佳答案 在函数中,所有参数在调用之前都会被评估。 这意味着 or 作为函数不能是惰性的,而宏可以将 or 重写为 if 语句,该语句仅在以下情况下计算分
我有一些看起来像这样的 XML foo ]]> (注意 > 登录 "> foo")和 XSLT 样式表 当我运行xsltproc stylesheet.xs
当我尝试将 Any 转换为 List 时,如下面的示例所示,我得到“Unchecked cast: Any!”到列表'警告。有没有解决此类问题的方法? val x: List = objectOfTy
我正在使用 Python 开发一个简单的爬虫。目的是创建一个 sitemap.xml。(你可以在这里找到真正的 alpha 版本:http://code.google.com/p/sitemappy/
我想知道在 VBScript 中是否可以在多行中中断 If 语句。喜欢: If (UCase(Trim(objSheet.Cells(i, a).Value)) = "YES") Or _ (UCas
for (String item : someList) { System.out.println(item); } 使用“do while”是否等效? 谢谢。 最佳答案 如果列表为空,f
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Split string with delimiters in C 在 C 中将“,”分隔的列表拆分为数组的最佳方法
我有一个如下所示的字符数组: [0, 10, 20, 30, 670] 如何将此字符串转换为整数数组? 这是我的数组 int i=0; size_t dim = 1; char* array = (c
我是一名优秀的程序员,十分优秀!