在Mathematica中计算笛卡尔坐标系中的距离

5
分析屏幕上的眼动,我将其原点设置为左下角(此时很难进行修改)。
尝试计算某些点与屏幕中心之间的距离,我使用下面显示的简单公式。问题是,在条件语句中使用它会变得很丑陋。
Sqrt[
(
(fixationX - centerX)^2 + (fixationY - centerY)^2
)
]

有没有一种方法可以自定义Norm来计算点与点之间的距离,而不是点与原点之间的距离?
或者在我的情况下,将原点设置为当前坐标系的“中心”?
2个回答

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]

谢谢,我在看到你的电子邮件之前就发布了这个帖子,现在我的函数可以工作了,所以我可能会等一下再实施! - 500
@500,还能从Simon那里得到电子邮件支持?我在学习Mathematica的时候也希望有你这样的支持。 :-) - Mr.Wizard
@Mr Wizard,说真的,这种慷慨和专业知识让我充满了动力!我很快会把我的笔记本发送给您,希望您会喜欢它! - 500
@500 谢谢,我肯定会的。如果你已经看到了我的下面的回答,请注意我刚刚进行了更改。我犯了一个错误,因为我有一段时间没有使用“Default”了。我也在重新学习。 - Mr.Wizard

4

Simon方法的一个小变化是在函数中使用默认值,而不是全局变量($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
根号10

更改默认中心:

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

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

@500 不用谢。请看我的更新答案,另有一种方法。 - Mr.Wizard
我犯了你在第一个版本中关于“Default”的完全相同的错误。在我注意到之前,我已经在项目中进行了很长时间,所以我只是在顶部放了一个注释,上面写着“如果您更改$xyz,则需要重新定义以下内容...”! - Simon
@Simon 如果这个问题困扰了我们两个,我会发一个关于这个问题的提问。DefaultValues[f] 改变但没有效果的事实很令人困惑。 - Mr.Wizard
是的,这可能是一个“bug”。你可以看出为什么 f[a_:$d] := ... 的定义不会关心改变 $d。但是仅仅查看 Default[g]=$d ; g[a_.] := ... 的 downvalues 并没有理由说明改变 Default[g]$d 之一没有影响。 - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接