シーンに複数のカーブを配置するアプリケーションがあります。ユーザーが回線を押したかどうかを検出する簡単な方法を探していました。boundingRect()
複数の線を描いてintersects()
いたときは不正確すぎました。ということで、縦線以外は夢のような機能を作ってみました。
selectionMargin
ユーザーが設定するグローバル変数です (デフォルト = 0.5)。選択チェックの精度のマージンを調整します。名前は、各サブラインの線形関数に基づいていy = ax + b
ます。Pos は、mousePressEvent からの位置です。
bool GraphApp::pointInPath(QPainterPath path, QPointF pos)
{
qreal posY = pos.y();
qreal posX = pos.x();
for (int i = 0; i < path.elementCount()-1; ++i) {
if (posX < path.elementAt(i + 1).x && posX > path.elementAt(i).x) {
qreal dy = path.elementAt(i + 1).y - path.elementAt(i).y;
qreal dx = path.elementAt(i + 1).x - path.elementAt(i).x;
qreal a = dy / dx;
qreal b = path.elementAt(i).y - (path.elementAt(i).x * a);
if (selectionMargin == 0.0)
selectionMargin = 0.5;
qreal lowerBound = (a * posX + b) + selectionMargin;
qreal upperBound = (a * posX + b) - selectionMargin;
if (posY < lowerBound && posY > upperBound)
return true;
}
}
return false;
}
したがって、縦線で覆われた領域から mousePressEvent を送信すると、この関数は false を返すようです。私の最初の考えはif文です:
if (posX < path.elementAt(i + 1).x && posX > path.elementAt(i).x)
if文なしでこれを実装する方法について、他のアイデアはありますか?
また、他の人が a にand関数QPainterPath
のないポイントが含まれているかどうかを確認する良い方法を見つけるのに苦労しているのを見たので、これはおそらく他の人にも使用できます:)boundingRect()
intersects()
編集:私の知る限り、をcontains()
使用しboundingRect()
ます。だから私はそれを適切な解決策とは思わない