【问题标题】:Compute distance in Cartesian Coordinate System in Mathematica在 Mathematica 的笛卡尔坐标系中计算距离
【发布时间】:2011-06-12 14:10:42
【问题描述】:

分析屏幕上的眼球运动,我将原点设置在屏幕的左下角 (当时很难修改)。

尝试计算一些点与屏幕中心之间的距离,我使用下面显示的简单公式。 问题是在条件语句中使用它会变得很丑。

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

有没有办法自定义 Norm 来计算点之间的距离而不是点与原点之间的距离?

或者在我的情况下,将原点设置在当前坐标系的“中心”?

【问题讨论】:

    标签: wolfram-mathematica distance norm cartesian


    【解决方案1】:

    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}]
    
     平方[10]

    【讨论】:

    • @500 不客气。请参阅我的更新答案以了解另一种方法。
    • 我在第一个版本中犯了与Default 完全相同的错误。在我注意到我刚刚在顶部写了一条关于它的评论之前,我在这个项目中走了这么远,上面写着"if you change $xyz, you need to redefine the following..."
    • @Simon 如果它得到了我们俩,我将发布一个关于此的问题。 DefaultValues[f] 更改而没有效果的事实令人困惑。
    • 是的,它可能是一个“错误”。您可以看到为什么 f[a_:$d] := ... 定义不会关心更改 $d。但是,仅查看 Default[g]=$d ; g[a_.] := ... 的下降值并不能说明为什么更改 Default[g]$d 没有任何效果。
    【解决方案2】:

    你能用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,也得到了 Simon 的电子邮件支持,嗯?我希望我在学习 Mathematica 时能得到您的支持。 :-)
    • @Mr Wizard,说真的,这太棒了,这种慷慨和专业知识激发了我的动力!我会尽快把我的笔记本寄给你,希望你会喜欢!
    • @500 谢谢,我相信我会的。如果您已经在下面看到我的答案,请注意我刚刚更改了它。我犯了一个错误,因为我有一段时间没有使用Default。我也在(重新)学习。
    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多