GDI二维图形问题:如何建立自定义坐标系? GDI不过是个画图工具,没有所谓坐标系的概念你想把一组值替换成另一组值,而这两组值是成线性(等比例)的,自己用等比函数计算一下就好了,无非加减乘除而已,连三角函数都不用 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 比如你输入的最小值是IMin,最大值IMax输出的最小值是OMin,最大值OMax想要通过任意一组输入IX和IY求得输出OX和OY比例公式就是OX=(IX-Imin)(OMax-Omin)/(IMax-IMin)+Omin 当前前面其实只给出了通过IX计算OX想计算OY,公式是一样的,不过需要把Imin,Imax这些东西替换成Y轴的最大值最小值罢了公式是根据等比例来推导的,原始公式如下,自己理解:(OX-Omin)/(Omax-Omin)=(IX-Imin)/(Imax-Imin) 你在纸上是如何建立坐标系的,在GDI+里也一样建立。 1. 在 .NET 里面,GDI+ 的坐标系就是左上角(0,0),这是无法改变的,你可以 offset,你可以 rotate、flip,但都是基于 (0,0) 的,没法改变其基本坐标系的原点,设置成左下角,相应的其他也会改变,不是你理想的坐标系。理想的坐标系相对于你的 WinForm 坐标系,你可以自己做一下转换,比如原来的 (10, 5),你是从底部发起,那么转换成 GDI+ 的坐标系就是 (10, form.ClientSize.Height - 5)。2. 你传入的任何坐标都是基于 top-left-corner 的。你可以传入原始坐标,在自定义的 DrawLine 方法里面,自己内部进行转换。 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)这样的点坐标,我该如何写代码用矩阵建立坐标系呢?内部怎么转换?才能在屏幕的中心画出这个点 如何使用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); } Using G As Graphics = Graphics.FromHwnd(Me.Handle) G.TranslateTransform(0, Me.Height) '将0,0原点设置为左下角,但坐标系仍然是向右变大,向上变小. End Using 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)。 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, Y) 放大两倍,不就是 (2X, 2Y) 吗? 拿着这么低级的工具来做 GIS 上图系统客户端,你不是要“累死”啊?你整天研究 GDI+ 也不过是画点小孩子涂鸦的嘛。要做一个商品化的软件,需要在一个“图形控件平台”上去开发,可不是你这种做法。最起码地,你要了解 WPF 的容器、画布、变换、各种图形控件。 可能你研究了5年以后,在csdn上终于发发表了几篇“玩一玩儿GDI+绘图”的帖子,但是与一个软件公司要做一个上图系统,差得还是4年光景吧?别人用4个月做出来的上图软件,你用5年也不一定做出人家的三分之一,这都是源于工具选择的太低级了啊。别纠结于 winform 了,它没有你最需要的工具,你只能找到一些绘图皮毛。 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来实现放大。就核心的几十条语句全部实现平移缩放,而图形的原始坐标不需要做任何改变。唯一要做的就是在不同的坐标系中按照原始坐标重绘而已。呵呵,求人不如求己啊 VS2005或者VS2008的C#程序能不能降到Vs2003上去运行? 求代码,有关C#winform树控件的 一个lambda expression的问题 exp1 = a => a.Where( i => i > 0); 大家一起讨论增值业务 web service建立在我的计算机上,在地球另一端的计算机可以访问吗? 关于控件的问题 c#数据库操作问题 请问怎么把源码编译成dll? C# 网络编程疑问,求高手帮忙... 帮帮忙,看看这段代码哪里出错了,解决问题马上结帖,分不够再加 c# 操作outlock 数据库底层报错如何解决
输出的最小值是OMin,最大值OMax
想要通过任意一组输入IX和IY求得输出OX和OY比例公式就是
OX=(IX-Imin)(OMax-Omin)/(IMax-IMin)+Omin
想计算OY,公式是一样的,不过需要把Imin,Imax这些东西替换成Y轴的最大值最小值罢了公式是根据等比例来推导的,原始公式如下,自己理解:
(OX-Omin)/(Omax-Omin)=(IX-Imin)/(Imax-Imin)
1. 在 .NET 里面,GDI+ 的坐标系就是左上角(0,0),这是无法改变的,你可以 offset,你可以 rotate、flip,但都是基于 (0,0) 的,没法改变其基本坐标系的原点,设置成左下角,相应的其他也会改变,不是你理想的坐标系。理想的坐标系相对于你的 WinForm 坐标系,你可以自己做一下转换,比如原来的 (10, 5),你是从底部发起,那么转换成 GDI+ 的坐标系就是 (10, form.ClientSize.Height - 5)。
2. 你传入的任何坐标都是基于 top-left-corner 的。你可以传入原始坐标,在自定义的 DrawLine 方法里面,自己内部进行转换。
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)这样的点坐标,我该如何写代码用矩阵建立坐标系呢?内部怎么转换?才能在屏幕的中心画出这个点
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);
}
G.TranslateTransform(0, Me.Height) '将0,0原点设置为左下角,但坐标系仍然是向右变大,向上变小.
End Using
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)。
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, Y) 放大两倍,不就是 (2X, 2Y) 吗?
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来实现放大。就核心的几十条语句全部实现平移缩放,而图形的原始坐标不需要做任何改变。唯一要做的就是在不同的坐标系中按照原始坐标重绘而已。呵呵,求人不如求己啊