如何获得翻译后的 QPolygon 的终点

Posted

技术标签:

【中文标题】如何获得翻译后的 QPolygon 的终点【英文标题】:how to get the end point of a translated QPolygon 【发布时间】:2015-02-05 14:15:57 【问题描述】:

我正在尝试绘制箭头,所以我只是参考了我们可以绘制箭头的示例代码:

http://doc.qt.io/qt-5/qtwidgets-graphicsview-elasticnodes-edge-cpp.html

我决定使用相同的公式进行绘制并尝试如下:

theCurrentLine->setP1(QPointF(0, 0)  );
theCurrentLine->setP2((theLineVector));
p->drawLine(*theCurrentLine);

double angle = ::acos(theCurrentLine->dx() / theCurrentLine->length());
if (theCurrentLine->dy() >= 0)
    angle = TwoPi - angle;

QPointF sourcePoint = QPointF(0,0);

QPointF sourceArrowP1 = sourcePoint + QPointF(sin(angle + Pi / 3) * theArrowSize,
                                              cos(angle + Pi / 3) * theArrowSize);
QPointF sourceArrowP2 = sourcePoint + QPointF(sin(angle + Pi - Pi / 3) * theArrowSize,
                                              cos(angle + Pi - Pi / 3) * theArrowSize);

p->drawPolygon(QPolygonF() << theCurrentLine->p1() << sourceArrowP1 << sourceArrowP2);

但现在我想在绘制箭头多边形后画线。

如何更改theCurrentLineP1() 值,该值可以在多边形之后作为当前polygon(arrowHead) 开始,并且线从同一点开始?我需要在绘制箭头后开始这条线。原因是有时如果笔宽增加,箭头看起来比线条小。

【问题讨论】:

【参考方案1】:

您可以在 QPolygon 中获取索引处的点。

 QPoint QPolygon::point ( int index ) const

当你知道有多少点时会很容易。 Qt 文档是您的朋友。

你可以使用count(),例如:

 QPoint lastPoint = myPolygon.point(myPolygon.count() - 1);

只要给你的多边形起个名字,就可以了。

编辑:这些代码的最新版本应该可以解决您的问题。我想我需要举个例子。 您需要按此顺序添加积分:

 QPolygon myPolygon;
 myPolygon.setPoint(0, sourceArrowP1);
 myPolygon.setPoint(1, theCurrentLine->p1());
 myPolygon.setPoint(2, sourceArrowP2);
 p->drawPolygon(myPolygon);
 QPoint lastPoint;
 lastPoint = myPolygon.point(myPolygon.count() - 1);

您需要在最后一个点和第一个点之间画一条线。这里:

 p->drawLine(myPolygon.point(0, myPolygon.point(myPolygon.count() - 1));

如果你想让你的箭头用颜色填充,你需要使用QPainterPath而不是QPolygon:

 QPen pen(Qt::black); //Or whatever color you want
 pen.setWidthF(10); //Or whatever size you want your lines to be
 QBrush brush(Qt::red); //Or whatever color you want to fill the arrow head
 p->setPen(pen);
 p->setBrush(brush);
 QPainterPath arrow(sourceArrowP1);
 arrow.lineTo(theCurrentLine->p1());
 arrow.lineTo(sourceArrowP2);
 arrow.lineTo(sourceArrowP1); //This returns to the first point. You might eliminate this line if you want to.
 p->drawPath(arrow);

【讨论】:

感谢您的有用帖子。我还有一项任务。我需要在最后一点和前一个到最后一个点之间画一条线。像箭头中间一样。 @Wagmare 没问题。请务必经常查看 Qt 文档以获取答案。这是我见过的最好的文档。【参考方案2】:

我的实际实现:

theCurrentLine->setP1(QPointF(0, 0)  );  // arrow line coordinates
theCurrentLine->setP2((theLineVector));
double angle = ::acos(theCurrentLine->dx() / theCurrentLine->length());  // angle of the current Line
if (theCurrentLine->dy() >= 0)
    angle = TwoPi - angle;

// getting arrow head points to be drawn
QPointF sourcePoint = QPointF(0,0);

QPointF sourceArrowP1 = sourcePoint + QPointF(sin(angle + Pi / 3) * theArrowSize,
                                              cos(angle + Pi / 3) * theArrowSize);
QPointF sourceArrowP2 = sourcePoint + QPointF(sin(angle + Pi - Pi / 3) * theArrowSize,
                                              cos(angle + Pi - Pi / 3) * theArrowSize);

p->drawPolygon(QPolygonF() << theCurrentLine->p1() << sourceArrowP1 << sourceArrowP2);

// to find the center point in the arrow head right
QLineF perpLine = QLineF(theCurrentLine->p1(), theCurrentLine->p2());
QLineF arrowheadWidth = QLineF(sourceArrowP1, sourceArrowP2);

QPointF originPoint;
QLineF::IntersectType res = perpLine.intersect(arrowheadWidth, &originPoint);

theCurrentLine->setP1(originPoint);
p->drawLine(*theCurrentLine);

如果有人知道更好的方法来实现这一点(我相信会有),请纠正我。

【讨论】:

我编辑了我的答案来回答你的评论,但我猜你还没有看到它。 我的回答的问题是我按照你给的顺序加了点。我应该做的是添加 currentLine->p1() 作为第二点。那么我的回答将适用于你的情况。我将编辑第一个代码。 现在看我的回答,如果有问题请评论。 我还添加了一个带有 QPainterPath 的示例。您可能想检查一下。

以上是关于如何获得翻译后的 QPolygon 的终点的主要内容,如果未能解决你的问题,请参考以下文章

使用laravel Carbon,如何通过数字获取翻译后的名字?

如何计算 QPolygon 面积

如何减去 QPainterPaths,QPolygon?

如何知道一个点是不是在 QPolygon 的周长(PyQt4)

将旋转的 QRect 变成 QPolygon

我如何获得按键并将其写入变量?