2017-02-08 5 views
1

У меня есть 6300 * 5 массив:Draw CIE цветовое пространство в MSChart

  • Колонны 1,2 = CIE данные
  • Колонки 3,4,5 = S R G B

Как я должен рисовать это в MSChart?

enter image description here

+0

Откуда вы взяли данные? – TaW

+0

Я добавил скриншот, используя 6.2k точек из изображения CIE. – TaW

+0

пришлите мне свои данные. мой адрес электронной почты: [email protected] –

ответ

0

У вас есть несколько вариантов:

  • Добавить 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); 

Результат:

enter image description here

После захвата ~ 6к цвета от цвета CIE диаграмме результат выглядит довольно зернистое, но в основном правильно:

enter image description here

Обратите внимание, что вам вероятно, нужно как-то разрешить обратную ось y; Я просто вычитал свои значения y из 0.9f. Используйте свои собственные номера!

+0

Большое вам спасибо, очень полезно. но у меня проблема, моя точка не может заполнить области, как я заполняю? –

+0

Постарайтесь сделать маркеры более крупными! – TaW

+0

Действительно ли они могут быть, но, может быть, немного неполными? Кажется, что нет данных для розовой части или для ясных желтых? И они также кажутся несколько неравномерными. Откуда вы их получите? Могу ли я получить к ним доступ, чтобы играть с ними? – TaW

Смежные вопросы