现在有一个文本,里面每一行都记录着X、Y坐标。需要通过DrawLine两点一线画出图形,还需要能达到放大,缩小,拖动的效果。
放大的话需要重绘吧?可能需要将点与点之间长度X2或者更多。
缩小的话大概也是这样吧?点与点之间长度/2或者更多。
拖动是在放大后,对于看不见的区域可以拖动,以便看到。这问题考虑了很久,不知道有没有什么好的办法或者现成的代码?
放大的话需要重绘吧?可能需要将点与点之间长度X2或者更多。
缩小的话大概也是这样吧?点与点之间长度/2或者更多。
拖动是在放大后,对于看不见的区域可以拖动,以便看到。这问题考虑了很久,不知道有没有什么好的办法或者现成的代码?
因为现在知道X、Y坐标,所以放大的话只需要重绘,比如现在X=5、Y=5是起点,终点是X=10、Y=10,现在放大那重绘就是X=5、Y=5是起点,终点是X=20、Y=20
两点一线不是表格型的,是各种无规则的图形,其实就是工控的标准G代码
3L说错了,应该是比如现在X=5、Y=5是起点,终点是X=10、Y=10,现在放大那重绘就是X=10、Y=10是起点,终点是X=20、Y=20
\
\ 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点同理
对于拖动是可以考虑移动位图的位置,但问题是如何移动?我现在是
Bitmap bm=new Bitmap(500, 600);
Graphics bmgdi = Graphics.FromImage(bm);
然后直接
picturebox.image=bm;
这样的话如何移动!?
这样也不会失真,处理也简单。
C# EMF 格式
看看MSDN中关于EMF和WMF图片的帮助
主要还是GID+,不会太难的
但为什么最后保存的矢量图会有一个空白的边距?解决后就结贴了!
如果想控制输出的图片的大小(指的是画图区域的大小,不是文件本身多少字节的大小),应该修改程序中的这句话:
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就是图片区域大小,分别代表长,高。
picturebox.Image = new Bitmap("c:\\1.wmf");
然后调整PICTUREBOX的Height和Width,结果加载进来的图并不像矢量那样放大缩小?变马赛克了……
另外不能使用 new Bitmap( ); 来加载,要不然会失真 if ( Export( "d:\\test.emf" ) )
{
pictureBox1.Image = Image.FromFile( "d:\\test.emf" );
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
}
50分归你了~
我再加50分,希望能解决一下有空白边距的问题。还有就是调整PICTUREBOX的大小会使它覆盖其他控件,如何将它放在容器内不覆盖出去?
分大家分分,嘿嘿,顶者有份