2011-06-12 4 views
5

Analyse des mouvements oculaires sur un écran, je mets mon origine dans le coin inférieur gauche de celui-ci (Difficile de modifier à ce moment-là).distance Calculer en coordonnées cartésiennes dans Mathematica

Essayer de calculer la distance entre certains points et le centre de l'écran J'utilise la formule simple affichée ci-dessous. Le problème est que l'utilisation de cette condition dans la déclaration, il devient laid. Y at-il un moyen de personnaliser Norm pour calculer la distance entre les points et non entre un point et l'origine?

Ou dans mon cas, définissez l'origine pour être au « centre » du système de coordonnées actuel?

Répondre

4

Une légère variation de la méthode de Simon est d'utiliser une valeur par défaut dans la fonction, au lieu d'une variable globale ($Center).

Supposons que votre origine par défaut est (5, 5), puis:

myNorm[pos:{_, _}, center_:{5, 5}] := EuclideanDistance[pos, center] 

Notez l'utilisation de _:{5, 5} pour définir la valeur par défaut.

Maintenant, vous pouvez faire:

myNorm[{5, 7}] 

(* Out[]= 2 *) 

Ou utiliser temporairement un autre centre avec:

myNorm[{5, 7}, {8, 8}] 

(* Out[]= Sqrt[10] *) 

Pour cette fonction simple, vous pouvez utiliser EuclideanDistance dans le second cas au contraire, mais j'espère vous pouvez voir l'utilité de cette méthode était la définition de myNorm plus complexe.

L'inconvénient de cette méthode est que vous ne pouvez pas changer facilement le centre par défaut.


Une autre variante qui ne permet un de changer facilement le centre par défaut, mais est plus prolixe, est d'utiliser Options:

Options[myNorm2] = {Center -> {5, 5}}; 

myNorm2[pos : {_, _}, OptionsPattern[]] := 
EuclideanDistance[pos, OptionValue[Center]] 

syntaxe est:

myNorm2[{5, 7}] 

myNorm2[{5, 7}, Center -> {8, 8}] 
2
Sqrt[10]

Modification de la valeur par défaut c entrez:

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

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

@ 500 vous êtes les bienvenus. S'il vous plaît voir ma réponse mise à jour pour une autre méthode. –

+0

J'ai fait exactement la même erreur que vous avez eu avec Default dans votre première version. J'étais si loin dans le projet avant que je remarque que je viens de mettre un commentaire à ce sujet en haut qui disait "si vous changez $ xyz, vous devez redéfinir ce qui suit ..." '! – Simon

+0

@Simon si nous avons tous les deux, je vais poser une question à ce sujet. Le fait que 'DefaultValues ​​[f]' change sans effet est confus. –

4

Pouvez-vous utiliser juste EuclideanDistance

In[1]:= EuclideanDistance[{x,y}, {cx,cy}] 
Out[1]= Sqrt[Abs[-cx +x ]^2 + Abs[-cy + y]^2] 

Ou définir un $Center et un nouveau CNorm, par exemple

$Center = {cx, cy}; 
CNorm[pos:{x_, y_}] := EuclideanDistance[pos, $Center] 
+0

Merci, j'ai posté avant que j'ai vu votre e-mail, je pourrais attendre pour mettre en œuvre maintenant qui fonctionne ma fonction! – 500

+0

@ 500, obtenir le soutien de courrier électronique de Simon aussi, hein?J'aurais aimé avoir le genre de soutien que vous avez reçu en apprenant Mathematica. :-) –

+0

@Mr Wizard, Sérieusement, c'est incroyable, cette générosité et cette expertise m'ont motivé! Je vous enverrai bientôt mon cahier avec l'espoir que vous l'aimerez! – 500

Questions connexes