2010-03-25 61 views
2

在二維整數空間中,您有兩個點A和B.此函數返回由A和B界定的四邊形子集中點的枚舉。這個幾何函數的名字是什麼?

A = {1,1} B = { (A,B)= {{1,1},{1,2},{1,3},{2,1},{2,2},{2,3}}} }}

我可以在幾行LINQ中實現它。

private void UnknownFunction(Point to, Point from, List<Point> list) 
{ 
    var vectorX = Enumerable.Range(Math.Min(to.X, from.X), Math.Abs(to.X - from.Y) + 1); 
    var vectorY = Enumerable.Range(Math.Min(to.Y, from.Y), Math.Abs(to.Y - from.Y) + 1); 
    foreach (var x in vectorX) 
     foreach (var y in vectorY) 
      list.Add(new Point(x, y)); 
} 

我很確定這是一個標準的數學運算,但我不知道它是什麼。 隨時告訴我,這是您選擇的語言中的一行代碼。或者給我一個lambdas或者其他類似的狡猾的實現。

但大多我只是想知道它是什麼。這讓我瘋狂。 這感覺有點像卷積,但是自從我在學校爲我確定的時間太長了。

+0

技術上(達到http://en.wikipedia.org/wiki/Integer_points_in_convex_polyhedra名稱相似),這是一個丟番圖問題。然而,由於這個特定問題的非常有限的(即相互之間的值總是<= 1)和正交性,它可以用輸入點的笛卡爾乘積來解決。儘管它變大了,你將不得不使用更通用的解決方案。 – RBarryYoung 2010-03-26 04:46:13

回答

5

這是套{1,2}{1,2,3}Cartesian product在具體的例子,或通常在你的代碼示例中的vectorXvectorY的笛卡爾乘積。

+1

但它具體*不是* {1,1},{2,3}'的笛卡爾乘積,還是它? – Tomalak 2010-03-25 02:10:22

+1

嗯,我想嚴格來說它的笛卡兒積{VectorX-> X ... VectorY-> X} * {VectorX-> Y ... VectorY-> Y},但這可能不是你所要的尋找 – LorenVS 2010-03-25 02:44:44

+0

那麼,我知道它至少有一部分是有名字的。名字不太好。 – Spike 2010-03-25 03:39:56

1

我不知道這是一個標準的數學運算,如果你想在數學上描述它,它將被描述爲這樣。

在N^2中給出了兩個點(x_1,x_2)和(y_1,y_2)。然後以min_1爲min(x_1,y_1),max_1爲max(x_1,y_1),min_2和max_2爲對稱運算。然後該組被定義爲:

枚舉= {(A,B):A,B在N^2和MIN_1 < =一個< = max_1和min_2 < = B < = max_2}

這似乎對我來說非常隨意,我會說它對我來說似乎不是一個相當標準的數學運算。

使用笛卡爾積解決它變得更棘手。當你有很接近的點時,使用笛卡爾積很簡單,但當你有{1,1}和{8,8}時,怎麼辦?然後這個問題就會涉及更多一點。你把兩組:

{A:分鐘(X_1,Y_1)< =一個< = MAX(X_1,Y_1)}和{B:分鐘(X_2,Y_2)< = B < = MAX(X_2, y_2)}

在這兩種情況下,您只需將範圍內的所有值和整個空間枚舉即可。再一次,這感覺像是一個任意的操作,也許我錯了,但我不認爲這有一個衆所周知的名字。除了枚舉矩形中的點。

+0

我認爲這是問題的笛卡爾積的一部分,讓我想到「我正在做的這件事有一個名字」。可能不是整個過程。謝謝。 – Spike 2010-03-25 06:32:53

1

邊界/矩形中的整數/格點。

使用

1

笛卡爾乘積

列表內涵Python的

[(x,y) for x in [1,2] for y in [1,2,3] ] 

和Haskell

[(x,y) | x <- [1,2] , y <- [1,2,3] ] 
+0

是的,想通了。 – Spike 2010-03-25 12:06:41