GDI不过是个画图工具,没有所谓坐标系的概念
你想把一组值替换成另一组值,而这两组值是成线性(等比例)的,自己用等比函数计算一下就好了,无非加减乘除而已,连三角函数都不用

解决方案 »

  1.   

    比如你输入的最小值是IMin,最大值IMax
    输出的最小值是OMin,最大值OMax
    想要通过任意一组输入IX和IY求得输出OX和OY比例公式就是
    OX=(IX-Imin)(OMax-Omin)/(IMax-IMin)+Omin
      

  2.   

    当前前面其实只给出了通过IX计算OX
    想计算OY,公式是一样的,不过需要把Imin,Imax这些东西替换成Y轴的最大值最小值罢了公式是根据等比例来推导的,原始公式如下,自己理解:
    (OX-Omin)/(Omax-Omin)=(IX-Imin)/(Imax-Imin)
      

  3.   

    你在纸上是如何建立坐标系的,在GDI+里也一样建立。
      

  4.   


    1. 在 .NET 里面,GDI+ 的坐标系就是左上角(0,0),这是无法改变的,你可以 offset,你可以 rotate、flip,但都是基于 (0,0) 的,没法改变其基本坐标系的原点,设置成左下角,相应的其他也会改变,不是你理想的坐标系。理想的坐标系相对于你的 WinForm 坐标系,你可以自己做一下转换,比如原来的 (10, 5),你是从底部发起,那么转换成 GDI+ 的坐标系就是 (10, form.ClientSize.Height - 5)。
    2. 你传入的任何坐标都是基于 top-left-corner 的。你可以传入原始坐标,在自定义的 DrawLine 方法里面,自己内部进行转换。
      

  5.   


    1. 在 .NET 里面,GDI+ 的坐标系就是左上角(0,0),这是无法改变的,你可以 offset,你可以 rotate、flip,但都是基于 (0,0) 的,没法改变其基本坐标系的原点,设置成左下角,相应的其他也会改变,不是你理想的坐标系。理想的坐标系相对于你的 WinForm 坐标系,你可以自己做一下转换,比如原来的 (10, 5),你是从底部发起,那么转换成 GDI+ 的坐标系就是 (10, form.ClientSize.Height - 5)。
    2. 你传入的任何坐标都是基于 top-left-corner 的。你可以传入原始坐标,在自定义的 DrawLine 方法里面,自己内部进行转换。那请问,我有一些 (756589,56238)这样的点坐标,我该如何写代码用矩阵建立坐标系呢?内部怎么转换?才能在屏幕的中心画出这个点
      

  6.   

    如何使用GDI绘制坐标图
     protected void Page_Load(object sender, EventArgs e)
        {
            Bitmap bm = new Bitmap(600, 400);//定义位图实例,并初始化大小
            Graphics g = Graphics.FromImage(bm);//定义绘图画面,封装上面的位图实例
            g.Clear(Color.GreenYellow);//定义绘图画面背景色        Pen p = new Pen(Color.Blue, 2);//定义一个2像素大小、蓝色铅笔
            g.DrawLine(p, new Point(0, 200), new Point(bm.Width, 200));//用铅笔在画面中间绘制一条x轴线
            g.DrawLine(p, new Point(300, 0), new Point(300, bm.Height));//用铅笔在画面中间绘制一条y轴线        //定义矩形区域,其参数分别表示一个矩形的位置和大小
            Rectangle rect1 = new Rectangle(100, 50, 100, 100);
            Rectangle rect2 = new Rectangle(400, 50, 100, 100);
            Rectangle rect3 = new Rectangle(250, 250, 100, 100);
            //分别用上面定义的矩形区域画圆
            g.DrawEllipse(p, rect1);
            g.DrawEllipse(p, rect2);
            g.DrawEllipse(p, rect3);
            //绘制一条直线连接第1、2个圆的圆点
            g.DrawLine(p, new Point(rect1.X + rect1.Width / 2, rect1.Y + rect1.Height / 2), new Point(rect2.X + rect1.Width / 2, rect1.Y + rect2.Height / 2));
            Brush b = new SolidBrush(Color.Red);//定义一个红色的笔刷
            Font drawFont = new Font("Arial", 12);//定义一个字体实例        //定义坐标值,其中DrawString()方法的参数为:显示值、字体属性、笔刷实例、坐标点
            for (int i = 0; i <= 6; i++)//循环绘制x轴坐标值
            {
                g.DrawString(Convert.ToString(i * 100), drawFont, b, new PointF(i * 50 + 300, 200));
            }
            for (int j = 0; j <= 6; j++)//循环绘制y轴坐标值
            {
                g.DrawString(Convert.ToString(j * 100), drawFont, b, new PointF(300, 200 - j * 50));
            }//codego.net/tags/11/1/
            //输出图像格式为JPG,并显示在浏览器中
            bm.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
        }
      

  7.   

       Using G As Graphics = Graphics.FromHwnd(Me.Handle)
                G.TranslateTransform(0, Me.Height) '将0,0原点设置为左下角,但坐标系仍然是向右变大,向上变小.
            End Using
      

  8.   


    1. 在 .NET 里面,GDI+ 的坐标系就是左上角(0,0),这是无法改变的,你可以 offset,你可以 rotate、flip,但都是基于 (0,0) 的,没法改变其基本坐标系的原点,设置成左下角,相应的其他也会改变,不是你理想的坐标系。理想的坐标系相对于你的 WinForm 坐标系,你可以自己做一下转换,比如原来的 (10, 5),你是从底部发起,那么转换成 GDI+ 的坐标系就是 (10, form.ClientSize.Height - 5)。
    2. 你传入的任何坐标都是基于 top-left-corner 的。你可以传入原始坐标,在自定义的 DrawLine 方法里面,自己内部进行转换。那请问,我有一些 (756589,56238)这样的点坐标,我该如何写代码用矩阵建立坐标系呢?内部怎么转换?才能在屏幕的中心画出这个点我已经说的很清楚了!
    如果按照原始坐标系,你的点是 (X, Y),那么如果你在一个长宽为 (W, H) 的 Form 上建立坐标系,原始点需要偏移到 (0, Y)。
    那么,很简单,原始点偏移多少,你实际的点就偏移多少,原始点是 (756589, 56238),那么显示在 Form 上的就是 (756589, 56238 + H)。
      

  9.   


    1. 在 .NET 里面,GDI+ 的坐标系就是左上角(0,0),这是无法改变的,你可以 offset,你可以 rotate、flip,但都是基于 (0,0) 的,没法改变其基本坐标系的原点,设置成左下角,相应的其他也会改变,不是你理想的坐标系。理想的坐标系相对于你的 WinForm 坐标系,你可以自己做一下转换,比如原来的 (10, 5),你是从底部发起,那么转换成 GDI+ 的坐标系就是 (10, form.ClientSize.Height - 5)。
    2. 你传入的任何坐标都是基于 top-left-corner 的。你可以传入原始坐标,在自定义的 DrawLine 方法里面,自己内部进行转换。那请问,我有一些 (756589,56238)这样的点坐标,我该如何写代码用矩阵建立坐标系呢?内部怎么转换?才能在屏幕的中心画出这个点我已经说的很清楚了!
    如果按照原始坐标系,你的点是 (X, Y),那么如果你在一个长宽为 (W, H) 的 Form 上建立坐标系,原始点需要偏移到 (0, Y)。
    那么,很简单,原始点偏移多少,你实际的点就偏移多少,原始点是 (756589, 56238),那么显示在 Form 上的就是 (756589, 56238 + H)。
    再请问,如果我想实现放大缩小的效果,该怎么修改实现坐标系呢?
      

  10.   

    你太懒了,这是数学题,不是编程题了。同比例放大缩小你不会吗?
    (X, Y) 放大两倍,不就是 (2X, 2Y) 吗?
      

  11.   

    拿着这么低级的工具来做 GIS 上图系统客户端,你不是要“累死”啊?你整天研究 GDI+ 也不过是画点小孩子涂鸦的嘛。要做一个商品化的软件,需要在一个“图形控件平台”上去开发,可不是你这种做法。最起码地,你要了解 WPF 的容器、画布、变换、各种图形控件。
      

  12.   

    可能你研究了5年以后,在csdn上终于发发表了几篇“玩一玩儿GDI+绘图”的帖子,但是与一个软件公司要做一个上图系统,差得还是4年光景吧?别人用4个月做出来的上图软件,你用5年也不一定做出人家的三分之一,这都是源于工具选择的太低级了啊。别纠结于 winform 了,它没有你最需要的工具,你只能找到一些绘图皮毛。
      

  13.   


    1. 在 .NET 里面,GDI+ 的坐标系就是左上角(0,0),这是无法改变的,你可以 offset,你可以 rotate、flip,但都是基于 (0,0) 的,没法改变其基本坐标系的原点,设置成左下角,相应的其他也会改变,不是你理想的坐标系。理想的坐标系相对于你的 WinForm 坐标系,你可以自己做一下转换,比如原来的 (10, 5),你是从底部发起,那么转换成 GDI+ 的坐标系就是 (10, form.ClientSize.Height - 5)。
    2. 你传入的任何坐标都是基于 top-left-corner 的。你可以传入原始坐标,在自定义的 DrawLine 方法里面,自己内部进行转换。那请问,我有一些 (756589,56238)这样的点坐标,我该如何写代码用矩阵建立坐标系呢?内部怎么转换?才能在屏幕的中心画出这个点我已经说的很清楚了!
    如果按照原始坐标系,你的点是 (X, Y),那么如果你在一个长宽为 (W, H) 的 Form 上建立坐标系,原始点需要偏移到 (0, Y)。
    那么,很简单,原始点偏移多少,你实际的点就偏移多少,原始点是 (756589, 56238),那么显示在 Form 上的就是 (756589, 56238 + H)。你的思路是普通思路。试想,有几万个点、多边形等不同的形状,每次放大缩小后,还得循环重新计算图形的新坐标么?太繁琐了。
    经过研究,我终于实现了批量地理坐标不用做任何二次计算,就能任意绘图,平移,缩放。我的办法是修改坐标系而不是修改图形坐标,完全不用再像你所谓的X*2,Y*2来实现放大。就核心的几十条语句全部实现平移缩放,而图形的原始坐标不需要做任何改变。唯一要做的就是在不同的坐标系中按照原始坐标重绘而已。呵呵,求人不如求己啊