一种在交互式电子白板软件中实现图形透视的方法与流程

文档序号:13744864阅读:346来源:国知局

本发明涉及交互式电子版本软件的绘图操作领域,尤其涉及一种在交互式电子白板软件中实现图形透视的方法。



背景技术:

近年来交互式电子白板软件在教学中得到广泛的应用;软件使用者可以利用软件提供的功能绘制图形对象,在实际的教学使用过程中,使用者又往往需要一种工具可以透过层叠图层按照设定的穿透层次查看被叠在下面的图形信息。



技术实现要素:

本发明要解决的技术问题,在于提供一种在交互式电子白板软件中实现图形透视的方法。

本发明是这样实现的:

一种在交互式电子白板软件中实现图形透视的方法,包括如下步骤:

步骤10、定义透视工具的功能;

步骤20、创建一个窗口作为透视工具窗口,充当所述透视工具的操作体,并实现所述透视工具的形状以及使用所述透视工具进行拉伸操作;

步骤30、将画布中通过所述透视工具进行透视的图形定义为透视图形,根据画布中所述透视工具窗口及各个透视图形的顶点坐标分别绘制出所述透视工具窗口及各个所述透视图形的形状,并计算出画布中按图层顺序显示的各个所述透视图形与所述透视工具窗口有交集的图形对象;

步骤40、根据设定的透视层数计算出要显示及隐藏的图形对象,若透视层数为k,则将所述透视图形的图层值小于及等于k的图形对象进行隐藏,并将所述透视图形的图层值大于k的图形对象进行显示;

步骤50、将需要显示的图形对象按图层顺序在所述透视工具窗口绘制出来,并将需要隐藏的图形对象不在所述透视工具窗口绘制出来;

步骤60、根据设定的透明度值,用带有透明度的维度A填充所述透视工具窗口。

进一步地,所述步骤10中透视工具的功能具体为:

所述透视工具的形状为几何图形;

所述透视工具用于设置透视层数,根据该透视层数确定透视图形显示或隐藏的方式;

所述透视工具用于设置透明度值,并按设置好的透明度值显示透视效果;

在所述透视工具的形状边缘上进行拉伸来改变所述透视工具的大小。

进一步地,所述步骤20具体包括如下步骤:

步骤201、创建一个窗口作为透视工具窗口,并使用系统API函数SetWindowLong及SetLayeredWindowAttributes设置该透视工具窗口的风格;

步骤202、选定所述透视工具窗口的形状,根据选定的图形类别,计算出所述透视工具窗口的各个顶点坐标,创建对应的透视工具窗口形状;

步骤203、判断操作点是否落在所述透视工具窗口的边缘上,如果操作点落在边缘上,则根据操作产生的dx、dy进行拉伸,即width=width+dx,height=height+dy,从而改变所述透视工具窗口的大小;如果操作点不落在边缘上且位于所述透视工具窗口内部,则将所述透视工具窗口进行整体拉伸;否则不进行拉伸操作。

进一步地,所述步骤30具体包括如下步骤:

步骤301、计算按图层顺序显示各个透视图形的顶点坐标,依次按顺序连接起来,首尾相连,形成一个个封闭的几何图形;

步骤302、根据所述透视工具窗口的形状,获取各个顶点坐标,依次按顺序连接起来,首尾相连,形成透视工具的外围几何图形;

步骤303、将步骤301所构建的每个几何图形按顺序依次与步骤302所构建的几何图形求交集,如果交集不为空,则按图层顺序依次记录其对应的图形对象;如果交集为空,则不存在有交集的图形对象。

进一步地,所述步骤60之后还包括:

步骤70、加粗所述透视工具窗口的边框。

本发明具有如下优点:本发明可以实现层叠图形之间的透射。

附图说明

下面参照附图结合实施例对本发明作进一步的说明。

图1为本发明一种在交互式电子白板软件中实现图形透视的方法执行流程图。

图2为透视工具窗口形状图。

图3为没用到透视工具的图形视觉效果图。

图4为用透视工具透视一层的图形视觉效果图。

图5为用透视工具透视二层的图形视觉效果图。

图6为用透视工具透视二层并带20%透明度的图形视觉效果图。

图7为有图形不在透视区域透视一层的图形视觉效果图。

具体实施方式

