1 Aralık 2010

Windows Phone 7 'de Accelerometer ( İvmeölçer / Akselerometre ) ile Vektörel Büyüklük Hesaplama

Her bir Windows Phone 7 cihazının bir akselerometre içerdiğini biliyoruz. İvme ölçer cihazı ile ortaya oldukça keyif verici uygulamalar çıkacaktır. Makalemize başlarken öncelikle vektör, vektörel büyüklük ve bu büyüklüğün nasıl hesaplanabileceğinden kısaca bahsedelim.

Vektör, doğrultusu ve yönü olan cebirsel yapılardır. Vektörün bir başlangıç noktası, yönü ve uzunluğu vardır. Vektörel büyüklük de yönü ve doğrultusu olan büyüklüklere verilen isimdir. Aşağıdaki resimde (x,y,z) koordinat eksenindeki bir vektörü görebiliriz. Bu vektör O, Orjin (0,0,0) noktasından belirli bir P (x,y,z) noktasına doğru uzanmaktadır. P noktasının x,y ve z eksenlerinde birer karşılığı vardır. Aşağıdaki şekilde O noktasından P noktasına uzanan vektörün yerine, ayrı ayrı x, y ve z koordinatları üzerinde 3 farklı vektör ile de aynı vektörel değeri elde edebiliriz.














Windows Phone 7 Accelerometer de bize yukarıdaki koordinat ekseninde de görüleceği üzere x, y ve z değerlerini sağlayacaktır. Biz de asırlar önce Pisagor 'un bizler için sunmuş olduğu teoremi kullanarak A vektörü olarak isimlendireceğimiz vektörün büyüklük değerini elde edebilir olacağız.




Windows Phone 7 uygulamamız için Microsoft.Devices.Sensors kütüphanesi altında bulunan Accelerometer sınıfını kullanacağız. Şimdi işe VS 2010 / File / New Project / Silverlight for Windows Phone Template / Windows Phone Application seçerek yeni bir windows phone uygulaması açarak kodlarımızı yazmaya başlayalım.






Ana ekranımızdaki content panel içerisine, aşağıdaki xaml kodlarında olduğu gibi bir TextBlock nesnesi ekliyoruz.

XAML ('txt' adında TextBlock nesnesi)
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
   <TextBlock Name="txt"
              HorizontalAlignment="Center"
              VerticalAlignment="Center" />
Grid>
Vektörel hesaplama yapabilmek için vektörümüzün bir başlangıç ve bir de bitiş noktası olmalıdır. Bitiş noktası biz cihazımızı hareket ettirdiğimiz sürece değişecektir. Biz başlangıç noktasını, ana ekranımızın konstraktörü içerisinde, InitializeComponent methodundan hemen sonra başlatacağız.

C# (Accelerometer start ediliyor)
 public MainPage() {
    InitializeComponent();
    Accelerometer acc = new Accelerometer();
    acc.ReadingChanged += OnAccelerometerReadingChanged;
    try {
      acc.Start();
    }
    catch (Exception ex) {
      txt.Text = ex.Message;
    }
  }

Accelerometer' den veriler yakalandıkça ana ekran üzerindeki text bloğumuza bu verileri bir delege aracılığı ile göndereceğiz.

C#
 private delegate void SetTextBlockTextDelegate(TextBlock txt, string text);
 private void SetTextBlockText(TextBlock txt, string text) {
     txt.Text = text;
  }
Accelerometer verileri değiştikçe OnAccelerometerReadingChanged methoduna düşecektir. Şimdi bu methodumuzun içerisinde Math kütüphanesini de kullanarak X, Y, Z koordinat değerleri ile vektörel büyüklük değerimizi txt isimli text bloğumuza set ediyoruz.

C#
  private void OnAccelerometerReadingChanged(object sender,
                                             AccelerometerReadingEventArgs args) {
    string str = String.Format(
      "X = {0:F2}\n" +
      "Y = {1:F2}\n" +
      "Z = {2:F2}\n\n" +
      "Vektörel Büyüklük = {3:F2}\n\n" + "{4}",
      args.X,
      args.Y,
      args.Z,
      Math.Sqrt(args.X * args.X + args.Y * args.Y + args.Z * args.Z),
      args.Timestamp);

    if (txt.CheckAccess()) {
        SetTextBlockText(txt, str);
      }
      else {
        txt.Dispatcher.BeginInvoke(new SetTextBlockTextDelegate(SetTextBlockText),txt, str);
      }
  }

F5 ile uygulamamızı çalıştırdığımızda Emulator üzerinde karşımıza aşağıdaki gibi bir ekran görüntüsü çıkacaktır. Windows Phone 7 Emulator ile akselerometre değerleri her zaman (x,y,z) 0,0,-1 değerlerini üretecektir.



Kolay gelsin.
Gökhan Manduz  -  gokhanmanduz@hotmail.com, gmanduz@gmail.com

Hiç yorum yok: