#wolfram-mathematica #distance #norm #cartesian
#wolfram-mathematica #расстояние #норма #Декартово
Вопрос:
Анализируя движения глаз на экране, я устанавливаю начало координат в его нижнем левом углу (в этот момент его трудно изменить).
Пытаясь вычислить расстояние между некоторыми точками и центром экрана, я использую простую формулу, показанную ниже. Проблема в том, что при использовании этого в условном выражении получается некрасиво.
Sqrt[
(
(fixationX - centerX)^2 (fixationY - centerY)^2
)
]
Есть ли способ настроить Norm для вычисления расстояния между точками, а не между точкой и началом координат?
Или в моем случае установить начало координат в «центре» текущей системы координат?
Ответ №1:
Небольшое изменение метода Саймона заключается в использовании значения по умолчанию в функции, а не глобальной переменной ( $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]
Изменение центра по умолчанию:
SetOptions[myNorm2, Center -> {8, 8}];
myNorm2[{5, 7}]
Sqrt[10]
Комментарии:
1. @500 всегда пожалуйста. Пожалуйста, смотрите мой обновленный ответ для другого метода.
2. Я допустил точно такую же ошибку, которая была у вас с
Default
в вашей первой версии. Я так далеко продвинулся в проекте, прежде чем заметил, что просто поместил комментарий об этом вверху, в котором говорилось"if you change $xyz, you need to redefine the following..."
!3. @Simon если это коснулось нас обоих, я собираюсь задать вопрос по этому поводу. Тот факт, что
DefaultValues[f]
изменения без эффекта сбивают с толку.4. Да, это может быть «ошибка». Вы можете видеть, почему
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]
Комментарии:
1. Спасибо, я опубликовал это до того, как увидел ваше электронное письмо, я мог бы подождать с реализацией теперь, когда моя функция работает!
2. @500, получаешь поддержку по электронной почте и от Саймона, да? Хотел бы я, чтобы у меня была такая поддержка, какую вы получали, когда я изучал Mathematica. 🙂
3. @Mr. Wizard, Серьезно, это потрясающе, эта щедрость и опытность придали мне мотивации! Я скоро пришлю вам свой блокнот в надежде, что он вам понравится!
4. @500 Спасибо, я уверен, что сделаю. Если вы уже видели мой ответ ниже, обратите внимание, что я только что изменил его. Я допускаю ошибку, так как давно не использовал
Default
. Я тоже (пере) учусь.