Algorithm 版 (精华区)

发信人: Lerry (戒网·学习), 信区: Algorithm
标  题: 多媒体系统中的编辑功能及其实现算法
发信站: 哈工大紫丁香 (2001年11月20日20:49:48 星期二), 站内信件

多媒体系统中的编辑功能及其实现算法
作者:周卫东 毛法尧
  媒体编辑功能的作用及设计方式
  媒体编辑是多媒体应用系统中不可缺少的功能之一,它与界面设计的风格密切相关
。编辑的主要目的是对组成多媒体产品的对象,如页、图像、声音和动画等进行增、删
、剪切、拷贝,以及调整位置等操作,以帮助制作人员调整其中的内容和顺序。
  制作人员在对媒体对象编辑时,常在两种情况下进行,首先在媒体产生时,如选中
窗口区域输入文字,或用鼠标拖曳拉出矩形的大小时,这个过程正在编辑对象,称为生
成媒体时的交互编辑。另一种情况是,媒体对象已经出现在窗口之中,但需要调整位置
,或改变属性,或增、删,这时制作人员也要对媒体进行编辑,这时的编辑行为称为迟
后编辑或再次编辑。
  (1) 交互编辑功能设计方式
  需要交互编辑的媒体对象常指的是矢量图形。典型的有矩形、直线、折线、多边形
、椭圆及圆弧等,其次是图像、动画。
  所谓交互编辑是指,制作者移动鼠标拖曳或选取媒体的坐标点。
  A方式∶适合于直线、折线编辑。鼠标点中的第一下为起始的第一点,鼠标点中的 
后续位置,┅┅,为折线的中间点。如果画的是直线,则第二点为结束点。每当 鼠标按
下时,系统都应记录坐标值。
  B方式∶适合于矩形、椭圆、圆角矩形的编辑。鼠标点中的第一下为起始左上角坐标
,第二点坐标可随鼠标的移动而改变。这样,制作者可以随时观察到图形大小情况,直
到满意时,再按鼠标。此时,系统记录下这两个坐标值,该坐标表示的是图形的大小。
此外,图像也适合于用这种方式生成。
  C方式∶适合于正多边形的编辑。鼠标点中的第一点为正多边形的中心点,随着鼠标
的拉动,可以得到中心原点与当前坐标点的距离,然后系统随时算出其它顶点的坐标。
当制作者满意时,可随时再次使用鼠标按钮结束画图。
  D方式∶适合于制作多边形。这种编辑方式类似于A方式,只不过A方式用于开放型的
折线,而这种方式用于封闭多边形。系统记录下鼠标按下的每一坐标位置,作为多边形
的顶点,直到双击结束。
  以上几种设计方式用于制作者在产生图形时使用。它们的优点是∶在产生过程中可
随时看到图形的大小情况,可动态调整和编辑图形大小,直到满意为止。
  (2) 迟后编辑功能设计方式
  图形画好之后,通常需要调整,系统应提供大量的这种功能帮助制作者调整出完美
的版面,最不可缺少的就是增、删、改这三大功能。增、删的编辑过程较为容易。增加
就是在产生媒体的过程后,只要将其加入对象链表尾即可。
  * 删除方式
  删除有两种形式。即∶
  清除(Clear)---这是真正意义的删除。由制作者选择要删的对象,然后发出删除的
命令,将其从链表中摘掉。
  剪切(Cut)---这方式表面上是删除,实际上是将删除的对象存储在缓冲区中,另拷
贝了一份。这个备份的对象可以使用粘贴(Paste)命令使它还原出来。这种方式通常是制
作者只想将对象进行位置或空间上的调整,而不是真正想删除它。
  * 修改方式
  修改有多种方式。属性的改动可使用对话框方式改变,另外,对象的大小还可以第
二次改动,这种改动方法可通过结点编辑来达到。
  1. 将要改变大小的对象选为焦点。选为焦点的对象会出现八个黑白相间的
  结点,这八个黑白结点都可以用鼠标拉动改变大小;
  2. 选择其中一个结点,按下鼠标不放,拖曳到新位置;
  3. 松开鼠标,则完成对象大小改变的处理。
  若要改变对象的位置则可以按图2中B部分所示步骤进行操作,方式如下∶
  1. 点中要修改位置的对象为焦点对象;
  2. 将光标放在对象里面,再按住鼠标钮不放,将其拖曳到新位氪;
  3. 松开鼠标钮,则原图形的位置移到新点。
  这种编辑设计方式的最大优点在于可视化,制作者可以根据需要随时调整图形。在
调整过程中,为了精确定位,界面上最好随时为制作者提供当前鼠标的坐标值。如果用
户在编辑过程中,再配合对话框来输入对象的坐标,则操作结果更为理想。
  另外,为方便制作者调整版面,还应提供多种对象靠齐方式。此外,成组也是必不
