zhouzhihao_07 2018-04-09 02:06 采纳率: 0%
浏览 1231
已结题

musescore c++源码,请解释一下这段代码的意思,小弟刚开始搞这方面!

图片说明

  • 写回答

3条回答 默认 最新

  • tylerzhangdi 2018-04-09 02:31
    关注

    每个Score都放在父容器ScoreView里,ScoreView 就是MDI程序中的一个文档窗口,系统绘制要求,或Qt的update(),updateAll()等都可以导致ScoreView::paintEvent(QPaintEvent* ev)被调用。在ScoreView::paintEvent(QPaintEvent* ev)里得到更新区域QRegion,它由一组QRect组成,对每一个QRect,得到一个对应的元素列表,然后绘制每一个元素Element。

    这里有一个关键的数据结构BspTree,用于快速的从屏幕坐标查找到Element。
    BspTree全名叫二叉空间分割树,是游戏开发中常用的数据结构。一棵层高为 n 的bsptree树可以容纳2^n个节点,其中只有叶子节点放的是真正的元素(Element),所以能容纳2^(n-1)个元素(Element)。所有父节点都做辅助作用,父节点对应一块所有子元素组成的区域,在查找时,判断point或rect是否在父节点的区域内,如果在,则到子树里去找,这样查找一个元素需要的平均时间为 n 次比较。该树在排版时建立,后面只要数据没变,树就固定,因此大大加快了元素定位的速度,是MuseScore程序运行飞快的主要功臣。关于bsptree,可以到这里玩一下:http://www.symbolcraft.com/graphics/bsp/index.php
    看概念看的头晕,玩了这个才明白点了。mscore的空间分割没这么复杂,就是横一刀竖一刀的切成了一堆方块。MuseScore的大量操作依赖bsptree的定位能力,鼠标操作,包括select,drag & drop等大量编辑操作,都是已知屏幕坐标位置,查找对应Element,再执行 Element 的相关函数。

    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序