根据您的评论,您确实正确地解决了这个问题。但是,您需要解决的问题是遍历 QPainterPath 元素并确定哪些元素实际上与球的方向线相交(为此使用 QLineF 应该是一项相当容易的任务)。此外,简化路径会将任何贝塞尔曲线减少为直线以便于计算(我将由您决定,因为您不太可能需要自己或根本不需要处理贝塞尔计算)。由于可能有多个交叉点,接下来您需要确定哪个交叉点最靠近球的中心。一旦你确定了哪个点最接近,使用 QLineF 中的那个元素来找到它的法线向量,然后你就可以完成反弹方向的计算。
这是一些基本的非线程代码,向您展示如何迭代 QPainterPath 并处理它的元素。
QPainterPath path = item->shape();
path = path.simplified(); //optional if you do not want to handle curveTo elements yourself
QPainterPath::Element element;
QPainterPath::Element P1;
QPainterPath::Element P2;
QPainterPath::Element P3;
QPainterPath::Element P4;
for(int i = 0; i < path.elementCount()-1; ++i)
{
element = path.elementAt(i);
if(element.isMoveTo())
{
//Do something
}
else if(element.isLineTo())
{
//Do something with element.x and element.y
}
else if(element.isCurveTo())
{
P1 = path.elementAt(i-1); // start point
P2 = path.elementAt(i); // control point
P3 = path.elementAt(i+1); // control point
P4 = path.elementAt(i+2); // end point
//Do something with cubic bezier points
}
}