首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是一个很好的2D碰撞算法,还是会分配太多内存?

这是一个很好的2D碰撞算法,还是会分配太多内存?
EN

Code Review用户
提问于 2012-01-12 21:53:24
回答 1查看 294关注 0票数 6

我有一个矩形类,其中每个实例有5-6个向量。主要矢量是物体的中心和颜色,而二次矢量则或多或少地代表了矩形本身的北、南、东、西方向。这些向量被用来检测碰撞,通过“指向”外部的矩形来检测碰撞。最后,我可能会创建更多的NW、SW、NE、SE等字段,但是我想知道在我这样做之前,这是否是一个很好的实现。我作为指针分配的唯一Vec2fmWidthHeight向量,它当然只是矩形的宽度和高度(x =宽度,y=高度)的表示。

如果屏幕上有数千个内存,这是否会分配过多的内存,或者这是一个OK (至少)实现?

Rect.h

注-我在辩论如何让N,S,E,W向量指针指向记忆。这是个好主意还是不好?

代码语言:javascript
复制
#pragma once

#include <QGLWidget>
#include <GL/glext.h>
#include <cmath>
#include <QDebug>
#include "Shape.h"
#include "Vec3f.h"
#include "rand.h"

const int DEFAULT_SQUARE_WIDTH = 5;
const int DEFAULT_SQUARE_HEIGHT = 5;

typedef enum {

  V2D_NORTH,
  V2D_SOUTH,
  V2D_EAST,
  V2D_WEST

} V2D_DIRECTION;

class Rectangle : public Shape
{
public:

    Rectangle(
        Vec2f center = Vec2f(),
        Vec2f widthheight = Vec2f(DEFAULT_SQUARE_WIDTH, DEFAULT_SQUARE_HEIGHT),
        float radius = 0,
        Vec3f color = Vec3f()
    );

    ~Rectangle();

    inline Vec2f* getWidthHeight() const {
        return mWidthHeight;
    }

    inline Vec2f getDirection(V2D_DIRECTION dir) const {
        switch(dir) {
        case V2D_NORTH:
            return mNorth;

        case V2D_SOUTH:
            return mSouth;

        case V2D_EAST:
            return mEast;

        case V2D_WEST:
            return mWest;

        }
    }
    virtual void Collide( Shape &s );

    virtual void Collide( Rectangle &r );

    virtual void Collide ( Circle &c );

    virtual bool Intersects( const Shape& s ) const;

    virtual bool Intersects( const Rectangle& s ) const;

    virtual bool IsAlive( void ) const;

    virtual float Mass( void ) const;

protected:

   virtual void Draw( void ) const;
   Vec2f* mWidthHeight;
   Vec3f mColor;

private:
   Vec2f mNorth;
   Vec2f mSouth;
   Vec2f mEast;
   Vec2f mWest;
   void InitDirections();

};
EN

回答 1

Code Review用户

发布于 2012-01-13 00:01:22

构造函数参数和默认值是不寻常的。半径对矩形意味着什么?应该有关于初始化质量的争论吗?我建议:

代码语言:javascript
复制
    static const Vec2f& defaultCenter();
    static const Vec2f& defaultSquareDimensions();
    static const Vec3f& defaultColor();

    Rectangle(
        const Vec2f& center = defaultCenter(),
        const Vec2f& widthheight = defaultSquareDimensions(),
        // Assuming rotation angles are supported...
        const Vec2f orientation = defaultOrientation(),
        const Vec3f& color = defaultColor()
    );

和/或可能:

代码语言:javascript
复制
    Rectangle(
        const Vec3f& color,
        const Vec2f& center = defaultCenter(),
        const Vec2f& widthheight = defaultSquareDimensions(),
        // Assuming rotation angles are supported...
        const Vec2f orientation = defaultOrientation()
    );



    inline const Vec2f& getWidthHeight() const {
        return mWidthHeight;
    }

静态方法可以返回每个构造一次的“静态对象”,而不是总是构造新的临时对象。

我不知道以下函数的返回值代表什么。矩形的北向矢量是多少?你能给出不同矩形的例子吗?你能解释一下如何使用返回的向量吗?

代码语言:javascript
复制
    inline Vec2f getDirection(V2D_DIRECTION dir) const {
        switch(dir) {
        case V2D_NORTH:
            return mNorth;

        case V2D_SOUTH:
            return mSouth;

        case V2D_EAST:
            return mEast;

        case V2D_WEST:
            return mWest;

        }
    }

这个好像不见了?

代码语言:javascript
复制
    virtual bool Intersects( const Circle& s ) const;

我们应该有充分的理由不把这些秘密化:

代码语言:javascript
复制
   Vec2f mCenter;

似乎没有理由让它成为一个指针。可能会有争论让它成为康斯特。

代码语言:javascript
复制
   Vec2f mWidthHeight;
   Vec2f mOrientation;

如果矩形倾向于选择较小的颜色,则最好将索引存储到中心的pallette矢量中,或者可能将指针存储到共享颜色池中。

如果他们不改变颜色的话,可能会有一个理由来制造这个const。

代码语言:javascript
复制
   Vec3f mColor;

下面的东西看起来很贵,而且看起来至少部分多余?如果它们是冗余的(可以从一组较小的参数派生),那么您可能应该在存储这些值的代码上运行基准测试,并根据需要动态地计算它们。

代码语言:javascript
复制
private:
   Vec2f mNorth;
   Vec2f mSouth;
   Vec2f mEast;
   Vec2f mWest;
   void InitDirections();

也许有一种更好的方法来表达方向和/或这些其他的价值,在寻找交叉口时更有用。对我来说,考虑更多的NW向量是很奇怪的,但是我还不知道它们是什么意思。

为了加快交叉口的速度,我想您可能还需要存储一个额外的宽度高度,表示边框--最小的x/y对齐矩形,其中包含当前方向的这个矩形。

这在很大程度上取决于实际的相交逻辑如何使用所有这些值。把它们全部储存起来也许是值得的。

CPU与内存的权衡是很难预测的。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/7727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档