2011-06-12 36 views
5

Bir gözdeki Göz hareketlerini analiz etme, Kökeni (Bu noktada değiştirmek için sabit) olarak ayarlıyorum.Mathematica'daki Kartezyen Koordinat Sistemindeki uzaklığı hesaplama

Bazı noktalar ile ekranın merkezi arasındaki mesafeyi hesaplamaya çalışıyorum, aşağıda görüntülenen basit formülü kullanıyorum. Sorun, bu koşullu ifadede kullanıldığında, çirkinleşiyor.

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

Norm noktaları arasında değil, bir nokta ve menşe arasındaki mesafeyi hesaplamak için özelleştirmek için bir yolu var mı? Veya benim durumumda, orijinin mevcut koordinat sisteminin "ortasındaki" konumuna ayarlanmasını mı istiyorsunuz?

cevap

4

Simon'un yöntemin küçük bir farklılık ziyade küresel bir değişken ($Center) daha fonksiyonunda varsayılan bir değer kullanmaktır.

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

Bildirimi _:{5, 5} kullanımı varsayılan değerini tanımlamak için:

(5 5), daha sonra varsayılan kökeni varsayalım.

myNorm[{5, 7}] 

(* Out[]= 2 *) 

Veya geçici olarak merkez ile farklı kullanın:: Artık

Yapabileceğiniz bu basit işlevi için

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

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

, bunun yerine ikinci durumda EuclideanDistance kullanabilirsin ama umarım Bu yöntemin faydası daha karmaşık myNorm tanımı olduğunu görebilirsiniz.

Bu yöntemin olumsuz tarafı, varsayılan merkezi kolayca değiştirememenizdir.

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

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

Sözdizimi:

myNorm2[{5, 7}] 

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

kolayca varsayılan merkezini değiştirmeye izin vermez, ama daha ayrıntılı bir başka varyasyonu, Options kullanmaktır

Varsayılan c'yi değiştirme girin:

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

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

@ 500’e hoş geldiniz. Lütfen başka bir yöntem için güncellenmiş yanıtıma bakın. –

+0

İlk sürümünüzde "Default" ile yaptığınız tamamen aynı hatayı yaptım. Projede çok uzağım fark etmeden önce bir yorumda bulunduğumu farkettim ki "eğer $ xyz değiştirirseniz, aşağıdakileri yeniden tanımlamanız gerekir ..." '! – Simon

+0

@Simon ikimizin de varsa, bu konuda bir soru yayınlayacağım. DefaultValues ​​[f] 'nin etkisiz olarak değiştiği gerçeği kafa karıştırıcıdır. –

4

sadece EuclideanDistance

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

kullanmak Ya da bir $Center ve yeni CNorm, örneğin tanımlayabilir

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

Ben e-posta görmeden ben artık işlevi çalıştığını uygulamak için beklemek olabilir, bu yayınlanmıştır, Teşekkürler! – 500

+0

@ 500, Simon'dan e-posta desteği almak da, eh?Mathematica’yı öğrendiğimde aldığın desteklere sahip olsaydım. :-) –

+0

@Mr Wizard, Cidden, inanılmaz, bu cömertlik ve uzmanlık beni motive etti! Yakında seveceğim umuduyla dizüstü bilgisayarımı size göndereceğim! – 500