为使得本发明更明显易懂,现以一优选实施例,并配合附图作详细说明如下。

请参阅图1,本发明的一种在交互式电子白板软件中实现图形透视的方法,包括如下步骤:

步骤10、定义透视工具的功能,所述步骤10中透视工具的功能具体为:

所述透视工具的形状为几何图形;

所述透视工具用于设置透视层数,根据该透视层数确定透视图形显示或隐藏的方式;

所述透视工具用于设置透明度值,并按设置好的透明度值显示透视效果;

在所述透视工具的形状边缘上进行拉伸来改变所述透视工具的大小。

步骤20、创建一个窗口作为透视工具窗口,充当所述透视工具的操作体,并实现所述透视工具的形状以及使用所述透视工具进行拉伸操作,具体包括如下步骤:

步骤201、创建一个窗口作为透视工具窗口,并使用系统API(ApplicationProgrammingInterface,应用程序编程接口)函数SetWindowLong(用来改变指定窗口的属性)及SetLayeredWindowAttributes(用于设置分层窗口透明度)设置该透视工具窗口的风格;具体如下:

定义一个比较偏的颜色值:

FormColor=RGB(1,0,1);

令窗口的背景颜色为:

Color=FormColor;

设置窗口的风格,标题栏窗口:

FormStyle=GetWindowLong(Handle,GWL_EXSTYLE);

SetWindowLong(Handle,GWL_EXSTYLE,FormStyleorWS_EX_LAYERED);

设置窗口的透明模式,即窗口上只要是颜色是RGB(1,0,1)的位置都完全透明,其他颜色不透明;

SetLayeredWindowAttributes(Handle,FormColor,255,LWA_ALPHAorLWA_COLORKEY);

因此,窗口初始化时,整个窗口背景都被设置颜色为:RGB(1,0,1),整个窗口完全透明;

步骤202、选定所述透视工具窗口的形状,根据选定的图形类别,比如说五角星,计算出所述透视工具窗口的各个顶点坐标,创建对应的透视工具窗口形状;针对图2各个几何图形构建说明如下:

路径FillPath用于保存图形的路径区域,即透视工具窗口的“形状”,

窗口左上顶点坐标为:

FRectFLeftTop:TGPPointF;

窗口右上顶点坐标为:

FRectFRightBottom:TGPPointF;

(1)矩形的区域路径:

Point1.X=FRectFLeftTop.X;

Point1.Y=FRectFLeftTop.Y;

Point2.X=FRectFLeftTop.X;

Point2.Y=FRectFLeftTop.Y+FRectFRightBottom.Y;

Point3.X=FRectFRightBottom.X;

Point3.Y=FRectFRightBottom.Y;

Point4.X=FRectFRightBottom.X;

Point4.Y=FRectFLeftTop.Y;

则路径形状为:

FillPath.AddLine(Point1,Point2);

FillPath.AddLine(Point2,Point3);

FillPath.AddLine(Point3,Point4);

FillPath.AddLine(Point4,Point1);

(2)圆形的区域路径为:

Path.AddEllipse(RectF);

RectF两点FRectFLeftTop、FRectFRightBottom构成的矩形,如下:

RectF.X=FRectFLeftTop.X;

RectF.Y=FRectFLeftTop.Y;

RectF.Width=FRectFRightBottom.X-FRectFLeftTop.X;

RectF.Height=FRectFRightBottom.Y-FRectFLeftTop.Y;

(3)三角形区域路径:

Pts[0].X=(FRectFRightBottom.X+FRectFLeftTop.X)/2;

Pts[0].Y=FRectFLeftTop.Y;

Pts[1].X=FRectFLeftTop.X;

Pts[1].Y=FRectFRightBottom.Y;

Pts[2].X=FRectFRightBottom.X;

Pts[2].Y=FRectFRightBottom.Y;

Pts为三个顶点坐标数组

FillPath.AddLine(Pts[0],Pts[1]);

FillPath.AddLine(Pts[1],Pts[2]);

FillPath.AddLine(Pts[2],Pts[0]);

(4)菱形区域路径:

Pts[0].X=(FRectFLeftTop.X+FRectFRightBottom.X)/2;

Pts[0].Y=FRectFLeftTop.Y;

Pts[1].X=FRectFLeftTop.X;

