GDI+学习笔记
GDI+不支持异或绘图,而使用双缓存方式,避免了图形闪烁,但是速度稍慢,占用内存较多。随着硬件发展,这是一个图形编辑器的趋势;
用 GDI+ 开发矢量图形编辑系统的经验之谈
性能篇
“经过无数次的实验,终于形成了自己的代码风格”:声明两个Bitmap对象,一个用于即时的图形绘制,另一个用于存放已有的图形。在用鼠标绘图的过程中,直接把Bitmap复制到绘图窗口所对应的Graphics上,以提升绘图的速度;
避免用三角函数、平方根、除法;
避免大量使用Structure;
不同的图元有不同的图像拾取算法,一般常用的矢量计算方法可以保证较高的算法效率;
项目的对象建模
要考虑几个方面:确定图元、图元参数的保存和处理、坐标系、图像时拾取。
操作图元参数时,直接把像素值保存在图元参数中比较方便。因为Single类型的“数据还原性”很差,而图形经过旋转、缩放、坐标系变换后,必须用double类型处理,所以可以考虑把所有图元参数全部用double类型处理,损失一些性能但换来了易用性。
http://www.cnblogs.com/bluntsword/archive/2005/08/10/211363.html也提到了GDI+采用float类型带来的精度问题。另外此文提出要解决精度的问题,需要避免使用坐标变换。整个绘制过程中保持
“世界坐标系”和设备坐标系统一,然后自己记录实际坐标与设备坐标的缩放和偏移,然后在绘制时将实际坐标转换为设备坐标。
“自己进行坐标转换也不难,简单的仿射变换”
READ:《GDI+的雷区 》
http://blog.csdn.net/Nightmare/archive/2005/04/22/359092.aspx
GDI+变换之后的坐标被限制在以下范围
x -4194304.0f
y -4194304.0f
width 8388608.0f
height 8388608.0f
如果超出范围,图形画不出,
INST:了解GDI+ 2.0所作的改进
INST:了解“放射变换”作坐标变换
---------------------------------------------
目前的需求是要在Windows窗体上呈现一些图形元件,类似MS Visio,可以从工具箱中拖动图形元件到画板上。现在有两种备选方式:
方式一:绘制闭合的线条,然后填充;
方式二:准备好图片,然后绘制图片。
使用方式一,连接线条的各个点的位置需要使用绘图工具辅助确定,然后以渐变色填充。问题是如果要添加新的图形元件,必须要修改程序,除非引入反射和配置机制,实现运行时载入扩充的绘制新图形元件的类型;
使用方式二,好处是扩充的成本要低一些,但是为了要高亮选中的图形元件,需要另外准备一套图片,作实时替换,而替换需要多个操作,如重新绑定业务对象、重新填充文字。
因为项目规模较小、需要的图形元件只有确定的数量,所以考虑方式一实现。