3

I'm trying to create a game using qt. I have some obstacles (QPixmapItem) in a graphics view. I have a ball, and what I want is that it bounces off the obstacles. How can I detect the normal of the surface of the obstacle, so that I can calculate the new moving direction? For example:

------------------------------
    / \          |
   /   \         | 
  /     \        v
 /       \       ^
/         \      |
4

1 回答 1

1

根据您的评论,您确实正确地解决了这个问题。但是,您需要解决的问题是遍历 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
    }
}
于 2013-11-20T08:54:00.300 回答