在场景中绘制具有特定点的椭圆

时间:2013-12-10 11:25:29

标签: qt qgraphicsitem

我想知道如何用qgraphicsscene中标记的三个点绘制椭圆。如果用户使用mousePress选择场景中的三个点,我将使用标记突出显示按下的点。现在使用三个标记我必须围绕三个标记绘制一个椭圆,或者将这些点作为我绘制的椭圆的边界。enter image description here

实现painterpath drawEllipse会工作..?

1 个答案:

答案 0 :(得分:1)

我与PySide有过类似的问题。您可以使用C ++轻松调整此代码:

def paintEvent( self, ev ):
    painter = QPainter( self )
    painter.setPen( QPen( Qt.red, 4 ) )
    painter.drawPoint( self.a )
    painter.drawPoint( self.b )
    painter.drawPoint( self.c )

    # 1. Find the long axis.
    maxL = max( QLineF( self.a, self.b ), QLineF( self.a, self.c ), QLineF( self.b, self.c ), key=lambda x: x.length() )
    center = maxL.pointAt( 0.5 )

    # 2. Find the small axis
    if maxL == QLineF( self.a, self.b ):
        c = self.c
    elif maxL == QLineF( self.a, self.c ):
        c = self.b
    else:
        c = self.a
    w = maxL.length()
    h = QLineF( c, center ).length() * 2.0

    # 3. Define the bounding rect for our ellipse
    rect = QRect( -w/2.0, -h/2.0, w, h )

    # 4. Rotate the painter and draw the ellipse
    painter.translate( center.x(), center.y() )
    painter.rotate( -maxL.angle() )
    painter.setPen( Qt.black )
    painter.drawEllipse( rect )

目标是计算椭圆的边界矩形,考虑到三个点是两个轴的末端。

所以,第一步找到长轴。第二步找到小轴 矩形由轴长度定义,我们只需要旋转画家来绘制椭圆。

应该存在一个更好的解决方案,但目前矿井似乎有效......

编辑:这很快又脏。因此,它不适用于很多情况。 更好的解决方案是使用属性:对于椭圆上的每个点,点与两个静态点之间的距离之和是恒定的。 因此,您可以计算此距离并确定其他两个点并确定两个轴。