现在有一个文本,里面每一行都记录着X、Y坐标。需要通过DrawLine两点一线画出图形,还需要能达到放大,缩小,拖动的效果。
放大的话需要重绘吧?可能需要将点与点之间长度X2或者更多。
缩小的话大概也是这样吧?点与点之间长度/2或者更多。
拖动是在放大后,对于看不见的区域可以拖动,以便看到。这问题考虑了很久,不知道有没有什么好的办法或者现成的代码?

解决方案 »

  1.   

    是的,肯定不能失真的。
    因为现在知道X、Y坐标,所以放大的话只需要重绘,比如现在X=5、Y=5是起点,终点是X=10、Y=10,现在放大那重绘就是X=5、Y=5是起点,终点是X=20、Y=20
      

  2.   

    推荐用免费,开源的第三方控件: NPlot
      

  3.   

    资料好象比较少?英语完全不行T T
    两点一线不是表格型的,是各种无规则的图形,其实就是工控的标准G代码
      

  4.   

    再顶一下。
    3L说错了,应该是比如现在X=5、Y=5是起点,终点是X=10、Y=10,现在放大那重绘就是X=10、Y=10是起点,终点是X=20、Y=20
      

  5.   

    如果说是自己画,可以把这些点存放在一个数组里。至于缩放,拖动,可以用Transformation来解决,但不管怎么说,都还要一个偏移量(用Point来存放)和一个放大量(Double即可)。重载OnPaint方法,对于每一个点都先乘以放大量,然后加上偏移量,再画到Graphics里。对于拖动,就是用MouseMove修改偏移量。对于放大缩小,就是修改放大量。至于减少屏幕闪烁,有很多方法,不妨可以使用double buffer;也可以在消背景时,用背景色画线来取消掉。
      

  6.   

    你这样画的话要吃多少内存啊- =?放大一下就要画一个现在的大小X2的图。现在为了简单一点我是画到BITMAP上面,画完后在PICTUREBOX.image=BITMAP的。
      

  7.   

          (x1,y1)
          \ 
           \ l
        ___a\O (x0,y0)
         m由原点和一点得到直线两点式公式,和l长度(|y1-y0|)和m(|x1-x0))
    cos(a)=m/l, 
    由反三角函数arccos得到a角y-y1   x-x1
    ---- = ----
    y2-y1  x2-x1    A (x2,y2)
      |\ 
      | \   L 
      |  \ (x1,y1)  
    P |  |\ 
      |  | \ l 
      |__|_a\O (x0,y0)
      N   m  \
        M     \
               \
                 B放大1倍等于2边各放大0.5倍
    L=OA=l*0.5
    cos(a)=M/l -> M=cos(a)*l
    M^2+P^2=L^2 -> P=NA=sqrt(L^2-M^2)得到(M,P)通过斜率:K=(P-y0)/(M-x0) 或判断角的大小得之角在哪个像界
    修正符号
    最后 A=(-M,P)
    B点同理
      

  8.   

    http://topic.csdn.net/u/20090925/10/1FC69A43-8F6E-41C6-9E78-3CE8F1DB4134.html
      

  9.   

    如果每次都调用文件读点的话,而且坐标点的数量比较多的话,有可能会慢把所有点都调入内存,刷屏前先把点和线都画在一个内存位图上,要是拖动,只需要把位图按新位置显示一下就好了。对于放大缩小,就要先重建位图了。对于缩小,其实不用做任何处理,只要把内存位图直接缩小显示就行了。当然,在空闲的时候,可以用一个后台线程将内存位图重建一下,减少因为缩小产生的失真。后台把位图重建完,再刷一次屏更新。对于放大,虽然也可以采用上述方法,但是这样在新位图产生前显示出来的效果会有马赛克。为了保证form速度,可以把重点放在可见的点和线上。仍旧使用内存位图,仍旧使用后台线程重建,在重建时,可以针对接下来要显示的区域先构建,一旦完成,先交给Form来显示,然后再把一时看不到的区域里的点和线画在内存位图上。
      

  10.   

    肯定不能有马赛克,这个我已经说的很清楚了,所以需要重新读一次坐标信息,然后X2绘制,这些我都写好了。但问题是现在如果需要绘制的比较多,那么会很慢!因为放大缩小拖动都需要重新绘制的!
    对于拖动是可以考虑移动位图的位置,但问题是如何移动?我现在是
    Bitmap bm=new Bitmap(500, 600);
    Graphics bmgdi = Graphics.FromImage(bm);
    然后直接
    picturebox.image=bm;
    这样的话如何移动!?
      

  11.   

    你这不是都是线条吗,既然是线条,就可以做成矢量图,使用WMF格式或者EMF格式的,第一次画好后,然后直接针对pictureBox进行缩放和移动
    这样也不会失真,处理也简单。
      

  12.   

    我也想啊,可是在GOOGLE搜“C# 矢量图”却没找到什么好的办法,不然早就是矢量图了!能告知一二吗?
      

  13.   

    http://hi.baidu.com/gissky_horse/blog/item/5a5c3b8e8ddcf0e6f11f3670.html自己搜一下
    C# EMF 格式
    看看MSDN中关于EMF和WMF图片的帮助
    主要还是GID+,不会太难的
      

  14.   

    感谢,在http://www.cnblogs.com/infinity/archive/2006/08/10/473250.html看到了些资料很有帮助!
    但为什么最后保存的矢量图会有一个空白的边距?解决后就结贴了!
      

  15.   

    摘自http://hi.baidu.com/gissky_horse/blog/item/5a5c3b8e8ddcf0e6f11f3670.htmlBitmap bmp = new Bitmap(220,220);这句话其实是没用的,比如画的是EMF格式的图片,它会根据图片的实际大小自动调整画出来的图片的大小,也就是说上面设的220,220是根本不起作用的。
    如果想控制输出的图片的大小(指的是画图区域的大小,不是文件本身多少字节的大小),应该修改程序中的这句话:
    Metafile mf = new Metafile(filePath,gs.GetHdc());改为:
    Rectangle rect = new Rectangle(0,0,70,80);
    Metafile mf = new Metafile(filePath,gs.GetHdc(),rect,MetafileFrameUnit.Pixel);
    以上两句代码中的70,80就是图片区域大小,分别代表长,高。
      

  16.   

    这个不清楚了,呵呵,可能要了解一下WMF格式的标准什么的了
      

  17.   

    现在发现个问题。
    picturebox.Image = new Bitmap("c:\\1.wmf");
    然后调整PICTUREBOX的Height和Width,结果加载进来的图并不像矢量那样放大缩小?变马赛克了……
      

  18.   

    未出现该情况,有一点要注意,要调整图片的缩放模式
    另外不能使用 new Bitmap( ); 来加载,要不然会失真            if ( Export( "d:\\test.emf" ) )
                {
                    pictureBox1.Image = Image.FromFile( "d:\\test.emf" );
                    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                }
      

  19.   

    好了没问题了,我是picture.Image = new Metafile("c:\\1.wmf");这样加载的!
    50分归你了~
    我再加50分,希望能解决一下有空白边距的问题。还有就是调整PICTUREBOX的大小会使它覆盖其他控件,如何将它放在容器内不覆盖出去?
      

  20.   

    放到一个Panel里面,让Panel的AutoScroll为true,
    分大家分分,嘿嘿,顶者有份