今天写了一个求点集合的凸包的一个算法,虽然结果求解出来了,但是想将过程用GDI+绘制出来,就需要将点绘制出来,然而c#GDI+中绘图的坐标与我们常用数学中笛卡尔坐标系是不一样的,所以就要转换GDI+中的坐标,通过以下的代码的就能够实现坐标系的转换,代码如下所示:
//将GDI+中原始的坐标原点平移 g.TranslateTransform(0f, this.Height); //变换x,y轴的正方向 g.ScaleTransform(1f, -1f);
ps:c#gdi+的坐标以区域的左上角为原点,往下为Y正方向,往右为X正方向。
ok,这样就搞定了。
注意:
虽然这样能够将GDI+的坐标变为笛卡尔坐标系,但是Y轴的坐标刻度有点差别。我也不知道为什么。我用50,50为原点,100,100绘制一个矩形。但绘制出来后矩形的左下角距画布左边的距离和下边的距离不一样长,有点小偏差,其他的还好。我猜想可能是在上述代码将坐标原点平移的时候有点小问题,this.Height和GDI+的坐标的单位不一样吧。GDI+中的坐标是用默认用像素为单位,可能控件的高度和宽度所用的单位是用比像素更小的单位吧。所以在g.TranslateTransform(0f,this.Height)中并未实现将坐标移到左下角去,因为单位的不统一造成的。
但是我现在也不知道控件大小的单位是什么,也不知道他们之间如何转换,也没找到相关的资料,希望哪位高手知道能够告知。自己也会进一步的研究,若有结果,会及时分享的。