在 MSchart 中绘制 CIE 颜色 Space
Draw CIE color Space in MSchart
我有一个 6300 * 5
数组:
- 列
1,2
= CIE 数据
- 列
3,4,5
= S R G B
这个在MsChart中应该怎么画?
您有多种选择:
- 在相应的
Colors
中添加 DataPoints
和 Markers
- 添加
Annotations
- 使用
xxxPaint
事件之一
只有 6500 个点,您无法通过设置单个像素来真正填充该区域。所以你最好对每个点使用 FillElipse
调用。
如果您使用 Pre
- 或 PostPaint
事件,您将需要使用 AxisX/Y 方法 ValueToPixelPosition
从 CIE 值计算像素坐标。
在任何情况下,您都为 Axes
.
设置了 Minimum
和 Maximum
此外,您还需要根据图表的 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。使用您自己的号码!
我有一个 6300 * 5
数组:
- 列
1,2
= CIE 数据 - 列
3,4,5
= S R G B
这个在MsChart中应该怎么画?
您有多种选择:
- 在相应的
Colors
中添加 - 添加
Annotations
- 使用
xxxPaint
事件之一
DataPoints
和 Markers
只有 6500 个点,您无法通过设置单个像素来真正填充该区域。所以你最好对每个点使用 FillElipse
调用。
如果您使用 Pre
- 或 PostPaint
事件,您将需要使用 AxisX/Y 方法 ValueToPixelPosition
从 CIE 值计算像素坐标。
在任何情况下,您都为 Axes
.
Minimum
和 Maximum
此外,您还需要根据图表的 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。使用您自己的号码!