Pts[1].Y=(FRectFLeftTop.Y+FRectFRightBottom.Y)/2;

Pts[2].X=(FRectFLeftTop.X+FRectFRightBottom.X)/2;

Pts[2].Y=FRectFRightBottom.Y;

Pts[3].X=FRectFRightBottom.X;

Pts[3].Y=(FRectFLeftTop.Y+FRectFRightBottom.Y)/2;

Pts为四个顶点坐标数组

FillPath.AddLine(Pts[0],Pts[1]);

FillPath.AddLine(Pts[1],Pts[2]);

FillPath.AddLine(Pts[2],Pts[3]);

FillPath.AddLine(Pts[3],Pts[0]);

与构造三角形的路径区域类似,可同样构造出FillPath;

(5)五边形区域路径:

Points[0].X=FRectFLeftTop.X;

Points[0].Y=FRectFLeftTop.Y;

Points[1].X=FRectFLeftTop.X;

Points[1].Y=FRectFRightBottom.Y;

Points[2].X=FRectFRightBottom.X;

Points[2].Y=FRectFRightBottom.Y;

Points[3].X=FRectFRightBottom.X;

Points[3].Y=FRectFLeftTop.Y;;

Pts[0].X=(Points[0].X+Points[3].X)*0.5;

Pts[0].Y=(Points[0].Y+Points[3].Y)*0.5;

Pts[1].X=Points[0].X+(Points[1].X-Points[0].X)*0.381966;

Pts[1].Y=Points[0].Y+(Points[1].Y-Points[0].Y)*0.381966;

Pts[2].X=Points[1].X+(Points[2].X-Points[1].X)*0.190983;

Pts[2].Y=Points[1].Y+(Points[2].Y-Points[1].Y)*0.190983;

Pts[3].X=Points[2].X-(Points[2].X-Points[1].X)*0.190983;

Pts[3].Y=Points[2].Y-(Points[2].Y-Points[1].Y)*0.190983;

Pts[4].X=Points[3].X+(Points[2].X-Points[3].X)*0.381966;

Pts[4].Y=Points[3].Y+(Points[2].Y-Points[3].Y)*0.381966;

其中,Points为外围矩形四个顶点,用于计算五边形5个顶点过程中的辅助点;Pts为五个顶点坐标数组:

FillPath.AddLine(Pts[0],Pts[1]);

FillPath.AddLine(Pts[1],Pts[2]);

FillPath.AddLine(Pts[2],Pts[3]);

FillPath.AddLine(Pts[3],Pts[4]);

FillPath.AddLine(Pts[4],Pts[0]);

公式中的比例值:0.5、0.381966、0.190983是本发明规定的比例经验值;同上,类似可造出FillPath;

(6)五角星区域路径:

Points[0].X=FRectFLeftTop.X;

Points[0].Y=FRectFLeftTop.Y;

Points[1].X=FRectFLeftTop.X;

Points[1].Y=FRectFRightBottom.Y;

Points[2].X=FRectFRightBottom.X;

Points[2].Y=FRectFRightBottom.Y;

Points[3].X=FRectFRightBottom.X;

Points[3].Y=FRectFLeftTop.Y;

Pts[0].X=(Points[0].X+Points[3].X)*0.5;

Pts[0].Y=(Points[0].Y+Points[3].Y)*0.5;

Pts[2].X=Points[0].X+(Points[1].X-Points[0].X)*0.381966;

Pts[2].Y=Points[0].Y+(Points[1].Y-Points[0].Y)*0.381966;

Pts[4].X=Points[1].X+(Points[2].X-Points[1].X)*0.190983;

Pts[4].Y=Points[1].Y+(Points[2].Y-Points[1].Y)*0.190983;

Pts[6].X=Points[2].X-(Points[2].X-Points[1].X)*0.190983;

Pts[6].Y=Points[2].Y-(Points[2].Y-Points[1].Y)*0.190983;

Pts[8].X=Points[3].X+(Points[2].X-Points[3].X)*0.381966;

Pts[8].Y=Points[3].Y+(Points[2].Y-Points[3].Y)*0.381966;

Pts[1].X=Pts[0].X+(Pts[4].X-Pts[0].X)*0.381966;

Pts[1].Y=Pts[0].Y+(Pts[4].Y-Pts[0].Y)*0.381966;

