2011-06-12 143 views
5

分析屏幕上的眼球運動,我將其起點設置在它的左下角 (難以在此處修改)。Mathematica中的直角座標系中的計算距離

試圖計算一些點與屏幕中心之間的距離我使用下面顯示的簡單公式。 問題是,在條件語句中使用它會變得很難看。

Sqrt[ 
(
(fixationX - centerX)^2 + (fixationY - centerY)^2 
) 
] 

有沒有一種方法可以自定義Norm來計算點之間的距離而不是點與原點之間的距離?

或者在我的情況下,將原點設置在當前座標系的「中心」?

回答

4

西蒙的方法的細微變化是在函數使用一個默認值,而不是一個全局變量($Center)。

假設你的默認原點是(5,5),則:

myNorm[pos:{_, _}, center_:{5, 5}] := EuclideanDistance[pos, center] 

注意使用_:{5, 5}定義默認值。

現在你可以這樣做:

myNorm[{5, 7}] 

(* Out[]= 2 *) 

或臨時使用不同的中心與:

myNorm[{5, 7}, {8, 8}] 

(* Out[]= Sqrt[10] *) 

對於這個簡單的功能,你可以在第二種情況下使用EuclideanDistance代替,但我希望你可以看到這種方法的效用是更復雜的定義myNorm

該方法的缺點是不能輕易更改默認中心。


這的確讓人們輕易地更改默認的中心,但更詳細的另一個變化,是使用Options

Options[myNorm2] = {Center -> {5, 5}}; 

myNorm2[pos : {_, _}, OptionsPattern[]] := 
EuclideanDistance[pos, OptionValue[Center]] 

語法是:

myNorm2[{5, 7}] 

myNorm2[{5, 7}, Center -> {8, 8}] 
2
Sqrt[10]

更改默認的c輸入:

SetOptions[myNorm2, Center -> {8, 8}]; 

myNorm2[{5, 7}] 
Sqrt[10]
+0

@ 500不用客氣。請參閱我的更新的答案另一種方法。 – 2011-06-12 22:46:28

+0

我在第一個版本中用'Default'完成了同樣的錯誤。在我注意到我剛纔在頂部發表評論時說:「如果更改$ xyz,則需要重新定義以下內容......」! – Simon 2011-06-13 23:01:18

+0

@Simon如果它有我們兩個,我會發佈一個關於這個問題。 「DefaultValues [f]」沒有效果而改變的事實令人困惑。 – 2011-06-13 23:45:29

4

可你只需要使用EuclideanDistance

In[1]:= EuclideanDistance[{x,y}, {cx,cy}] 
Out[1]= Sqrt[Abs[-cx +x ]^2 + Abs[-cy + y]^2] 

或定義$Center和新CNorm,例如

$Center = {cx, cy}; 
CNorm[pos:{x_, y_}] := EuclideanDistance[pos, $Center] 
+0

謝謝你,我張貼在此之前,我看到您的電子郵件,我可能會等到現在,我的功能配合,可以實現! – 500 2011-06-12 14:28:30

+0

@ 500,從西蒙得到電子郵件支持,呃?我希望在學習Mathematica時獲得您的支持。 :-) – 2011-06-12 22:03:54

+0

@Mr精靈,嚴肅地說,這真是太神奇了,這種慷慨和專業知識爲我激勵了動力!我很快就會寄給你我的筆記本,希望你能喜歡! – 500 2011-06-12 22:07:36