颜色转换困难
本文关键字:转换 颜色 | 更新日期: 2023-09-27 18:32:45
我在地图上有GRP轨道,难度从1到10。我希望这些轨道根据难度有不同的颜色。容易难度是绿色,困难是红色,中等难度是橙色。但是,我不仅需要这 3 种颜色,还需要它们之间更平滑的过渡。比如每个难度点都有一种颜色,或者每半点用一种颜色。有没有算法来计算这些颜色及其过渡?比如以某种方式增加/减少 rgb 值?谢谢。
Red = 255,0,0
Yellow = 255, 255, 0
Green = 0,255,0
创建一个从级别 1 循环到 10 的 for 循环。
对于每个级别,将颜色创建为如下所示:
Red = level * 25.5;
Green = 255 - (level * 25.5);
Blue = 0;
然后从 RGB 值创建颜色。
显然,这只是伪代码,但它应该给你一个开始的想法。
您正在寻找的是跨颜色插值的能力。仅仅在两种颜色之间进行插值可能是不够的(因为您可能会在两者之间得到虚假颜色),而是将每种颜色的 RGB 视为 3D 空间中的一个点,并沿表示颜色的折线(其中每个点都是颜色/中间颜色)进行插值(在您的情况下,困难)。这是一个链接,显示了我在说什么。
using System;
using System.Drawing;
using System.Windows.Forms;
public partial class MainForm : Form
{
protected override void OnPaint(PaintEventArgs e)
{
Color[] colors = new Color[11];
colors[0] = Color.Green;
colors[1] = Interpolate(Color.Green, Color.Orange, 0.2);
colors[2] = Interpolate(Color.Green, Color.Orange, 0.4);
colors[3] = Interpolate(Color.Green, Color.Orange, 0.6);
colors[4] = Interpolate(Color.Green, Color.Orange, 0.8);
colors[5] = Color.Orange;
colors[6] = Interpolate(Color.Orange, Color.Red, 0.2);
colors[7] = Interpolate(Color.Orange, Color.Red, 0.4);
colors[8] = Interpolate(Color.Orange, Color.Red, 0.6);
colors[9] = Interpolate(Color.Orange, Color.Red, 0.8);
colors[10] = Color.Red;
Rectangle rect = new Rectangle(10, 10, 20, 90);
for (int i = 0; i < colors.Length; i++)
{
e.Graphics.FillRectangle(new SolidBrush(colors[i]), rect);
rect.Offset(20, 0);
}
base.OnPaint(e);
}
private static Color Interpolate(Color a, Color b, double t)
{
int R = (int)(a.R + (b.R - a.R) * t);
int G = (int)(a.G + (b.G - a.G) * t);
int B = (int)(a.B + (b.B - a.B) * t);
return Color.FromArgb(R, G, B);
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}