Pts[3].X=Pts[2].X+(Pts[6].X-Pts[2].X)*0.381966;

Pts[3].Y=Pts[2].Y+(Pts[6].Y-Pts[2].Y)*0.381966;

Pts[5].X=Pts[4].X+(Pts[8].X-Pts[4].X)*0.381966;

Pts[5].Y=Pts[4].Y+(Pts[8].Y-Pts[4].Y)*0.381966;

Pts[7].X=Pts[8].X+(Pts[4].X-Pts[8].X)*0.381966;

Pts[7].Y=Pts[8].Y+(Pts[4].Y-Pts[8].Y)*0.381966;

Pts[9].X=Pts[0].X+(Pts[6].X-Pts[0].X)*0.381966;

Pts[9].Y=Pts[0].Y+(Pts[6].Y-Pts[0].Y)*0.381966;

其中,Points为外围矩形四个顶点,用于计算五角星10个顶点过程中的辅助点;Pts为10个顶点坐标数组:

FillPath.AddLine(Pts[0],Pts[1]);

FillPath.AddLine(Pts[1],Pts[2]);

FillPath.AddLine(Pts[2],Pts[3]);

FillPath.AddLine(Pts[3],Pts[4]);

FillPath.AddLine(Pts[4],Pts[5]);

FillPath.AddLine(Pts[5],Pts[6]);

FillPath.AddLine(Pts[6],Pts[7]);

FillPath.AddLine(Pts[7],Pts[8]);

FillPath.AddLine(Pts[8],Pts[9]);

FillPath.AddLine(Pts[9],Pts[0]);

公式中的比例值:0.5、0.381966、0.190983是本发明规定的比例经验值;同上,类似可造出FillPath;

以上(1)-(6)的核心思想都是:在已知四个顶点坐标的矩形区域里,根据几何图形基本图形形状,结合规定的比例值换算出各个顶点的坐标及区域;

步骤203、判断操作点是否落在所述透视工具窗口的边缘上,如果操作点落在边缘上,则根据操作产生的dx、dy进行拉伸,即width=width+dx,height=height+dy,从而改变所述透视工具窗口的大小;如果操作点不落在边缘上且位于所述透视工具窗口内部,则将所述透视工具窗口进行整体拉伸;否则不进行拉伸操作;所述透视工具窗口的边缘是指:步骤202所述的区域向外扩大一定的图形比例尺寸及向内缩小一定的图形比例尺寸,形成的环形区域,这里取5个像素点为例,即所述透视工具窗口的每条边向外5个像素点与向内5个像素点之间的区域为边缘;在该步骤中的判断方法说明如下:

(1)将FRectFLeftTop、FRectFRightBottom“向外”扩展5个像素点:

FRectFLeftTop1.X=FRectFLeftTop.X-5;

FRectFLeftTop1.Y=FRectFLeftTop.Y-5;

FRectFRightBottom1.X=FRectFRightBottom.X+5;

FRectFRightBottom1.Y=FRectFRightBottom1.Y+5;

利用新的两个点FRectFLeftTop1、FRectFRightBottom1,用步骤202的方法,可以算出比FillPath的各点X、Y坐标都大5的区域OutPath;

(2)将FRectFLeftTop、FRectFRightBottom“向内”压缩5个像素点:

FRectFLeftTop2X=FRectFLeftTopX+5;

FRectFLeftTop2.Y=FRectFLeftTop.Y+5;

FRectFRightBottom2.X=FRectFRightBottom.X-5;

FRectFRightBottom2.Y=FRectFRightBottom1.Y-5;

利用新的两个点FRectFLeftTop2、FRectFRightBottom2,用步骤202的方法,可以算出比FillPath的各点X、Y坐标都小5的区域InPath;

(3)显然区域OutPath完全包含区域InPath;在此,区域OutPath与InPath做区域减法运算,得到新区域ControlPath,为边缘区域;只要操作点落在此区域里,都将被视为改变透视工具窗口大小的操作,操作过程中根据前后两点的坐标,将产生位移变差dx、dy,也就有:

width=width+dx;

height=height+dy;

对应的FRectFLeftTop、FRectFRightBottom也将跟着更新,之后重新利用上面的步骤202及本步骤203中的(1)-(3)算出FillPath、ControlPath。

