为什么不两者兼备呢?
实际上,唯一重要的是你的库和其内部之间的接口。或者说,你的用户将如何使用该库。你可以按照任何方式存储矩形的信息,但应将其封装在远离用户的地方,以便他们不必担心如何存储他们的矩形,只需要知道它确实是一个矩形。
换句话说,如果你正在编写面向对象的代码,可以按照自己的方式存储矩形,然后让用户使用两种方法之一创建矩形。
例如,你的声明可能会像这样:
class Rectangle
{
public:
Rectangle(Point p1, Point p2);
Rectangle(Point origin, int width, int height);
...
};
(由于您标记了C ++),
其中Point是某个类:
class Point
{
public:
Point(int x, int y) : mX(x), mY(y) {}
private:
int mX;
int mY;
};
这样,您的库不仅支持创建矩形的一种规范类型。至于具体实现,其实并不重要。它们都可以工作,并且可以轻松地相互转换并使用相同的内存,因此在使用其中一种而不是另一种时不会有任何主要性能影响。
为了简化开发,请考虑矩形的用例。查看每个类需要编写的成员函数,并考虑哪种格式将使编写这些函数更容易。
如果我是您,我可能会使用两个点来实现。
编辑:从学术角度来看,我认为在大多数情况下,使用任何一种实现方式都不会有太大区别。
假设我们的Rectangle类有一个成员函数或操作,用于对矩形进行操作或进行某些计算。假设一种实现方法(宽度/高度/原点或两个点)比另一种实现方法执行此操作快得多。
我们可以通过以下方式从宽度/高度/原点实现进行转换:
// assuming x0,y0 is top left and x1,y1 is bottom right
x0 = originX;
y0 = originY;
x1 = originX + width;
y1 = originY + height;
我们可以使用以下方法将实现的两个点进行转换:
// assuming x0,y0 is top left and x1,y1 is bottom right
originX = x0;
originY = y0;
width = x1 - x0;
height = y1 - y0;
因此,执行此操作速度/效率比另一种实现要慢/差得多的实现可以在O(1)运行时间内转换为另一种实现,因此其他实现不能比第一种实现好太多。
除非您每秒执行此操作数千次或在性能非常有限的设备上执行此操作,否则我非常确定不会有性能差异。由于两种实现基本上只存储4个浮点数/整数,因此已经没有任何存储器差异。
这几乎只剩下编码方便性了,就像我在我的原始帖子中所说的那样,你可以简单地“考虑你的矩形使用情况。查看你需要编写的每个成员函数并考虑哪种格式会使编写这些函数更容易。”