【问题标题】:Difficulty to color converter颜色转换器的难度
【发布时间】:2012-05-01 15:00:12
【问题描述】:

我在地图上有 GRP 轨道,难度从 1 到 10。我希望这些轨道根据难度具有不同的颜色。简单难度是绿色,困难是红色,中等难度是橙色。但是,我不仅需要这 3 种颜色,还需要它们之间的平滑过渡。就像每个难度点使用一种颜色或每半点使用一种颜色。是否有任何算法来计算这些颜色及其过渡?就像以某种方式增加/减少 rgb 值?谢谢。

【问题讨论】:

    标签: c# .net colors gradient


    【解决方案1】:
    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 值创建颜色。

    显然这只是伪代码,但它应该让您有一个开始的想法。

    【讨论】:

      【解决方案2】:

      您正在寻找的是跨颜色插值的能力。仅在两种颜色之间进行插值可能还不够(因为您可能会在两者之间得到虚假颜色),而是将每种颜色的 RGB 视为 3D 空间中的一个点并沿折线进行插值(其中每个点都是一种颜色/中间颜色) ) 代表颜色(在您的情况下是困难)。 Here 的链接显示了我在说什么。

      【讨论】:

      • +1 表示真相。颜色插值有多种不同的技术。你正在做一些简单而离散的事情,所以你可以只盯着它并称之为好。然而,总的来说,了解它的意义远不止于此。
      【解决方案3】:
      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());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-06-04
        • 1970-01-01
        • 2013-04-29
        • 1970-01-01
        • 2012-11-05
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多