2013-11-09 51 views
1

我有一个名为Rectangle的类,它是一个二维形状,原点位于其中心。 Vec2f是一个float二维向量。调整任意原点的矩形形状大小

struct Rectangle { 
    Vec2f position, halfSize; 
    float getTop() { return position.y - halfSize.y; } 
    float getBottom() { return position.y + halfSize.y; } 
    // ... getLeft(), getRight(), ... 
    void setWidth(float mWidth) { halfSize.x = mWidth/2.f; } 
    // ... setHeight(), setHalfWidth(), ... 
}; 

将尺寸调整为Rectangle::setWidth显然将原点保持在中心位置。但是,我需要从不同的点任意调整矩形的大小。示例:我想从右下角调整矩形大小,以左上角为原点。

理想的API将是这样的:

Rectangle rect; 
rect.resizeFrom(rect.getTopLeft(), Vec2f{150.f, 45.f}); 
//   ^new origin  ^new size 

我的问题是:我怎么能任意选择一个原点,而调整的矩形?我显然需要执行翻译和调整大小(考虑实际原点是矩形的中心),但我无法找到适用于每个任意原点的正确组合。

回答

0

我建议使用OpenGL,

反正我的建议是,

resizeFrom(FROM, Vec2f){ 
    resize in the normal way 
    getTop(), getBottom(), etc.. //get all new corner positions 
    Difference = FROM-newLeftCorner 
    Move all corner positions according to the Difference 
    commit 
} 

我希望我清楚

+0

@vit工作的呢? – Esqarrouth

+0

它似乎工作,但它并没有解决我原来的问题:我想从底部调整一个矩形*(想想快门)*:顶部的Y坐标应该保持不变,而应该改变的只是底部Y坐标。 –

+0

要做到这一点,你可能需要一个完整的重组,其中不可能说没有看到完整的代码说。 如果在所有计算完成之前未显示新矩形,则执行此操作的方式可能无关紧要 – Esqarrouth