2011-04-30 129 views
10

有人可以解釋爲什麼負面大小的Rectangle與他們的方式相交?負尺寸矩形如何相交?

var r = new Rectangle(0, 0, 3, 3); 
var r0 = new Rectangle(0, 0, -1, -1); 
var r1 = new Rectangle(1, 1, -1, -1); 
var r2 = new Rectangle(2, 2, -1, -1); 
var r3 = new Rectangle(3, 3, -1, -1); 

System.Console.WriteLine(r.IntersectsWith(r0)); // False 
System.Console.WriteLine(r.IntersectsWith(r1)); // False 
System.Console.WriteLine(r.IntersectsWith(r2)); // True 
System.Console.WriteLine(r.IntersectsWith(r3)); // False 

我想r1r2應始終r相交,即使他們不這樣做。如果你考慮它們的負尺寸,r3應該相交。如果不考慮負尺寸,r0應該相交。

爲什麼這樣工作,以及在使用Rectangle結構時應該注意哪些其他注意事項?

+0

我不知道...我猜IntersectsWith的行爲對於負尺寸的矩形是未定義的,雖然它沒有在[API]中記錄(http://msdn.microsoft.com/zh-cn/ library/y10fyck0.aspx)...我建議你將此問題作爲「社區內容」發佈到MSDN?這是一個非常好的問題。有人懷疑,對於所有那些空間操作,沒有定義負尺寸Rectangle的行爲......它們是否按照您預期的那樣渲染? – corlettk 2011-04-30 08:30:00

+1

@corlettk:「社區內容」是**不適用於發佈問題。這就是MSDN論壇的目的。 – 2011-04-30 08:59:28

+0

Thanx科迪。我從來沒有使用過MSDN的論壇;-) – corlettk 2011-04-30 09:49:48

回答

8

如果您創建一個具有負寬度的矩形,那麼它將繪製一個矩形,該矩形從原始(x,y)點開始,向左而不是向右繪製。

如果您創建一個具有負高度的矩形,則會繪製一個矩形,該矩形從原始(x,y)點開始並向上而不是向下繪製。因此,如果你製作一個帶有說明new Rectangle(5, 4, -1, -2);的矩形,那麼你將得到一個帶有以下幾點的矩形:(5,4),(4,4),(5,2),(4,2)。

運行下面的代碼爲例:

Rectangle negWidthHeightRect = new Rectangle(5, 4, -1, -2); 
    Console.WriteLine(negWidthHeightRect.Left); 
    Console.WriteLine(negWidthHeightRect.Right); 
    Console.WriteLine(negWidthHeightRect.Bottom); 
    Console.WriteLine(negWidthHeightRect.Top); 
    Console.WriteLine(negWidthHeightRect.Width); 
    Console.WriteLine(negWidthHeightRect.Height); 
    Console.ReadLine(); 

輸出如下:

5 
4 
2 
4 
-1 
-2 

行爲在一定程度上有望給微軟的其他矩形狀的控制意見(除了系統。 Drawing.Rectangle)。請參閱MSDM here

現在,爲什麼矩形的IntersectsWith方法產生這樣奇怪的結果。這是因爲它是使用下面的代碼實現的IntersectsWith方法:

public bool IntersectsWith(Rectangle rect) 
{ 
    return ((((rect.X < (this.X + this.Width)) && (this.X < (rect.X + rect.Width))) && (rect.Y < (this.Y + this.Height))) && (this.Y < (rect.Y + rect.Height))); 
} 

如果按照通過自己的邏輯,你會明白,你爲什麼讓你得到答案。什麼微軟或許應該做的是兩種:

1),當它看到一個負寬度/高度使寬度/高度積極調整左/頂

2),或在IntersectsWith邏輯,他們應該做一些Min(x,x + width)和Min(y,y + width)在執行邏輯時。

其他比我聰明的人可能有更聰明的方式來做到這一點。

+0

相同 – jonsca 2011-04-30 13:51:18

0

查看this question的答案的第一條評論。它似乎是說,負高度和寬度表示在當前座標的上方和左側的象限中繪製的矩形。

+0

這意味着'Rectangle(0,0,-x,-x)'和'Rectangle(-x,-x,x,x)'是一樣的。 – 2011-04-30 08:34:02

+0

@丹D.對我來說這是真的。對我來說,這甚至是有效的投入,這讓我感到驚訝。他們在那個答案中談到了「ScreenToClient」和「ClientToScreen」(我個人並沒有很多經驗),這使我相信它是他們內部詭計的一部分。 – jonsca 2011-04-30 08:37:36

+0

@Dan D.這是否意味着'Rectangle(1,1,-1,-1)'與'Rectangle(0,0,1,1)'相同?如果是這樣,它應該仍然與'r'相交。 – dlras2 2011-04-30 08:41:15