30# broly
没想到这个com还可以进行数学的线性变换。我们用的是
仿射变换---颠覆你的视觉NB。
仿射变换的尾巴代表平移。
给一个简单的线性变换--放大2倍的例子吧。对了线性变换是用矩阵表示的。像这样
[attach]3684[/attach]
[attach]3685[/attach]
---说明:这2张图片是用mathtype做的
上述变换在数学上表达的意思是伸张2倍,并平移到坐标为(1,2)的地方。
shotgraph要进行仿射变换,必须用到俩句话:
obj.setgraphicsmode "GM_ADVANCED" 它的常数除了true,false外,其它的常数请大写,这是不爽的地方。
obj.settransformation a11,a12,a21,a22,h,k
a11,a12,a21,a22,h,k这是正交变换的矩阵元素。
旋转 就取这样的矩阵:cos(t),sin(t),-sin(t),cos(t) ,h,k
调整负号的位置,可以把反射加进去。
t为旋转角度,正的代表逆时针,负的代表顺时针旋转。h,k代表平移坐标。
反射,就这样去矩阵:-1,0,0,1,0,0 关于x轴反射
1,0,0,-1,0,0关于y轴反射
-1,0,0-1,0,0关于0,0对称
用这个方法翻转字体,比直接用obj.createfont "",0,32,t,true,0,0,0 翻转字体来的快
因为上面这个方法要翻转字体 t=90*20,
原因是 t=90*40字体才旋转一周。也就是说这里的参数1代表的是0.1度。3600shotgraph=360degree
放大2陪就这样取矩阵:2,0,0,2,0,0
2,0,0,2,1,2放大2倍并平移到坐标为1,2的地方。
平移就这样取矩阵 0,0,0,0,12,35 平移到坐标为12,35的地方。
例子如下:我以截屏为例子。- set obj=createobject("shotgraph.image") '连接到com
- obj.createimage 320,240,8,创建图片,可以有8种颜色,这也是免费版的最大色数(不是素!)了
-
- obj.setcolor 0,0,255,0 '定义绿色,编号为0,编号可以任意指定。
- obj.fillrect 0,0,319,239 ’填充一个rectangle,其实就是创建画布。
-
- OBJ.setgraphicSmode "GM_ADVANCED" '进入变换模式。这是要进行变换的必要条件,后面的参数是高级的意思,不可以去掉!
- OBJ.setTransformation 2,0,0,2,10,10 '进行相似变换
- obj.capturescreen 0,0,320,240,450,50 '在屏幕上从坐标(10,10)的地方开始抓一个rectangle屏幕进入内存,然后在一个矩形区域
- '显示图片。前4个数字代表矩形区域
复制代码 为了简化计算,在变换时把图片框取方是一个好的技巧。
--------------------------------一个复杂的例子 椭圆的包络线
看了图片你会惊奇它的美,和功能的强大 - set obj=CreateObject("shotgraph.image")
-
- size=220
- obj.CreateImage size,size,2
- obj.SetColor 0,255,255,255
- obj.SetColor 1,0,0,0
- obj.SetBgColor 0
- obj.FillRect 0,0,size-1,size-1
-
- obj.SetDrawColor 1
- obj.CreateBrush "BS_NULL",0,""
- obj.SetGraphicsMode "GM_ADVANCED"
- for i=0 to 179 step 10
- ang=i*3.141/180.0
- 'Rotate the drawing
- obj.SetTransformation Cos(ang),Sin(ang),-Sin(ang),Cos(ang),size/2,size/2
- obj.Ellipse -size/2,-size/4,size/2-2,size/4-2
- next
-
- img=obj.GifImage(-1,1,"test.gif")
复制代码 这是它的创建的图片[attach]3682[/attach]
说真的这样的图片,你就是用专业的数学软件,如几何画板,顶级数学软件maple13,也不那么容易画。
椭圆包络线的编程思路是:让椭圆的长轴的端点在大小不同的2个圆上运动就可以了。
当然,它还具有色彩的渐变,剪辑,遮罩,不过有的要付费,就是不付费个人认为用处不大。
想要那种绚丽的艺术效果,那就用FLASH,PS,AI好了。我认为该com的功能是创建几何图形为主。
艺术效果是次要的。
下面这些方格是我用shotgraph的剪辑版(虚拟的,其实就是在内存里面新开辟一个缓冲区,别和系统的剪辑版搞混)画的
[attach]3683[/attach]
------------------------------------------------------------------------------
闪烁的光栅hatche-
- set s=createobject("wscript.shell")
- set obj=CreateObject("shotgraph.image")
-
- xsize=320
- ysize=240
- obj.CreateImage xsize,ysize,8
-
- obj.SetColor 0,0,50,0
- obj.SetColor 1,&HFF,0,0
- obj.setcolor 2,0,&HFF,0
- obj.setcolor 3,0,&HFF,&HFF
- obj.setcolor 4,&HFF,0,&HFF
- obj.setcolor 5,&HFF,&HFF,0
- obj.setcolor 6,0,0,&HFF
- obj.setcolor 7,0,0,0
-
- obj.SetBgColor 0
- obj.FillRect 0,0,xsize,ysize
-
- obj.createfont "",0,32,0,1,0,1,0
- obj.settextcolor 2
- obj.textout 30,5,"myzam"
-
- for i=0 to 10
- for r=0 to 100 step 10
- obj.createpen "PS_SOLID",4,(r MOD 6)+1
- obj.setbkmode "TRANSPARENT"
- OBJ.CREATEBRUSH "BS_HATCHED",(r MOD 6)+2,"HS_CROSS"
- obj.ellipse 160-r,120-r,160+r,120+r
-
- obj.trackadd -1,0,0,0,0,xsize,ysize,30
- next
- next
- obj.trackplay "test.gif"
-
- s.run "f:\test.gif"
-
复制代码
=====================================
这个com可以处理的数学类型有下面这些:
画折线
画多边形
画弧
画弓形
画椭圆饼(数学上叫椭圆扇形,一般office就饼)
画bezier曲线(非常典型,由此可以很方便的模拟出抛物线,正弦线等)
仿射变换(平移,旋转,放大,缩小,弯曲,反射)
除此之外还可以
画字符画(对汉字的处理只能处理几个字)
做动画。
另外还可以创建图片剪辑版(虚拟的),然后可以把图片缓存到clipboard,然后在处理。
这里的剪辑板其实是内存的一个区域,不是系统带的那个clipbrd !
obj.initclipboard 10,10
obj.selectclipboard true
obj.copy 0,0,40,50,10,10 "SRCCOPY"
其它功能:
读取图片(readimage就是要收费,遗憾)
把图片作为数据流处理
可以直接与office对话,从而处理office的图片。但还不如直接用vba。
非注册版本的功能已经够可以的了。
如果有注册版本当然好了。但是我没找到。遗憾。
我的实例
eg.1描点法画抛物线,较慢,gif文件大小为130kb- set s=createobject("wscript.shell")
- set obj=CreateObject("shotgraph.image")
-
- size=240
- obj.CreateImage size,size,8
- obj.SetColor 0,0,255,0
- obj.SetColor 1,0,0,255
- obj.setcolor 2,255,0,0
- obj.setcolor 3,0,0,0
- obj.SetBgColor 0
- obj.FillRect 0,0,size-1,size-1
-
- obj.createpen "PS_SOLID",3,2
- obj.line 0,size-4,size,size-4
- obj.line 120,0,120,size
-
- obj.createfont "ARIAL",0,24,0,true,0,0,0
- obj.settextcolor 3
- obj.setbkmode "TRANSPARENT"
- obj.gettextdimensions "x-axies",u,v
-
- obj.textout size-u-2,size-v-2,"x-axies"
- obj.textout 120,0,"y-axies"
- for i=0 to size step 2
-
- obj.trackadd true,0,0,0,0,size,size,30
- obj.createpen "PS_SOLID",4,1
- obj.line i,size-0.1*(i-120)^2-5,i,size-0.1*(i-120)^2-5
- next
-
- obj.trackplay "test.gif"
-
- s.run "test.gif"
复制代码
这是动态的显示描点
[attach]3686[/attach]
这是描点法得到的动画图片,刷新网页可以看到。和下面用变换做的是同样一条抛物线
的图像,用变换法生成的图像动画比这个快的多。
如果不想动态的显示描点,只想显示结果,那么把帧语句obj.trackadd true,0,0,0,0,size,size,30移动动for循环的外面,next的后面就行了。
eg.2 利用平移和反射作抛物线的图像,描点法- set s=createobject("wscript.shell")
- set obj=CreateObject("shotgraph.image")
-
- size=240
- obj.CreateImage size,size,8
- obj.SetColor 0,0,255,0
- obj.SetColor 1,0,0,255
- obj.setcolor 2,255,0,0
- obj.setcolor 3,0,0,0
- obj.SetBgColor 0
- obj.FillRect 0,0,size-1,size-1
-
- obj.createpen "PS_SOLID",3,2
- obj.line 0,size-4,size,size-4
- obj.line 120,0,120,size
-
- obj.createfont "ARIAL",0,24,0,true,0,0,0
- obj.settextcolor 3
- obj.setbkmode "TRANSPARENT"
- obj.gettextdimensions "x-axies",u,v
-
- obj.textout size-u-2,size-v-2,"x-axies"
- obj.textout 120,0,"y-axies"
-
- for i=0 to size-1 step 1
- obj.setgraphicsmode "GM_ADVANCED"
- obj.settransformation 1,0,0,1,i+120,0.2*i^2
- obj.createpen "PS_SOLID",4,1
- obj.line i,0,i,0
- obj.settransformation -1,0,0,1,size-i-120,0.2*i^2
- obj.line i,0,i,0
- next
-
- obj.gifimage -1,0,"test.gif"
-
- s.run "test.gif"
复制代码 其实关键的语句没这么多,就是for。。。next那几句,其它的是废话。就是为了好看一点吧了。
下面是利用平移变换作的图,刷新网页,看以看到动画
例子:利用bezier贝塞尔方法创建曲线轨迹- set s=createobject("wscript.shell")
- set obj=CreateObject("shotgraph.image")
-
- size=240
- obj.CreateImage size,size,8
- obj.SetColor 0,0,255,0
- obj.SetColor 1,0,0,255
- obj.setcolor 2,255,0,0
- obj.setcolor 3,0,0,0
- obj.SetBgColor 0
- obj.FillRect 0,0,size-1,size-1
-
- obj.createpen "PS_SOLID",3,2
- obj.line 0,size-4,size,size-4
- obj.line 120,0,120,size
-
- obj.createfont "ARIAL",0,24,0,true,0,0,0
- obj.settextcolor 3
- obj.setbkmode "TRANSPARENT"
- obj.gettextdimensions "x-axies",u,v
-
- obj.textout size-u-2,size-v-2,"x-axies"
- obj.textout 120,0,"y-axies"
-
- for i=2 to 51 step 5
- obj.createpen "PS_SOLID",1,1
- obj.polybezier array(0,0,i+118,0.1*i^2,i+122,0.1*(i+2)^2,240,0)
- obj.trackadd true,0,0,0,0,size,size,30
- next
-
- obj.trackplay "test.gif"
-
- s.run "test.gif"
复制代码 生成的动画图片如下,刷新网页可以看到动画。
[attach]3687[/attach]
利用bezier方法创建的曲线系文件很小。这是因为它采用的是多项式插值推算出来的,不是一点一点的描出来的。
所以数学函数的模拟尽量采用插值发,以减小文件的大小。这个图片才16kb。如果是描点的话,
大概要达到200kb的样子,差别是非常大的。
例子:直方图- set s=createobject("wscript.shell")
- Set g=CreateObject("shotgraph.image")
-
- x=320
- y=240
- g.createimage x,y,8
- g.setcolor 0,100,0,255
- g.setcolor 1,255,0,0
- g.setcolor 2,0,255,0
-
- g.setbgcolor 0
- g.fillrect 0,0,x-1,y-1
-
- for i=0 to 11
-
- g.setbgcolor (i mod 2)+1
- if y-i*50>=0 then
- g.fillrect i*30,y-i*50,i*30+30,y
- else
- g.fillrect i*30,i*50-y,i*30+30,y
- end if
-
- next
-
- g.gifimage true,0,"test.gif"
-
- s.run "test.gif"
复制代码 ===============[attach]3690[/attach]
例子:微积分中的曲边梯形动画- set s=createobject("wscript.shell")
- set obj=CreateObject("shotgraph.image")
-
- xsize=320
- ysize=240
- obj.CreateImage xsize,ysize,8
-
- obj.SetColor 0,0,255,0
- obj.SetColor 1,0,0,255
- obj.setcolor 2,255,0,0
-
- obj.SetBgColor 0
- obj.FillRect 0,0,xsize,ysize
-
- sub my()
- n=inputbox("Please number:")
- h=xsize/n
- for i=0 to n-1
- xi=0+i*h
- yi=0.005*(xi+h/2)^2
- if ysize-yi >=0 then
- obj.setbgcolor (i mod 3)+1
- obj.fillrect xi,ysize,xi+h,ysize-yi
- obj.trackadd -1,0,0,0,0,xsize,ysize,30
- else
- exit for
- end if
- next
- end sub
-
- call my()
-
- obj.trackplay "test.gif"
- s.run "test.gif"
-
复制代码 刷新网页,可以看到动画:y=x*x*0.0056的曲边梯形
[attach]3691[/attach]
-----------------------------------------------------
例子:抛物线的曲边梯形2--y=0.005*x^2- ''''####Editer:myzay 2011-4-5#########
- set s=createobject("wscript.shell")
- set obj=CreateObject("shotgraph.image")
-
- xsize=320
- ysize=240
- obj.CreateImage xsize,ysize,8
-
- obj.SetColor 0,0,255,0
- obj.SetColor 1,0,0,255
- obj.setcolor 2,255,0,0
- obj.setcolor 3,200,10,125
- obj.setcolor 4,125,200,50
-
- obj.SetBgColor 0
- obj.FillRect 0,0,xsize,ysize
-
- call my()
-
- function my()
- for n=10 to 50
-
- h=xsize/n
-
-
- obj.gettextdimensions "100Number Of Iterate",x1,y1
- obj.createfont "Arail",0,32,1800,true,true,true,true
- obj.setbKmode "TRANSPARENT"
- obj.settextcolor (n mod 2)+3
- obj.textout x1+10,y1+20,"Number Of Iterate:"&n-9
-
- for i=0 to n-1
-
-
- xi=0+i*h
- yi=0.005*(xi+h/2)^2
- if ysize-yi >=0 then
- obj.setbgcolor (i mod 3)+1
- obj.fillrect xi,ysize,xi+h,ysize-yi
- obj.trackadd -1,0,0,0,0,xsize,ysize,20
-
- else
- exit for
- end if
- next
- obj.SetBgColor 0
- obj.FillRect 0,0,xsize,ysize
- next
- end function
-
- obj.trackplay "test.gif"
- s.run "f:\test.gif"
-
复制代码 动画文件为1.25mb,请稍等。要重复播放,请刷新网页。
----------------------------------------------------
函数图像画法有3法:
法1:老老实实的描点
法2:平移变换法
法3:贝塞尔方法。这种方法是曲线的近似画法,数学上叫曲线的拟合。
法4:折线法obj.polyline,采用极限的思想,把区间细分一下,如分为30段,就可以达到很好的效果,而且文件还小。
给个例子:- set s=createobject("wscript.shell")
- set obj=CreateObject("shotgraph.image")
-
- xsize=320
- ysize=240
- obj.CreateImage xsize,ysize,8
-
- obj.SetColor 0,0,255,0
- obj.SetColor 1,0,0,255
- obj.setcolor 2,255,0,0
- obj.setcolor 3,200,10,125
- obj.setcolor 4,125,200,50
-
- obj.SetBgColor 0
- obj.FillRect 0,0,xsize,ysize
-
- arr=array( _
- 100,100,110,50,120,100,130,50,140,100,_
- 150,50,160,100,170,50,180,100,200,50,220)
- obj.setdrawcolor 2
- obj.polyline "",arr
- obj.line 0,160,230,160
- obj.line 100,10,100,300
-
- obj.gifimage -1,0,"test.gif"
- s.run "f:\test.gif"
-
复制代码 [attach]3692[/attach]
利用帧来创建图片就可以了。如果要想文件小点,快点,就获取图片的最后结果,只用一帧就可以了。,如果
喜欢慢慢的欣赏画图的过程,那就要用多帧。
如果你希望图片上的点不离散,那就取小数步长,这时动画是很慢的哦。
玩家可能觉得奇怪,既然画图是这么的重要,为啥vbs不自带一个功能强大一点的方法?
原因是这样的:vbs被微软设计成了一个类似于仪表盘的东西。
仪表盘上的每一个按钮就是vbs的基本语句和基本方法,基本属性。
vbs脚本所要做的就是让我们去按动按钮,然后调用com,通过com(控件)去完成各种复杂的事情。
vbs没有画图的方法,这是由微软打造vbs的主导思想决定的。并不是微软办不到。
由此看来这个组件叫shotgraph是很妙的叫法了。shot---射击,graph---图表。合起来就是射击图表。
就是说你的vbs脚本就像一把枪的扳机,com就是你的子弹,你扣动扳机,就是调用com。这一枪出去,你就射出了一幅图像。
这就是为什么叫shot graph射图的原因,你说取的妙不妙?!vbs脚本是扳机,com是你的子弹,没有com的vbs就如没有子弹的枪。
我查看了一下API函数列表,估计shotgraph就是调用的API函数。比如api函数中有textout,这里也有。
遗憾的是我对API函数只认识A---P--I,除此之外是一篇空白,将来也不想去学。太累。
该组件就一个文件在windows\system32\shotgraph.dll
我打开文件看了,是C++ 编写的。它就是注册了一com。在里面可以看到它在注册表中的键位。
-------------------------------------------------------------
结束语:
如果你想有效的使用shotgraph的各种方法,请创建画布吧---obj.fillrect 0,0,size1,size2
如果你觉得图片小了,那就保存为test.swf吧。
该com的要点是--矩形是基础,对角线是关键。
我看重这个com,因为它的创建图片的功能不比专业的数学软件差。
几何画板作图的功能够强大了吧,世界级的顶级数学软件Maple13画图的功能也足够强大了吧.
它们都是有几十兆到几百兆的大小。
而shotgraph就几十kb,居然达到了这样的颠覆你视觉的效果,说句真话,那些顶级的数学软件应该汗颜!
说道这里让我想起了微软的公式编辑器,大家都以为那是微软的专利,其实大错特错!
那是微软花了money买的Design Science公司的产品Mathtype的简化版。如果你装上原版的Mathtype那
功能,没讲的。它让你直接可以使用LETEX语言输入科技符号。
所以,我在想说不定哪天微软再花money把shotgraph买了,这不是没有可能,
如果这样的事情发生了,那是玩家们的福音。呵呵。有点dream哈。
编程对我来说就是玩,对我并没什么大的用处。我想对大多数人也是这样。
因此,我祝各位玩家玩的愉快。
由于时间的关系,水平的限制,错误是难免的,欢迎各位玩家指出,我会及时改正的。
忘记最重要的一点了。由于这个版本是非注册版本,gif的大小是320x240,jpeg的大小为200x200.
其实这不是问题,因为flash软件给我们提供了转变方法:你只要把文件导入flash的舞台,让后让flash的画布与
gif文件一样大,接着导出来就是了,在导出文件时flash会提示你选择什么文件,你选择比如gif动画,点确定,
flash又提示你文件的大小设置,这时你输入800x600,就可以改变gif动画的大小了。相信flash效果很好。
我在使用中发现,下面的方法可以 突破非注册版尺寸的限制---------借助于flash播放器---------
set oshell=createobject("wscript.shell")
oshell.run "saflashplayer test.gif" |