Преобразовать координаты диаграммы в пиксели - PullRequest
2 голосов
/ 12 августа 2011

Я должен нарисовать круг внутри полярной диаграммы с текстом на ней.

Я начал играть с PostPaint, получил графику диаграмм, поэтому я могу рисовать и писать на ней что-то особенное.

Моя главная проблема - размещение.

например. Я хотел бы нарисовать sg, где мои оси x и y пересекаются, но я не нашел эффективного способа преобразования координат графика (в моем примере 0,0) в координаты пикселей.

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

.net4 / WinForms / VS2010 / C #

Ответы [ 3 ]

3 голосов
/ 12 августа 2011

Итак, я решил это.

Я обработал событие postpaint mschart:

private void chartMain_PostPaint(object sender, ChartPaintEventArgs e)
    {
        try
        {
            if (chartMain.ChartAreas.FirstOrDefault(a=>a.Name == "Default") == null)
                return;

            Graphics graph = e.ChartGraphics.Graphics;

            var day = Date.GetBoundaries(daySelectorMain.DateTimePickerDay.Value);
            var toDate = day.Item2; //it is maxdate value (max value of x axis)

            var centerY = (float)chartMain.ChartAreas["Default"].AxisY.ValueToPixelPosition(-80); //-80 is the min value of y (y axis)
            var centerX = (float)chartMain.ChartAreas["Default"].AxisX.ValueToPixelPosition(toDate.ToOADate());

            var origoY = (float)chartMain.ChartAreas["Default"].AxisY.ValueToPixelPosition(0);
            var origoX = (float)chartMain.ChartAreas["Default"].AxisX.ValueToPixelPosition(toDate.ToOADate());

            var radius = (float)(centerY - origoY) - 1;

            graph.DrawLine(System.Drawing.Pens.Blue,
                           new PointF(origoX, origoY),
                           new PointF(centerX, centerY));

            graph.FillEllipse(new SolidBrush(Color.White), centerX - radius, centerY - radius, radius * 2, radius * 2);
        }
        catch (System.Exception exc)
        {
            Debug.Assert(false, exc.Message);
        }
    }
2 голосов
/ 19 июля 2016

Решение с автоответчиком не работает ни в более общем случае, ни фактически преобразует DataPoint значения в пиксельные координаты .

ВотРешение для рисования круга, который всегда будет работать:

private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
{
    RectangleF ipp = InnerPlotPositionClientRectangle(chart1, chart1.ChartAreas[0]);
    using (Graphics g = chart1.CreateGraphics())
        g.DrawEllipse(Pens.Red, new RectangleF(ipp.Location, ipp.Size));
}

Используются две вспомогательные функции:

RectangleF ChartAreaClientRectangle(Chart chart, ChartArea CA)
{
    RectangleF CAR = CA.Position.ToRectangleF();
    float pw = chart.ClientSize.Width / 100f;
    float ph = chart.ClientSize.Height / 100f;
    return new RectangleF(pw * CAR.X, ph * CAR.Y, pw * CAR.Width, ph * CAR.Height);
}

RectangleF InnerPlotPositionClientRectangle(Chart chart, ChartArea CA)
{
    RectangleF IPP = CA.InnerPlotPosition.ToRectangleF();
    RectangleF CArp = ChartAreaClientRectangle(chart, CA);

    float pw = CArp.Width / 100f;
    float ph = CArp.Height / 100f;

    return new RectangleF(CArp.X + pw * IPP.X, CArp.Y + ph * IPP.Y,
                            pw * IPP.Width, ph * IPP.Height);
}

А вот ссылка на общую функцию преобразования координатдля полярных карт .

0 голосов
/ 12 августа 2011

Найти соотношение?если шнур 100x100, где единицы измерения псевдо, то при преобразовании в пиксель 200x200 вам просто нужно использовать коэффициент 2.0, если координата 200x100, и физически 100x100 X имеет коэффициент 2.0, а Y имеет коэффициент 1.0. Когда я делаю SVG, мне нужно сместить 0,0 (верхний левый угол) в декартовы координаты (0,0 в центре) путем смещения всех на +1000 http://en.wikipedia.org/wiki/Cartesian_coordinate_system

...