У меня есть 6300 * 5
массив:Draw CIE цветовое пространство в MSChart
- Колонны
1,2
= CIE данные - Колонки
3,4,5
= S R G B
Как я должен рисовать это в MSChart?
У меня есть 6300 * 5
массив:Draw CIE цветовое пространство в MSChart
1,2
= CIE данные3,4,5
= S R G BКак я должен рисовать это в MSChart?
У вас есть несколько вариантов:
DataPoints
с Markers
в соответствующем Colors
Annotations
xxxPaint
событийТолько с 6500 точками вы не можете заполнить область, установив одиночные пиксели. Поэтому вам лучше использовать вызов FillElipse
для каждой точки.
Если вы используете Pre
- или PostPaint
событие, которое нужно будет использовать методы AxisX/Y ValueToPixelPosition
для вычисления координат пикселя из значений CIE.
В любом случае вы устанавливаете Minimum
и Maximum
как для Axes
.
Кроме того, необходимо будет рассчитать либо Markers
«или Annotations
» или размер эллипсов от графика ClientSize
избежать некрасивых пробелов в цветной области.
Если вы хотите использовать точки данных Установите ChartType = Точка и использовать эту функцию для каждого из ваших данных:
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);
}
Вот пример настройки его с рассчитанным набором данных. Вместо этого вы должны перебирать свой список данных.:
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);
Результат:
После захвата ~ 6к цвета от цвета CIE диаграмме результат выглядит довольно зернистое, но в основном правильно:
Обратите внимание, что вам вероятно, нужно как-то разрешить обратную ось y; Я просто вычитал свои значения y из 0.9f. Используйте свои собственные номера!
Большое вам спасибо, очень полезно. но у меня проблема, моя точка не может заполнить области, как я заполняю? –
Постарайтесь сделать маркеры более крупными! – TaW
Действительно ли они могут быть, но, может быть, немного неполными? Кажется, что нет данных для розовой части или для ясных желтых? И они также кажутся несколько неравномерными. Откуда вы их получите? Могу ли я получить к ним доступ, чтобы играть с ними? – TaW
Откуда вы взяли данные? – TaW
Я добавил скриншот, используя 6.2k точек из изображения CIE. – TaW
пришлите мне свои данные. мой адрес электронной почты: [email protected] –