2011-06-12 140 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