首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将图表坐标转换为像素

将图表坐标转换为像素
EN

Stack Overflow用户
提问于 2011-08-12 21:11:05
回答 3查看 6.6K关注 0票数 2

我应该在极地图表内画一个圆圈,上面有一些文字。

我开始使用PostPaint,得到了图表图形,所以我可以在上面绘制和编写自定义的东西。

我的主要问题是位置。

例如,我想在x和y轴相交的地方绘制sg,但我没有找到任何有效的方法将图形坐标(在我的示例中为0,0)转换为像素坐标。

我该怎么做呢?如何将图表坐标转换为像素?

.net4/winforms/vs2010/c#

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-13 03:58:32

所以,我解决了它。

我处理mschart的postpaint事件:

代码语言:javascript
运行
复制
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);
        }
    }
票数 3
EN

Stack Overflow用户

发布于 2016-07-19 22:29:26

自回答的解决方案既不适用于更一般的情况,也不实际将DataPoint 转换为pixel-coordinates.

这是一个绘制圆的解决方案,它将始终起作用:

代码语言:javascript
运行
复制
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));
}

它使用了两个辅助函数:

代码语言:javascript
运行
复制
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);
}

And here is a link to a general coordinate transformation function for polar charts

票数 3
EN

Stack Overflow用户

发布于 2011-08-12 21:18:01

找到比率了吗?如果cord是100x100,其中单位是伪的,那么当转换到200x200像素时,如果coord是200x100,并且物理上100x100 X具有比率2.0,Y具有比率1.0,则只需使用ratio 2.0。当我执行SVG时,我必须通过偏移全部+1000 http://en.wikipedia.org/wiki/Cartesian_coordinate_system来偏移0,0 (左上角)到笛卡尔坐标(0,0在中心)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7040569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档