步骤30、将画布中通过所述透视工具进行透视的图形定义为透视图形,根据画布中所述透视工具窗口及各个透视图形的顶点坐标分别绘制出所述透视工具窗口及各个所述透视图形的形状,并计算出画布中按图层顺序显示的各个所述透视图形与所述透视工具窗口有交集的图形对象,具体包括如下步骤:

步骤301、计算按图层顺序显示各个透视图形的顶点坐标,依次按顺序连接起来,首尾相连,形成一个个封闭的几何图形,详细说明如下:

见图3,有三个即将被透视的图形,按图层由后到前依次为:矩形(A)、三角形(B)、梯形(C),类似步骤202的方法可以算出各个图形的轮廓路径:PathA,PathB,PathC;

步骤302、根据所述透视工具窗口的形状,获取各个顶点坐标,依次按顺序连接起来,首尾相连,形成透视工具的外围几何图形;即:步骤202中算出的区域路径FillPath;

步骤303、将步骤301所构建的每个几何图形按顺序依次与步骤302所构建的几何图形求交集,如果交集不为空,则按图层顺序依次记录其对应的图形对象;如果交集为空,则不存在有交集的图形对象;具体说明如下:

由图3和图4可以看出,透视工具是矩形形状,因此FillPath实际是个矩形区域,显然PathA、PathB、PathC与FillPath都有区域交集,按图层从后到前,将有交集的图形对象A、B、C缓存起来;

又例如,图7中,菱形(D)的路径PathD显然跟FillPath无交集,因此图形对D不在有交集的图形对象里。

步骤40、根据设定的透视层数计算出要显示及隐藏的图形对象,具体说明如下:

图4中为透视一层的效果,也就是A、B、C图形对象的图形图层为:3、2、1,值越小,图形就越“前面”显示;透视一层那么就是图层值小于等于“1”的对象(C梯形)都要被隐藏起来,大于1的对象(A矩形、B三角形)都要绘制出来;图5是透视二层的效果,因此图层之小于等于2的对象(C梯形、B三角形)都要被隐藏起来,大于2的对象(A矩形)要绘制出来;即若透视层数为k,则将所述透视图形的图层值小于及等于k的图形对象进行隐藏,并将所述透视图形的图层值大于k的图形对象进行显示。

步骤50、将需要显示的图形对象按图层顺序在所述透视工具窗口绘制出来,并将需要隐藏的图形对象不在所述透视工具窗口绘制出来;具体说明如下:

图4为透视一层的效果,也就是在透视工具窗口绘制时,按图层顺序从大到小依次绘制,图层值小于等于1的对象不会绘制;被绘制的图形就是步骤40所说的“显示”,不绘制的图形就是步骤40所说的“隐藏”;因此图4中按图层从大到小需要绘制的图形对象有A、B,不需要绘制的有C;经过这步处理,就得到图4、图5或者图7的效果。

步骤60、根据设定的透明度值,用带有透明度的维度A(可以透明的颜色一般有四个维度(RGBA))填充所述透视工具窗口,为了达到一些更好的视觉效果,这里加上另一个功能,就是允许使用者,通过透视工具进行“透视观看”的清晰模糊度。例图6较图5、图7就显得“模糊”。这里的处理方式,是在步骤50的基础上,用某一纯色按照既定的透明值填充透视工具窗口,比如说这个颜色值为:

RGB(127,127,127),再加透明维度A(0-255),0完全透明,255完全不透明,即值越大越不透明,越小越透明。

图6是20%的透明度,跟维度A值的含义刚好相反,百分值越小越不透明,越大越透明,由百分数换出出维度A的值如下:

A=(255-255*0.2)=204。

步骤70、加粗所述透视工具窗口的边框,为了比较好的视觉效果,这里绘制上透视工具的窗口边框,也就是本发明附图中那些“透视工具”外边缘那圈“黑色轮廓”。在这些黑色轮廓附近可以支持步骤102所描述的对透视工具窗口进行改变大小的操作。

本发明实现出来的效果:表面上像是把图层靠前的图形对象剥开,然则不是如此;核心思想是:画布上已经绘制好的图形对象都不会去动,换之,另起一“画布”,根据各个图形位置、图层关系把图形对象按照算出的“规矩”在新的“画布”上重新绘制一次,使得看起来像是把图层靠前的图像对象剥开。

虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1