自定义MITK PlanarFigure及困惑

来源:互联网 发布:黑马程序员java视频 编辑:程序博客网 时间:2024/06/06 19:57

MITK只实现了有限的几个Planar Figure,比如一个线段,折线和贝塞尔曲线。如果你想画其它曲线,就需要自己写。

写的方法其实很简单,继承mitk::PlanarFigure类,然后重写里面的GeneratePolyLine()方法。可根据自己的需要指定画不画helper polyline等。这里不再赘述。

下面写一写我在使用自定义planar figure时遇到的一些问题。

planar figure画线的原理

大家都知道,样条曲线是由控制点决定的,mitk::PlanarFigure也不例外,它有一个m_ControlPoints成员专门记录当前的控制点数量。拿贝塞尔曲线来说,mitk::PlanarBezierCurve的构造函数中就指定控制点数量初始化为2。

当用户在图像上点击第一个点的时候, 函数自动创建两个控制点,这两个控制点的坐标相同(为鼠标点击的地方),设为(x1,y1)=(x2,y2);当鼠标开始移动,但未点击时,我们看到样条曲线照样在实时绘制,这是怎么完成的呢?这是因为mitk::PlanarFigure一直在记录鼠标的位置,把它存入(x2,y2),同时调用GeneratePolyLine(),生成新的曲线并渲染出来。

接下来,我们点击一次鼠标,这时就有三个控制点了。(x1,y1),(x2,y2),(x3,y3)。(x1,y1),(x2,y2)为两次点击时的鼠标位置;(x3,y3)相当于是第二次点击时附赠的,鼠标不动时它的值和(x2,y2)一样,鼠标移动时,它的值随鼠标坐标改变。

控制点坐标的获取

工程中需要实现Centripetal Catmull-Rom曲线。下面说说遇到的问题。

mitk::PlanarFigureInteractor接到鼠标点击事件后,会将这个世界坐标(x1,y1,z1),通过自己的planeGeometry转换成mitk::Point2D类型(x11,y11),然后调用mitk::PlanarFigure的AddControlPoint()方法,存入m_ControlPoints数组中,作为一个控制点。这些控制点的坐标原点为图像左下角。曲线画完后,我需要把这些控制点保存下来,以便下次读取。

读取时,还是严格按照保存时的坐标点顺序进行。也是通过AddControlPoint()方法添加进去。通过检查,m_ControlPoints中控制点的坐标和保存前的m_ControlPoints数组里的坐标一模一样。也就是说,无论是画线,还是保存,AddControlPoint()方法的输入都是一样的。然而,这时渲染出的曲线却和保存前成镜面对称了。看下方。
这里写图片描述

结果很让人困惑。

解决方法先将mitk::Point2D坐标转换成世界坐标再保存。读入时输入这些世界坐标,画出来的线就一样了。不过这之间究竟发生了什么,仍旧没有弄明白!!!

最后补充
经过检查,最后找到原因为创建planarfigure时一定要调用,setPlaneGeometry()函数,给它一个正确的Geometry!!

0 0
原创粉丝点击