前言
在做图形绘制的时候会存在修改图形的需求,那么要修改得先获取图形 - "碰撞测试" 遍历返回
void hitTestLineAround(const QPointF &linePt1, const QPointF &linePt2,
const QPointF &hitPt, bool &bHit)
{
bHit = false;
QPointF leftPt, rightPt;
if(linePt1.x() < linePt2.x()) // The processing here is critical
{
leftPt = linePt1;
rightPt = linePt2;
}
else {
leftPt = linePt2;
rightPt = linePt1;
}
double hypotenuseLen = 5;
double angle = QLineF(leftPt, rightPt).angle();
QPolygonF polygon;
if(angle <= 90)
{
double radian = (90 - angle) / 180 * M_PI;
double calcX = cos(radian) * hypotenuseLen;
double calcY = sin(radian) * hypotenuseLen;
polygon << leftPt + QPointF(qAbs(calcX), qAbs(calcY))
<< leftPt - QPointF(qAbs(calcX), qAbs(calcY))
<< rightPt - QPointF(qAbs(calcX), qAbs(calcY))
<< rightPt + QPointF(qAbs(calcX), qAbs(calcY))
<< leftPt + QPointF(qAbs(calcX), qAbs(calcY));
}
else if(angle >= 180)
{
double radian = (90 - (360 - angle)) / 180 * M_PI;
double calcX = cos(radian) * hypotenuseLen;
double calcY = sin(radian) * hypotenuseLen;
polygon << leftPt + QPointF(qAbs(calcX), -qAbs(calcY))
<< leftPt + QPointF(-qAbs(calcX), qAbs(calcY))
<< rightPt + QPointF(-qAbs(calcX), qAbs(calcY))
<< rightPt + QPointF(qAbs(calcX), -qAbs(calcY))
<< leftPt + QPointF(qAbs(calcX), -qAbs(calcY));
}
QPainterPath path;
path.addPolygon(polygon);
// hit result
bHit = path.contains(hitPt);
}