2012-08-31 30 views
-2

我需要生成一組唯一座標(A1,B1)和(A2,B2),其值介於0和1之間。唯一座標不能位於由sql查詢返回的現有座標集([x1],[y1])和([x2],[y2])之間。我如何使用C#編寫腳本來生成座標:1)不在查詢返回的值之間,2)不等於查詢返回的值?生成沒有重複且不在一組現有座標之間的隨機座標C#

這裏的邏輯基本上用來在頁面上繪製一組框。我需要繪製具有唯一座標的新框,但這些新框不能重疊,或者位於現有框內。任何幫助是極大的讚賞!

+4

您是否嘗試過使用'> ='和'<='? – dtb

+0

箱子都是一樣的大小,還是隨機的呢? – ja72

+0

框的大小是隨機的,只要它不與現有框重疊 – user1639410

回答

0

這個工程的約99.99%左右...

void GenerateTest() 
    { 
     float x1, y1; 
     float x2, y2; 
     // fill x1,y1,x2,y2 

     var r = new Random(); 
     Func<float> next =() => (float)r.NextDouble(); 

     var NotMatchingRect = RectangleF.FromLTRB(x1,y1,x2,y2); 
     var Coordinates = Enumerable.Range(0, 1000).Select(i => new PointF(next(), next())).Where(p => !NotMatchingRect.Contains(p)).Distinct().Take(2).ToArray(); 
     if (Coordinates.Length != 2) 
      throw new IndexOutOfRangeException(); 
    } 
+0

如何集成我的查詢:從表 中選擇不同的X1,Y1,X2,Y2 其中實例化= n和X1!= 0和Y1!= 0和X2!= 1和Y2!= 1 – user1639410

0

假設隨機的存在,隨機命名爲方便起見,你可以做...

do 
{ 
A1 = randomizer.NextDouble(); 
B1 = randomizer.NextDouble(); 
} while(!((A1>=X1&&A1<=X2&&B1>=Y1&&B1<=Y2)||(A1>=X2&&A1<=X1&&B1>=Y2&&B1<=Y1)) //not inside other rectangle 

do 
{ 
A2 = randomizer.NextDouble(); 
B2 = randomizer.NextDouble(); 
} 
while(!((A1==A2&&B1==B2)|| //not equal to other random coordinate 
(A2>=X1&&A2<=X2&&B2>=Y1&&B2<=Y2)|| 
(A2>=X2&&A2<=X1&&B2>=Y2&&B2<=Y1)|| //not inside other rectangle 
(A1<=X1&&A2>=X2&&B1<=Y1&&B2>=Y2)|| 
(A1<=X2&&A2>=X1&&B1<=Y2&&B2>=Y1)|| 
(A2<=X1&&A1>=X2&&B2<=Y1&&B1>=Y2)|| 
(A2<=X2&&A1>=X1&&B2<=Y2&&B1>=Y1)||)) //not containing other rectangle 

這是一個有點(讀:非常非常)cludgy(我實際上有點尷尬),但它應該工作,並最終生成所有可能的隨機矩形。

+0

我已經有類似的東西了,我想我遇到的問題是參數化while語句, SQL datareader結果到C#。 X1,Y1,X2,Y2都是查詢返回的列名。即如果X1 = {2,4,6} Y1 = {1,3,5} X2 = {3,5,8},Y2 = {2,4,6}。我的x1_rand和x2_rand不能在{2,3} U {4,5} U {6,8}之間,我的y1_rand和y2_rand不能在{1,2} U {3,4} U {5,6} – user1639410

+0

之間那麼,你可以使用任何數量的東西。如果您已經使用SQLDataReader,最簡單的方法可能是設置一個字典。在這裏,這更詳細http://stackoverflow.com/a/1504989/1623719 – Sconibulus

+0

感謝您的幫助! – user1639410