可少的一种编辑功能。成组的对象具有一起改变大小、一起移动、一起参与增、删操作
等特点。
  2 媒体对象的编辑算法
  由于媒体对象的编辑过程包括选取焦点、对焦点对象改变大小、改变位置、删除、
剪切、粘贴、成组和靠齐等编辑。这里则以前述编辑功能设计方式为指导,对具体实现
的各种编辑的算法进行介绍。
  (1) 选取焦点
  如果对某一个对象进行编辑,须先选取一个特定的对象,该对象称为焦点对象。被
选为焦点的对象,才可进行编辑。为了区别,焦点对象必须有特殊的标志。在多媒体应
用系统中,焦点的标志是在它的四个角分别画上一个小黑块,这四小黑块也是焦点对象
改变大小的控制柄。
  在程序中,每个对象都会有表明大小的Size变量,这个Size数据在对象生成时就存
储在对象的属性表中。假设对象的左上角坐标为Size.left、Size.Top,右下角坐标为S
ize.right、Size.bottom,则选取焦点的算法如下∶
  Rect ObjRect(Size.left,Size.top,Size.right,Size.bottom)
  // 设对象的大小矩形区
  Get(MouseDownPoint)
  // 获得鼠标按下的位置
  Point Fore[4]={{Size.left,Size.top},{Size.right,Size.top},
  {Size.left,Size.bottom},{Size.right,Size.bottom}}
  //将四个顶点坐标放在数组中
  If (PointIn(ObjRect)) // 判断鼠标按下点是否在对象区域内
  {
   for(i=0;i<4;i++)
   {
   DrawRectangle(Fore[i]) // 画出四个焦点
   }
   ObjNode->IsFocus=1 // 将对象属性置为焦点
  }
  (2) 移动位置
  移动焦点对象的位置使用如下算法∶
  If (ObjNode->ObjAttri->IsFocus == 1) // 判定是否为焦点对象
  {
   EraseOldObj( ); // 清除原来的旧对象
   ChangeObjStyle( ); // 改变对象的位置属性值
   DrawNewObj( ); // 在新位置上画对象
  }
  (3) 改变大小 
  改变对象的大小首先要判定光标的位置是否落在焦点对象的控制柄上。如果光标落
在控制柄上,此时又接收到了Windows系统中送来的MouseDown消息,则必须使用虚函数
功能随时改变该对象的坐标值,在新位置处画出对象,并且同时清除原位置上的旧对象
。算法如下∶
  If (ObjNode->IsFocus == 1)
  {
   If (MouseDownPointIn(Fore[i]) // 如果光标落在控制柄上
   {
   EraseOldObj( ); // 清除原来的旧对象
   ChangeObjStyle( ); // 改变对象的位置属性值
   DrawNewObj( ); // 在新位置上画对象
   }
  (4) 删除、剪切、拷贝和粘贴
  删除、剪切、拷贝和粘贴都是针对链表的操作。删除是将IsFocus=1的对象从链表中
摘除;剪切是指在摘除的同时,系统在内存中申请一个缓冲区,然后将对象复制一份到
其中。剪切和拷贝到缓冲区的对象都可通过粘贴功能进行恢复,挂到该页链表的尾部。

  实践表明以上编辑状态,达到了预期的目标,而且刷新效率较好。
  (5) 组对象的实现算法
  成组不是一个必要的功能,但是它可以提高制作者的效率,并便于编辑各种靠单个
图形组成的矢量图。本节就成组的实现原理,阐述其链表形态及算法实现过程。
  由于多媒体产品中的人与物可由多个对象组成。比方说∶马车可由多个矩形和两个
椭圆构成;房屋可由多个三角形、四边形和矩形等组成。如此类似的应用还有许多。在
编辑这些对象的组合体时,常常需要一起编辑,如同时放大和缩小、同时改变位置等,
但其组合体中的相对比例和位置都不允许变化。要达到这种效果,必须提供成组(Group
)和拆组(UnGroup)的功能。
  * 组对象的链表形态
  在程序算法中,对象是由链表串起来的结点,组对象是由多个对象组成的,但是,
它本身又是页中媒体对象链表中的一个结点,因此,它是一个有对象链表的特殊对象。

  * 算法实现过程
  实现算法过程如下∶
  1. 选取焦点,将焦点对象的IsFocus置为1;
  2. 接收系统发来的成组命令;
  3. 新开一个组对象,将其挂在本页对象链表的尾部;
  4. 从本页对象的链表头查到尾,如果对象的IsFocus为1,则将其从对象链表中
  摘除;
  5. 把摘除的对象挂到组对象中的链表尾部。
  实践表明,上述实现算法过程清楚,可以提高制作者的工作效率。

--
  不在乎天长地久,就怕你从来没有!

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 天外飞仙]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.568毫秒