Нужна логика для определения размера маркера на основе количества точек, интервала и площади графика - PullRequest
1 голос
/ 20 октября 2011

Я строю xy точечный график. Мне нужно выбрать размер маркера, чтобы точки не перекрывали друг друга на основе области диаграммы, общего количества точек xy и минимального интервала между точками на оси X и Y.

В настоящее время я делаю так:

int marginWidth = chart1.Size.Width;
int marginHeight = chart1.Size.Height;

chart1.Series[0].MarkerSize = (((marginWidth * marginHeight) / (marginWidth + marginHeight)) /18)

18 - это просто откалиброванное значение для примерно 100 точек xy. Но очевидно, что при увеличении количества точек размер маркера необходимо уменьшить для лучшей видимости.

Кто-нибудь может подсказать мне логику для этого?

Ответы [ 2 ]

0 голосов
/ 14 июня 2014

Попробуйте это (Рассчитать расстояние между двумя маркерами) Размер маркера = Расстояние

//chart object PrePaint event...     
private void chart1_PrePaint(object sender, ChartPaintEventArgs e)
    {

        //get the PixelPosition of first Marker
        double X1 = chart1.ChartAreas[0].AxisX.ValueToPixelPosition(1); //X 
        double Y1 = chart1.ChartAreas[0].AxisY.ValueToPixelPosition(1); //Y
        //get the PixelPosition of second Marker(X-Axis)
        double X2 = chart1.ChartAreas[0].AxisX.ValueToPixelPosition(2); //X
        double Y2 = chart1.ChartAreas[0].AxisY.ValueToPixelPosition(1); //Y
        //get the PixelPosition of second Marker(Y-Axis)
        double X3 = chart1.ChartAreas[0].AxisX.ValueToPixelPosition(1); //X
        double Y3 = chart1.ChartAreas[0].AxisY.ValueToPixelPosition(2); //Y
        //Calculate the Distance by Pythagoras (c² = a² + b²)
        //=> a² = (X1 - X2)² && b² = (Y1-Y2)²
        //Sorry is in german but the video explain
        //http://matheguru.com/lineare-algebra/224-abstand-zwischen-zwei-punkten.html
        double disctanceX = Math.Sqrt(Math.Pow(X1 - X2, 2) + Math.Pow(Y1 - Y2, 2));
        double disctanceY = Math.Sqrt(Math.Pow(X1 - X3, 2) + Math.Pow(Y1 - Y3, 2));

        //limit the marker at smaller value
        if (disctanceX < disctanceY)
        {
                                          //cut the decimals other routines are possible
            chart1.Series[0].MarkerSize = (int) Math.Ceiling(disctanceX);
        }
        else
        {
            chart1.Series[0].MarkerSize = (int) Math.Ceiling(disctanceY);
        }
    }
0 голосов
/ 20 октября 2011

Я вижу «простое» решение: установите размер маркера в зависимости от ваших данных.Поэтому вместо «18» вы должны поместить chart1.Series [0] .Count или что-то вроде этого =)

...