在 MSchart 中绘制 CIE 颜色 Space

Draw CIE color Space in MSchart

我有一个 6300 * 5 数组:

这个在MsChart中应该怎么画?

您有多种选择:

  • 在相应的 Colors
  • 中添加 DataPointsMarkers
  • 添加Annotations
  • 使用 xxxPaint 事件之一

只有 6500 个点,您无法通过设置单个像素来真正填充该区域。所以你最好对每个点使用 FillElipse 调用。

如果您使用 Pre- 或 PostPaint 事件,您将需要使用 AxisX/Y 方法 ValueToPixelPosition 从 CIE 值计算像素坐标。

在任何情况下,您都为 Axes.

设置了 MinimumMaximum

此外,您还需要根据图表的 ClientSize 计算 Markers' 或 Annotations' 或椭圆的大小,以避免彩色区域出现难看的间隙。

如果您想使用数据点,请设置 ChartType = Point 并对每个数据使用此函数:

DataPoint Cie2DataPoint(float x, float y, float r, float g, float b)
{
    var dp = new DataPoint(x, y);
    dp.Color = Color.FromArgb((int)(256 * r), (int)(256 * g),(int)(256 * b));
    dp.MarkerColor = dp.Color;
    return dp;
}

以下是辅助函数的示例:

int MarkerSize(Chart chart, int count)
{
    return Math.Max(chart.ClientSize.Width, chart.ClientSize.Height )/ count + 1
}

void Rescale(Chart chart)
{
    Series s = chart3.Series[0];
    s.MarkerSize = MarkerSize(chart3, (int)Math.Sqrt(s.Points.Count));
}

前者估计每个轴有多少个绘图点;你可能需要做一些实验。下一个假设这些点实际上填满了一个正方形;还有你只有一个 ChartArea

这也应该为您的数据修改!

我们需要在调整图表大小时重新调整大小:

private void chart3_Resize(object sender, EventArgs e)
{
    Rescale (sender as Chart);
}

这里是使用一组计算数据进行设置的示例。你应该遍历你的数据列表..:[=​​32=]

Series s = chart3.Series[0];
s.ChartType = SeriesChartType.Point;
s.MarkerSize = 3;
for (int x = 0; x < 100; x++)
   for (int y = 0; y < 100; y++)
   {
        s.Points.Add(Cie2DataPoint(x/100f, y/100f, x/100f, y/100f, (x+y)/200f));
   }

ChartArea ca = chart3.ChartAreas[0];
ca.AxisX.Minimum = 0;
ca.AxisY.Minimum = 0;
ca.AxisX.Maximum = 1;
ca.AxisY.Maximum = 1;
ca.AxisX.Interval = 0.1f;
ca.AxisY.Interval = 0.1f;
ca.AxisX.LabelStyle.Format = "0.00";
ca.AxisY.LabelStyle.Format = "0.00";

Rescale(chart3);

结果:

从 CIE 颜色图表中抓取 ~6k 种颜色后,结果看起来很粗糙但基本正确:

请注意,您可能需要以某种方式允许反向 y-axis;我只是从 0.9f 中减去 y-values。使用您自己的号码!