• 12972阅读
  • 11回复

用QPainterPathStroker取折线轮廓时碰到的问题(已解决) [复制链接]

上一主题 下一主题
离线sbtree
 
只看楼主 倒序阅读 楼主  发表于: 2009-02-10
— 本帖被 XChinux 执行加亮操作(2009-03-09) —
用一系列点创建了一条折线,放在一个QPainterPath里面,想通过QPainterPathStroker取得该折线的轮廓(折线有宽度,采用RoundJoin连接类型),问题是在轮廓内部,折线拐角的地方总是产生如图所示的圆形或三角形的线条,不知如何去除它们,请高手指点,急盼回复。
       
[ 此帖被sbtree在2009-03-09 18:28重新编辑 ]
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 1楼 发表于: 2009-02-10
也就是去除图中用红线圈出的部分
windows 7 + VC++2008 + Qt4.5.2
离线duduqq

只看该作者 2楼 发表于: 2009-02-11
先不要用QPainterPathStroker,试试画出来的图有没有问题先。
离线sbtree
只看该作者 3楼 发表于: 2009-02-11
我觉得这个问题完全是因为QPainterPathStroker取轮廓不精确或者算法问题造成的,但是不知道怎么解决
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 4楼 发表于: 2009-02-11
引用第2楼duduqq于2009-02-11 09:01发表的  :
先不要用QPainterPathStroker,试试画出来的图有没有问题先。

一条有宽度的折线而已,看不出什么问题。 上点代码来吧:
  1. QPainterPath outline(qreal w)
  2. {
  3.     QPainterPath path;
  4.     path.moveTo(_points[0]);
  5.     for(int i=1; i<_points.count();i++)
  6.         path.lineTo(_points[i]);
  7.     QPainterPathStroker stroker;
  8.     stroker.setCapStyle(Qt::FlatCap);
  9.     stroker.setJoinStyle(Qt::RoundJoin);
  10.     stroker.setWidth(w);
  11.     return stroker.createStroke(path);
  12. }
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 5楼 发表于: 2009-02-12
高手给看一看啊,急用,救命啊!!
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 6楼 发表于: 2009-02-12
谁有更好的实现方法吗?
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 7楼 发表于: 2009-02-13
还在尝试,有新的进展再来报告
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 8楼 发表于: 2009-02-14
目前的想法是编写代码取轮廓了
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 9楼 发表于: 2009-02-17
自己编写代码还挺复杂!
windows 7 + VC++2008 + Qt4.5.2
离线codespy
只看该作者 10楼 发表于: 2009-02-17
没实现过这个东西,但是我认为应该重新实现画线算法吧。
离线sbtree
只看该作者 11楼 发表于: 2009-03-09
只能自己实现了,跟大家分享一下方法:
1。依次取折线的每一段线段
2。以每一段线段的首端和末端为起点,在线段的两侧分别做垂线,长度为折线宽度的一半,保存垂线的末端端点,连接线段同侧的垂线的末端端点
3。取下一段线段,按上面的方法连接垂线端点,求连线与之前的线段的同侧的连线的交点(如果是拐角的外侧垂线端点的连线,在其延长线上),用该点更新上一次保存的线段末端的垂线端点,并保存当前线段的末端垂线的端点。
4。完成整条折线后,依次连接折线同侧的保存好的点并在开始和结束的地方封闭连接,形成多边形
5。填充多边形,完成绘制
注意:当折线的转角接近180度,也就是几乎完全折回的时候,要考虑交点可能在无限远的延长线上,必要时要采取缩短交点位置的措施。另外还可以对拐角实现圆角绘制。上个图:
windows 7 + VC++2008 + Qt4.5.2
快速回复
限100 字节
 
上一个 下一个