簡體   English   中英

將矩形定義為兩點或原點/大小?

[英]Define rectangle as two points or origin / size?

這是一個在我的職業生涯中多次出現的問題,它把我和我的同事分成了兩個陣營。 我認為最好在這個網站上一勞永逸地回答這個問題。

幾乎所有圖形 UI 庫都實現了 Rectangle 結構,但它們的實現方式通常分為兩種可能的選擇:

  1. 矩形被定義為同一坐標系中的兩個二維點,通常命名為 p0 和 p1,或者具有單獨的分量,如 x0、y0、x1、y1。
  2. 矩形被定義為二維原點和大小向量,通常命名為 position 和大小,或者單獨命名為 x、y、寬度、高度。

現在,假設我要編寫一個 UI 庫,我應該選擇這兩個選項中的哪一個?

更新:問題涉及實現,而不是接口。 當然,矩形的接口可以很好地支持這兩種方法,但是如何在矩形內存儲數據呢?

為什么不兩者都選?

真的,唯一重要的是你的庫和它的內部之間的接口。 或者,您的用戶將如何使用圖書館。 您可以隨心所欲地存儲矩形的信息,但是應該將其封裝在遠離用戶的地方,這樣他們就不必擔心矩形的存儲方式,只需知道它確實是一個矩形即可。

換句話說,如果您正在編寫面向 object 的代碼,那么在選擇兩者時,您可以根據需要存儲矩形,然后讓您的用戶使用任一方法創建一個矩形。

例如,您的聲明可能如下所示:

class Rectangle
{
public:
    Rectangle(Point p1, Point p2);
    Rectangle(Point origin, int width, int height);
    ...
};

(C++,因為你標記了它)

其中 Point 是一些 class:

class Point
{
public:
    Point(int x, int y) : mX(x), mY(y) {}
private:
    int mX;
    int mY;
};

這樣,您的庫不限於僅支持一種用於創建矩形的規范。

就具體實施而言,這真的無關緊要。 它們都可以工作並且可以很容易地相互轉換並使用相同數量的 memory,因此使用其中一個不會對性能產生重大影響。

為了簡化開發,請考慮矩形的用例。 查看您需要為 class 編寫的每個成員 function 並考慮哪種格式可以更輕松地編寫這些函數。

如果是我,我可能會用這兩個點來實現它。

編輯:為什么我認為以任何一種方式實施它在大多數情況下都沒有任何區別的學術方法。

假設有一個成員 function 或對我們的矩形 class 的操作確實對我們的矩形起作用或進行一些計算。 假設一種實現方法(寬度/高度/原點或兩點)將比其他實現更快地執行此操作。

我們可以使用以下方法從實現寬度/高度/原點轉換:

// 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) 運行時間內轉換為其他實現,因此其他實現不會第一個實現好多少。

除非您每秒執行此操作數千次或在性能極其受限的設備上,否則我堅信不會有性能差異。 已經沒有 memory 差異,因為這兩種實現幾乎只存儲 4 個浮點數/整數。

這幾乎留下了編碼的便利性,就像我在上面的原始帖子中所說的那樣,您可以簡單地“考慮矩形的用例是什么。看看每個成員 function,您需要為該 class 編寫並思考關於哪種格式會使編寫這些函數更容易。”

毫無疑問,這當然完全取決於您面臨的問題。

對於圖形繪制算法,第二個選項似乎有一個非常小的優勢恕我直言。 而對於在歐幾里德平面上定義的一般“幾何”算法 - 第一個選項更方便一些。

此外,有一次我正在研究一種在地球表面定義的算法。 意思是,x,y坐標分別代表經度/緯度。 x坐標顯然是循環的。 在這種特定情況下,為了定義(某種)矩形 - 僅定義角是不夠的,您還需要一個方向 這可以通過第一個點 (p0) 是最左邊的點,而第二個點 (p1) - 最右邊的約定來處理。 但我更喜歡切換到第二個約定,在那里你自然有一個角和一個偏移向量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM