处理2D空间中的矩形坐标

时间:2013-12-29 05:21:04

标签: c++ opengl c++11 matrix coordinates

我想知道是否有这样一种非常基本的方法来了解翻译对象在2D空间中的确切位置。我想澄清一下我对OpenGL矩阵的看法。

请有时间看看这几个代码示例:

class Rectangle
{
public:

    //this function does amazing magic!
    //..so continue reading
    void draw();

    inline bool contains(int x, int y) const {
        return  x >= this->x && x <= this->x + width &&
                y >= this->y && y <= this->y + height;
    }

    int x;
    int y;
    uint32_t width;
    uint32_t height;
protected:

    std::vector<Rectangle *> children;
}

解决方案#1

void Rectangle::draw()
{
    glPushMatrix();
        glTranslatef(x, y, 0);
        ...
    //popped out the previous matrix so I have a fresh one
    glPopMatrix();

    //outside the matrix of parent
    //not logical (?)
    for (auto &i : children)
    {
        i->draw();
    }
}

解决方案#2

void Rectangle::draw()
{
    glPushMatrix();
        glTranslatef(x, y, 0);
        ...
        //inside the matrix of parent
        //good! the origin now is parent's coordinate.
        for (auto &i : children)
        {
            //previous matrix is not popped out so the origin is parent's (x,y)
            i->draw();
        }
    glPopMatrix();
}

解决方案#1 中,找到每个Rectangle::children的坐标很简单,很容易,但是,很难管理代码,对我来说这不是一个明显的选择因为那些Rectangle::children的原点位置必须是它们的父容器,对吗?

另一方面,我更喜欢解决方案#2 ,这是一个明显的选择,因为对于我将创建的每个孩子,他们的起源将是父母的位置。但是,我很难管理这些Rectangle::children的坐标。例如,我希望在某些hover effect上应用Rectangle::children,我会在实现#1 中执行此操作:

  • 解决方案#1

    for (auto &i : children)
    {
        if (i->contains(mouse().x, mouse().y)
        {
            //hover effect!
        }
    }
    
  • 解决方案#2

    for (auto &i : children)
    {
        if (i->contains(mouse().x - this->x, 
                        mouse().y - this->y)
        {
            //hover effect!
        }
    }
    

我真正关心的主要问题是我希望Rectangle类中有一个固定的函数,例如isHovering()这将接受 0个参数和我希望它是cv-qualified。这将做的是:将检查鼠标光标是否在矩形内。

如果我在这里实现解决方案#2,我想我会搞乱这个函数的代码。你怎么看?有没有很好的方法存在那里我还不知道?在我继续前进之前,我想先问一下。

或者......在绘图功能中有一个existing magic way能够实现这个目标吗?

感谢阅读!

更新

假设我想要实现的绘图层次是这样的:

glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();

    //one matrix for every parent-rectangle and its child-rectangle component
    xPushMatrix();

        //parent
        glTranslatef(parent.x, parent.y, 0);
        glDrawables();

        //children
        glTranslatef(child.x, child.y, 0);
        glDrawables();
        ...to N child

    xPopMatrix();


xSwapBuffers(window);
xPollEvents();

问题:找到Rectangle::children坐标的正确(高效,干净的代码)方法是什么?

希望你明白我的意思。

0 个答案:

没有答案