Вычислить расстояние в декартовой системе координат в Mathematica - PullRequest
5 голосов
/ 12 июня 2011

Анализируя движения глаз на экране, я установил источник в нижнем левом углу экрана. (Трудно изменить в этот момент).

Пытаясь вычислить расстояние между некоторыми точками и центром экрана, я использую простую формулу, показанную ниже. Проблема в том, что, используя это в условном выражении, это становится уродливым.

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

Есть ли способ настроить Norm для вычисления расстояния между точками, а не между точкой и началом координат?

Или в моем случае установить начало координат в "центр" текущей системы координат?

Ответы [ 2 ]

4 голосов
/ 13 июня 2011

Небольшой вариант метода Саймона заключается в использовании значения по умолчанию в функции, а не глобальной переменной ($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}]
<b>   2</b>
<b>   Sqrt[10]</b>

Изменение центра по умолчанию:

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

myNorm2[{5, 7}]
<b>   Sqrt[10]</b>
4 голосов
/ 12 июня 2011

Можете ли вы просто использовать 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]
...