2011-06-12 15 views
5

Analizando los movimientos de los ojos en una pantalla, configuré mi origen en la esquina inferior izquierda (Difícil de modificar en ese punto).Calcular la distancia en el Sistema de coordenadas cartesianas en Mathematica

Tratando de calcular la distancia entre algunos puntos y el centro de la pantalla utilizo la fórmula simple que se muestra a continuación. El problema es que al usar esto en una declaración condicional, se pone feo.

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

¿Hay alguna manera de personalizar la norma para calcular la distancia entre puntos y no entre un punto y el origen?

¿O en mi caso, establezca el origen para estar en el "centro" del sistema de coordenadas actual?

Respuesta

4

Una ligera variación del método de Simon es usar un valor por defecto en la función, en lugar de una variable global ($Center).

Suponga que su origen por defecto es (5, 5), a continuación:

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

Aviso el uso de _:{5, 5} para definir el valor por defecto.

Ahora se puede hacer:

myNorm[{5, 7}] 

(* Out[]= 2 *) 

O utilizar temporalmente un diferente el centro con:

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

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

Para esta función sencilla, se puede usar EuclideanDistance en el segundo caso en su lugar, pero espero se puede ver la utilidad de este método fue la definición de myNorm más compleja.

La desventaja de este método es que no puede cambiar fácilmente el centro predeterminado.


Otra variación que sí permite una para cambiar fácilmente el centro defecto, pero es más detallado, es utilizar Options:

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

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

sintaxis es:

myNorm2[{5, 7}] 

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

Cambiando la c por defecto escriba:

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

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

@ 500 de nada. Por favor vea mi respuesta actualizada para otro método. –

+0

He cometido exactamente el mismo error que tenía con 'Predeterminado' en su primera versión. Estuve tan avanzado en el proyecto que me di cuenta de que acabo de poner un comentario sobre él en la parte superior que decía "si cambias $ xyz, necesitas redefinir lo siguiente ..." '! – Simon

+0

@Simon si recibimos a los dos, voy a hacer una pregunta al respecto. El hecho de que 'DefaultValues ​​[f]' cambie sin efecto es confuso. –

4

Puede usted sólo tiene que utilizar EuclideanDistance

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

o definir un $Center y un nuevo CNorm, por ejemplo,

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

gracias, he publicado este antes de ver su correo electrónico, podría esperar para poner en práctica ahora que mi función funciona! – 500

+0

@ 500, recibiendo soporte por correo electrónico de Simon también, ¿eh?Desearía tener el tipo de apoyo que recibes cuando estaba aprendiendo Mathematica. :-) –

+0

@Mr Wizard, En serio, es increíble, ¡esta generosidad y experiencia me impulsaron con motivación! ¡Te enviaré mi cuaderno pronto con la esperanza de que te guste! – 500

Cuestiones relacionadas