第二届“启智杯”可视化流程编辑器-基于坐标变换实现整体框架
第二届“启智杯”开发类命题-一个可视化流程编辑器。最近学了点机器人运动学,其中基于矩阵实现坐标变换的思路恰好可以用在这个流程编辑器的各个视图变换。语言:C++。应用程序框架:MFC。位图绘制和图形绘制:GDI。

简介

本文参照VisionMaster的流程编辑器,粗略介绍了本小组如何基于矩阵坐标变换,实现一个拥有局部显示区域和全局缩略显示区域的流程编辑器框架。图1展示了该流程编辑器的界面布局。
2.PNG

图1 流程编辑器界面

设计思路

全局区域内存申请

在Windows GDI环境下,待渲染的图像通常以位图的形式存储于内存中。为了实现局部显示和缩略图功能,首先需要分配一块足够大的内存区域,用于存储整个编辑器的绘制内容。

    /*
     *	定义背景画布信息
     */
    #define BKWIDTH 1440
    #define BKHEIGHT 2560
    #define BKCELLSIZE 20
    
    //创建DC和CBitmap,并选入CBitmap
    CBitmap* m_memBitmap = new CBitmap();
    CDC* m_memCDC = new CDC();
    m_memCDC->CreateCompatibleDC(clientDC);
    m_memBitmap->CreateCompatibleBitmap(clientDC, BKWIDTH, BKHEIGHT);
    CBitmap* m_mOldBitmap = m_memCDC->SelectObject(m_memBitmap);

局部窗口移动与事件转换

以移动窗口和点击模块为例,以下内容描述了如何实现坐标转换和事件处理。

窗口移动

在本小组设计的流程编辑器中,基于矩阵的坐标变换是实现窗口移动的关键技术。由于不涉及坐标系的旋转,仅涉及平移操作,因此实现起来相对简单。如图2所示,展示了窗口坐标系与内存坐标系之间的转换关系。仅需调整转换矩阵T的第三列值,可以方便地实现局部显示窗口的移动。
7.PNG

图2 窗口坐标系与内存坐标系的转换关系

    //创建画布DC和CBitmap,并选入CBitmap
    CBitmap* m_dispBitmap = new CBitmap();
    CDC* m_dispDC = new CDC();
    m_dispDC->CreateCompatibleDC(clientDC);
    m_dispBitmap->CreateCompatibleBitmap(clientDC, m_wndWidth, m_wndHeight);
    CBitmap* m_dOldBitmap = m_dispDC->SelectObject(m_dispBitmap);
    
    //根据实时转换矩阵将内存画面渲染至画布DC
    //m_cTransformer为专门用来计算、保存坐标变换值的类
    m_dispDC->BitBlt(0, 0, m_pDisplyWH->x, m_pDisplyWH->y, m_memDCManager->GetDC(), m_cTransformer->m_pInGlobal.left, m_cTransformer->m_pInGlobal.top, SRCCOPY);

模块点击

在窗口区域产生鼠标点击事件时,需判断是否点击了模块,由于Windows的API所获取的坐标是相对于窗口的,因此需要转换到内存坐标中以判断是否点击中模块,同上,只需求解窗口坐标系到内存坐标系的转换矩阵即可完成坐标转换。

    //将基于窗口的坐标转换到内存的坐标
    m_cTransformer->wnd2mem(currentPoint);
    /判断是否点击到模块上
    if (m_memDCManager->SetClickModule(currentPoint)) {
    	//具体事件实现...
    }

全局缩放区域实现

通过定义一个固定矩阵,并设置好缩放比例,就可以实现全局区域的缩放显示。如图3所示,展示了缩放区域显示的效果。

9.PNG

/*
 *	定义全局缩略区域相当于窗口区域的位置
 */
#define THUMBWIDTH 288
#define THUMBHEIGHT 512
#define RIGHTLIMIT 10 //距离右边界的距离
#define BOTTOMLIMIT 10 //距离下边界的距离

//将全局缩放到THUMBWIDTH * THUMBHEIGHT
m_thumbCDC->StretchBlt(0, 0, THUMBWIDTH, THUMBHEIGHT, memDC, 0, 0, BKWIDTH, BKHEIGHT, SRCCOPY);
//绘制银灰色边界
m_thumbCDC->SelectObject(m_grayPen);
m_thumbCDC->Rectangle(CRect(0, 0, THUMBWIDTH, THUMBHEIGHT));
//绘制窗口区域相对于全局区域的位置
m_thumbCDC->SelectObject(m_orangePen);
m_thumbCDC->Rectangle(m_cTransformer->m_pInThumb);

//把thumbDC拷贝到dispDC上
m_dispDC->BitBlt(m_cTransformer->m_thumb2wnd(0, 2), m_cTransformer->m_thumb2wnd(1, 2), THUMBWIDTH, THUMBHEIGHT, m_thumbDCManager->GetDC(), 0, 0, SRCCOPY);

总结

在本小组的开发过程中,基于矩阵变换实现一个拥有局部显示区域和全局缩略显示区域的流程编辑器框架在逻辑上更容易理解。

武汉理工大学,程惟康,2024-02-21;

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

“启智杯”设计大赛-一种模板匹配建模与识别控件

下一篇

VM算法圆查找工具与基于opencv开发的圆查找对比

评论请先登录 登录
全部评论 1

这么快就有成果了。。。

2024-02-28 11:31:04 浙江省
回复
  • 1
Lv.0
0
关注
4
粉丝
5
创作
23
获赞
相关阅读
  • 探寻机器视觉新星|第二届“启智杯”机器视觉设计大赛获奖名单公布
    2024-04-08 浏览 0
  • VM4.4更新亮点
    2024-04-12 浏览 0
  • 第二届启智杯—光伏电池片质检视觉方案设计
    2024-04-15 浏览 0
  • 每日分享|3D视觉成像之双目立体视觉原理
    2024-03-21 浏览 0
  • 海康AMR应用场景中蜂鸣器的使用
    2024-04-03 浏览 0

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器