我想知道是否有这样一种非常基本的方法来了解翻译对象在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;
}
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();
}
}
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
坐标的正确(高效,干净的代码)方法是什么?
希望你明白我的意思。