【问题标题】:Why ball1.boundingrect.center returns the same value as ball2.boundingrect.center?为什么ball1.boundingrect.center 返回与ball2.boundingrect.center 相同的值?
【发布时间】:2015-11-07 21:07:02
【问题描述】:

我正在编写一个带有圆圈的物理模拟。

Ball.cpp 代码:

Ball::Ball()
{    
    angle = 0;
    setRotation(angle);

    //set the speed
    speed = 5;


    double StartX = 720;
    double StartY = 80;


        StartX = (qrand() % 800);
        StartY = (qrand() % 400);

      radius = 40;

    setTransformOriginPoint(radius,radius);

    setPos (StartX,StartY);
}

QRectF Ball::boundingRect() const
{
    return QRect(0,0,2*radius,2*radius);
}

bool Ball:: circCollide(QList <QGraphicsItem *> items) {
    QPointF c1 = mapToParent(this->boundingRect().center());

    foreach (QGraphicsItem * t, items) {
        Ball * CastBall = dynamic_cast<Ball *>(t);
        if(CastBall)
        {
            QPointF t1 = mapToScene(CastBall->boundingRect().center());
            double distance = QLineF(c1,t1).length();


            double radius1 = this->boundingRect().width() / 2;
            double radius2 = CastBall->boundingRect().width() / 2;
            double radii = radius1 + radius2;

            if ( distance <= radii )
            {
            //    qDebug() << "true collision";
                return true;
            }
        }
    }
 //   qDebug() << "false collision";
    return false;
}

我遇到的问题是,这段代码返回的两个对象的中心位置总是相同的值,(t1.x == c1.x, t1.y == c1.y) 但是@ 987654322@ 返回 false,所以它不是同一个对象,它只是具有相同的边界矩形中心点坐标。

在调用此函数之前坐标已经相等,并且对于我生成的所有 3 个对象,尽管集合始终具有不同的值。

首先我认为这是一个问题,因为boundingRect被定义为一个常量,所以我在我的类中创建了这个函数

QRectF Ball:: centerRect()
{
    return QRect(0,0,2*radius,2*radius);
}

并且只是用它替换了对 boundingRect 的每次使用(没问题,因为我已经在方法中转换了它),但它仍然为两个中心返回相同的值。

我真的对此束手无策,希望能得到一些帮助。

【问题讨论】:

  • 你能创建一个更简单的例子吗?请注意,边界矩形位于项目空间坐标中,并且不考虑项目的位置,该位置在父项目坐标(或场景坐标,如果没有父项目)中定义。
  • 我压缩了很多,我已经将中心点映射到场景/父级。
  • 你能显示你创建球的代码吗?
  • 您是否在代码中某处进行了此检查 (t1.x == c1.x , t1.y == c1.y) 或仅通过 qDebug 输出判断?
  • 只是通过 qDebug 输出,但它的行为也像实际那样(调用时总是返回 true)。

标签: c++ qt constants bounding-box


【解决方案1】:

问题如下:边界矩形的中心未映射到球的坐标。以下语句应该有效:

mapToScene(mapToItem(castBall, castBall->boundingRect().center()));

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 2015-05-21
    • 2011-09-28
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多