2.¼¾¼­ È°¿ë

1.¹æÇâ°ª Àбâ

¹æÇâ°ªÀº ÀåºñÀÇ ÇöÀç ¹æÇâ°ú ÀÚ¼¼¸¦ ³ªÅ¸³½´Ù. ¾îµð¸¦ ÇâÇÏ°í ÀÖ°í ¾ó¸¶¸¸Å­ ±â¿ï¾î ÀÖ´ÂÁö¸¦ ¹æÇâ°ªÀ¸·Î ÆǺ°ÇÒ ¼ö ÀÖ´Ù. ¸®½º³Ê·Î ¼¼ °³ÀÇ °ªÀÌ Àü´ÞµÇ´Âµ¥ ÀÌ´Â Àåºñ°¡ ÀÖ´Â °ø°£ÀÌ 3Â÷¿ø ÁÂÇ¥°èÀÌ¸ç ¼öÇÐÀû 3Â÷¿ø °ø°£¿¡´Â ÃàÀÌ ¼¼ °³ Àֱ⠶§¹®ÀÌ´Ù. Àåºñ¸¦ ÆòÆòÇÑ ¹Ù´Ú¿¡ ³õ¾ÒÀ» ¶§ X, YÃàÀº °¢°¢ ¼öÆò, ¼öÁ÷ÃàÀ̸ç ZÃàÀº ÇÏ´Ã ¹æÇâÀÌ´Ù. È­¸éÀÇ ÁÂÇÏ´ÜÁ¡ÀÌ ¿øÁ¡À̸ç X´Â ¿À¸¥ÂÊ, Y´Â À§ÂÊ, Z´Â ÇÏ´ÃÂÊÀ¸·Î Áõ°¡ÇÑ´Ù.

¼¾¼­ ¸®½º³ÊÀÇ values ¹è¿­·Î Àü´ÞµÇ´Â 3°³ÀÇ °ªÀ» °¢°¢ ¹æÀ§°¢(Azimuth), ÇÇÄ¡(Pitch), ·Ñ(Roll)À̶ó°í ÇÑ´Ù. ¹è¿­¿¡ ´ã°Ü Àü´ÞµÇ¹Ç·Î values[0], values[1] , values[2] ½ÄÀ¸·Î ¹è¿­ ¿ä¼Ò¸¦ ¹Ù·Î Àд´Ù. ÇÇÄ¡, ·ÑÀº ±»ÀÌ ¹ø¿ªÇÏÀÚ¸é ±â¿ï±â³ª ±¸¸£±â·Î ¹ø¿ªÇÒ ¼öµµ ÀÖ°ÚÀ¸³ª ÀϹÝÀûÀÌÁö ¾ÊÀ¸¹Ç·Î ¿øÁֹΠ¿ë¾î¸¦ ±×³É ¾²±â·Î ÇÑ´Ù.

¹æÀ§°¢Àº Àåºñ Y Ãà°ú Áö±¸ Àںϰ£ÀÇ °¢µµÀÌ´Ù. ½±°Ô ¸»Çؼ­ ³ªÄ§¹ÝÀ¸·Î ÃøÁ¤ÇÑ °ªÀ̸ç ÀåºñÀÇ À§ÂÊ À̸¶ ºÎºÐÀÌ ¾î´À ¹æÇâÀ» ÇâÇÏ°í ÀÖ´ÂÁö¸¦ ³ªÅ¸³½´Ù. »ó½ÄÀûÀÎ ³»¿ëÀÌÁö¸¸ ÀÚºÏÀº ÁøºÏ°ú´Â ´Þ¶ó¼­ ºÏ±ØÀ¸·Î À̵¿ÇÒ¼ö·Ï ¿ÀÂ÷°¡ ¹ß»ýÇÏ¸ç ºÏ±ØÁ¡¿¡¼­´Â Á¤È®ÇÏÁö ¾Ê´Ù. ¶ÇÇÑ Àåºñ¿¡ ³»ÀåµÈ ÀüÀÚ ³ªÄ§¹ÝÀº ÀÚ±âÀåÀ» ÀνÄÇÏ¿© ¹æÇâÀ» ÆǺ°ÇϹǷΠÁÖº¯¿¡ ÀÚ¼®ÀÌ ÀÖÀ¸¸é Á¤È®µµ°¡ ¶³¾îÁø´Ù. ÀÌ´Â ½ÇÁ¦ ³ªÄ§¹Ýµµ ¸¶Âù°¡ÁöÀÌ´Ù.

Àåºñ¸¦ ÆòÆòÇÑ ¹Ù´Ú¿¡ ³õ¾Æ µÎ°í õõÈ÷ ȸÀü½ÃÅ°¸é¼­ SensorDump ¿¹Á¦ÀÇ ¹æÀ§°¢ÀÌ ¾î¶»°Ô º¯ÇÏ´ÂÁö °üÂûÇØ º¸ÀÚ. 360µµ °¢µµ·Î º¯ÇÒ °ÍÀÌ´Ù. ÀÌ °ªÀÌ 0ÀÏ ¶§ ÀåºñÀÇ À§ÂÊÀÌ ºÏÂÊÀ» ÇâÇϸç 90ÀÏ ¶§°¡ µ¿ÂÊ, 270ÀÏ ¶§°¡ ¼­ÂÊÀÌ´Ù. °á°ú°¡ Á÷°üÀûÀÌ¶ó ½±°Ô ÀÌÇØµÉ °ÍÀÌ´Ù. Ȥ½Ã °ªÀÌ ÀÌ»óÇÏ°Ô ³ª¿Â´Ù¸é ¿·¿¡ ÄÄÇ»Åͳª ½ºÇÇÄ¿°¡ À־ÀÌ´Ù. ÀÚ¼®ÀÌ ±Ùó¿¡ ÀÖÀ¸¸é Á¦´ë·Î ¹æÇâÀ» ÆÇ´ÜÇÏÁö ¸øÇϹǷΠ°Å½ÇÀ̳ª ¸¶´çÀ¸·Î ³ª°¡¼­ Å×½ºÆ®ÇØ º¸¾Æ¶ó.

ÇÇÄ¡´Â XÃàÀÇ È¸Àü °¢µµÀÌ´Ù. ÀåºñÀÇ ¼öÆòÀ¸·Î ²¿Ã¬À̸¦ ²È¾Æ ³õ°í ²¿Ã¬À̸¦ µ¹¸± ¶§ÀÇ °¢µµ¶ó°í »ý°¢ÇÏ¸é µÈ´Ù. ¼öÆòÀ¸·Î ¹ÝµíÇÏ°Ô ³õÀ¸¸é ÇÇÄ¡´Â 0ÀÌ´Ù. Àåºñ À§ÂÊÀ» »ç¿ëÀÚÂÊÀ¸·Î ÀÏÀ¸ÄÑ ¼¼¿ì¸é À½ÀÇ ¹æÇâÀ¸·Î °¨¼ÒÇÏ°í ¾Æ·¡ÂÊÀ» »ç¿ëÀÚ ¹Ý´ëÂÊÀ¸·Î ¼¼¿ì¸é ¾çÀÇ ¹æÇâÀ¸·Î Áõ°¡ÇÑ´Ù. Àåºñ¸¦ µÚÁýÀ¸¸é 180µµ°¡ µÇ´Âµ¥ ¾î´À ¹æÇâÀ¸·Î µÚÁý¾ú´Â°¡¿¡ µû¶ó °¢µµÀÇ ºÎÈ£°¡ ´Þ¶óÁø´Ù.

±Û·Î ¼³¸íÇϱâ´Â ¾î·Á¿ì¹Ç·Î Àåºñ¸¦ ±â¿ï¿©°¡¸ç °ªÀÌ ¾î¶»°Ô º¯ÇÏ´ÂÁö °üÂûÇØ º¸¾Æ¶ó. SensorDump ¿¹Á¦¸¦ ½ÇÇàÇØ ³õ°í ¾Æ·¡, À­ ¸éÀ» µé¾ú´Ù ³ù´Ù Çϸ鼭 Pitch °ªÀÌ ¾î¶»°Ô º¯ÇÏ´ÂÁö »ìÆì º¸¸é Á÷°üÀûÀ¸·Î ÀÌÇØµÉ °ÍÀÌ´Ù. ·ÑÀº YÃàÀÇ È¸Àü °¢µµÀÌ´Ù. ÆòÆòÇÏ°Ô ³õ¾ÒÀ» ¶§°¡ 0À̸ç Àåºñ¸¦ ¿À¸¥ÂÊÀ¸·Î ±â¿ïÀÌ¸é ¾çÀÇ ¹æÇâÀ¸·Î Áõ°¡ÇÏ°í ¿ÞÂÊÀ¸·Î ±â¿ïÀ̸é À½ÀÇ ¹æÇâÀ¸·Î °¨¼ÒÇÑ´Ù. ÇÇÄ¡¿Í´Â ´Þ¸® Àåºñ¸¦ ¿ÏÀüÈ÷ µÚÁýÀ¸¸é ´Ù½Ã 0ÀÌ µÈ´Ù. 

°ªÀÌ ¾î¶² ½ÄÀ¸·Î º¯ÇÏ´ÂÁö´Â ¿©·ÆÁö ¾Ê°Ô ÀÌÇصÇÁö¸¸ Àû¿ëÇÒ ¶§¸¶´Ù ¸Å¹ø ºÎÈ£°¡ Çò°¥¸± °ÍÀÌ´Ù. Àåºñ¸¦ ¼öÆòÀ¸·Î ³õ°í ¿À¸¥ÂÊ ¾Æ·¡¸¦ µé¸é ÇÇÄ¡¿Í ·ÑÀÌ ¸ðµÎ Áõ°¡ÇÑ´Ù°í ¿Ü¿ö µÎµµ·Ï ÇÏÀÚ. Á¤ Çò°¥¸®¸é ¾ðÁ¦µçÁö ÀÌ ¿¹Á¦¸¦ ½ÇÇàÇØ ³õ°í Àåºñ¸¦ ¿ä·¡ Á¶·¡ µ¹·Á º¸¸é ±Ý¹æ º¹½ÀÀÌ µÉ °ÍÀÌ´Ù.

¹æÇâ°ªÀº ¼öÄ¡·Î Ç¥±âÇؼ­´Â Àǹ̸¦ ±Ý¹æ ¾Ë±â ¾î·Á¿ì¹Ç·Î ½Ã°¢ÀûÀ¸·Î È®ÀÎÇØ º¸´Â °ÍÀÌ ÈξÀ ´õ Á÷°üÀûÀÌ´Ù. ¹æÇâ°ªÀ¸·Î ¸¸µé ¼ö ÀÖ´Â ÀüÇüÀûÀÎ ¿¹Á¦´Â ³ªÄ§¹Ý ¹× ¼öÆò°èÀ̸ç À¯»çÇÑ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ¸¹ÀÌ ¹ßÇ¥µÇ¾î ÀÖ´Ù. °£´ÜÇÑ ¿¹Á¦ÀÌµÇ ÁÂÇ¥ °è»ê¿¡ »ê¼ö°¡ ¸¹ÀÌ µé¾î°¡ Äڵ尡 Á» º¹ÀâÇØ º¸ÀδÙ.

 

hard_Compass

public class hard_Compass extends Activity {

     SensorManager mSm;

     CompassView mView;

     public void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          mView = new CompassView(this);

          setContentView(mView);

 

          mSm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

     }

 

    protected void onResume() {

        super.onResume();

          mSm.registerListener(mView, mSm.getDefaultSensor(Sensor.TYPE_ORIENTATION),

                   SensorManager.SENSOR_DELAY_UI);

    }

   

    protected void onPause() {

        super.onPause();

          mSm.unregisterListener(mView);

    }

   

    class CompassView extends View implements SensorEventListener {

          float azimuth;

          float pitch;

          float roll;

          final static int MAX = 30;

          Paint textPnt = new Paint();

          Bitmap compass;

          int width;

          int height;

          int w10;

          int h10;

          int thick;

          int length;

         

          public CompassView(Context context) {

              super(context);

              textPnt.setColor(Color.BLACK);

              textPnt.setTextSize(20);

              textPnt.setAntiAlias(true);

              compass = BitmapFactory.decodeResource(getResources(), R.drawable.compass);

          }

 

          public void onSizeChanged(int w, int h, int oldw, int oldh) {

            super.onSizeChanged(w, h, oldw, oldh);

              width = w;

              height = h;

              w10 = width/10;

              h10 = height/10;

              thick = h10;

              length = w10 * 8;

        }

 

          public void onAccuracyChanged(Sensor sensor, int accuracy) {

          }

 

          public void onSensorChanged(SensorEvent event) {

              float[] v = event.values;

              switch (event.sensor.getType()) {

              case Sensor.TYPE_ORIENTATION:

                   if (azimuth != v[0] || pitch != v[1] || roll != v[2]) {

                        azimuth = v[0];

                        pitch = v[1];

                        roll = v[2];

                        invalidate();

                   }

                   break;

              }

          }

 

        public void onDraw(Canvas canvas) {

              Paint Pnt = new Paint();

              Pnt.setAntiAlias(true);

 

              // ¼öÆò, ¼öÁ÷ ¸·´ë±â ±×¸²

              canvas.drawColor(Color.WHITE);

              Pnt.setColor(Color.BLACK);

              Rect pitchrt = new Rect(w10, h10, w10 + thick, h10 + length);

              canvas.drawRect(pitchrt, Pnt);

              Rect rollrt = new Rect(w10, h10*2 + length, w10*9, h10*2 + length + thick);

              canvas.drawRect(rollrt, Pnt);

 

              // ·Ñ °ª Ç¥½Ã

              float rollvalue = roll < -MAX ? -MAX:roll > MAX ? MAX:roll;

              int rollcenter = rollrt.left + rollrt.width()/2;

              int rolllength = rollrt.width() - thick;

              int rollpos = rollcenter + (int)(rolllength/2 * rollvalue / MAX);

              Pnt.setColor(rollvalue == 0 ? Color.RED:Color.YELLOW);

              canvas.drawCircle(rollpos, rollrt.top + thick/2, (int)(thick/2*0.9), Pnt);

              canvas.drawText("roll:" + (int)roll, rollrt.left, rollrt.top-5, textPnt);

             

              // ÇÇÄ¡°ª Ç¥½Ã

              float pitchvalue = pitch;

              if ((Math.abs(pitch)) > 90) {

                   pitchvalue = 180 - Math.abs(pitch);

                   if (pitch < 0) pitchvalue *= -1;

              }

              pitchvalue = pitchvalue < -MAX ? -MAX:pitchvalue > MAX ? MAX:pitchvalue;

              int pitchcenter = pitchrt.top + pitchrt.height()/2;

              int pitchlength = pitchrt.height() - thick;

              int pitchpos = pitchcenter + (int)(pitchlength/2 * pitchvalue / MAX);

              Pnt.setColor(pitchvalue == 0 ? Color.RED:Color.YELLOW);

              canvas.drawCircle(pitchrt.left + thick/2, pitchpos, (int)(thick/2*0.9), Pnt);

              canvas.drawText("pitch:" + (int)pitch, pitchrt.left, pitchrt.top-5, textPnt);

             

              // ³ªÄ§¹Ý Ç¥½Ã

              Matrix m = new Matrix();

              m.postRotate(-azimuth, compass.getWidth()/2, compass.getHeight()/2);

              m.postTranslate(rollcenter - compass.getWidth()/2 + thick,

                        pitchcenter - compass.getHeight()/2);

              canvas.drawBitmap(compass, m, Pnt);

              canvas.drawText("azimuth:" + (int)azimuth, rollcenter,

                        pitchcenter - compass.getHeight()/2 - 5, textPnt);

          }

     }

}

 

Àåºñ ¹æÇâÀÌ ¹Ù²ð ¶§¸¶´Ù ¾×ƼºñƼ°¡ Àç»ý¼ºµÇÁö ¾Êµµ·Ï ¸Å´ÏÆ佺Ʈ¿¡´Â ¼¼·Î Àü¿ëÀÇ ¼Ó¼ºÀ» ¼³Á¤Çß´Ù. º¸ÅëÀº ½Ã½ºÅÛÀÌ ¹æÇâÀ» ÆǺ°ÇÏ¿© ¾×ƼºñƼ¸¦ Àç»ý¼ºÇϴµ¥ ¾ÛÀÌ Á÷Á¢ ¼¾¼­°ªÀ» »ç¿ëÇϹǷΠ½Ã½ºÅÛÀÌ ¹æÇظ¦ ÇÏÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù. ÀÌÈÄÀÇ ¼¾¼­ °ü·Ã ¿¹Á¦µéµµ ¸¶Âù°¡ÁöÀÌ´Ù.

 

<activity android:name="hard_Compass" android:label="Compass"

      android:screenOrientation="portrait"

      android:configChanges="orientation|keyboardHidden"

      />

 

¼¾¼­·ÎºÎÅÍ ¹ÞÀº °ªÀ» Ä¿½ºÅÒ ºä¿¡ ±×·¡ÇÈÀ¸·Î ±×¸®¹Ç·Î ·¹À̾ƿôÀº µû·Î ÇÊ¿ä¾ø´Ù. ¸ÞÀÎ ¾×ƼºñƼÀÇ onCreate¿¡¼­ Ä¿½ºÅÒ ºäÀÎ CompassView¸¦ »ý¼ºÇÏ¿© ä¿ì°í ¼¾¼­ °ü¸®ÀÚ¸¦ ã¾Æ ³õ´Â´Ù. onResume¿¡¼­ ¹æÇâ ¼¾¼­ ¸®½º³Ê¸¦ Ä¿½ºÅÒ ºä·Î ¼³Á¤ÇÏ°í onPause¿¡¼­´Â ÇØÁ¦ÇÏ¿© ¾×ƼºñƼ°¡ ½ÇÇàÁßÀÎ µ¿¾È¿¡¸¸ ¼¾¼­°ªÀ» ¹Þµµ·Ï Çß´Ù.

¼¾¼­ ¸®½º³Ê´Â ÀÎÅÍÆäÀ̽ºÀÏ »ÓÀ̹ǷΠ±»ÀÌ °´Ã¼¸¦ µû·Î ¸¸µé ÇÊ¿ä¾øÀÌ Ä¿½ºÅÒ ºä°¡ Á÷Á¢ ±¸ÇöÇصµ ¹«¹æÇÏ´Ù. Ä¿½ºÅÒ ºä´Â ¼¾¼­·ÎºÎÅÍ Àü´ÞµÇ´Â °ªÀ» Á÷Á¢ ¹Þ¾Æ¼­ È­¸é¿¡ ¼¾¼­°ªÀ» º¸±â ÁÁ°Ô Ãâ·ÂÇÒ °ÍÀÌ´Ù. ³ª¸ÓÁö ÄÚµåµéÀº ´ëºÎºÐ ±×¸®±â Áغñ¿Í °£´ÜÇÑ °è»ê ·çƾµéÀÌ´Ù. »ý¼ºÀÚ´Â ÅؽºÆ® Ãâ·Â¿¡ »ç¿ëÇÒ Paint °³Ã¼¿Í ³ªÄ§¹Ý ºñÆ®¸ÊÀ» ·ÎµåÇÏ´Â ÃʱâÈ­ ÀÛ¾÷À» ó¸®ÇÑ´Ù. ºñÆ®¸ÊÀº ¿ë·®ÀÌ Å©¹Ç·Î ¹Ýµå½Ã ¹Ì¸® ÀÐ¾î µÎ¾î¾ß ÇÑ´Ù.

ºäÀÇ Å©±â°¡ ÃÖÃÊ·Î °áÁ¤µÇ´Â onSizeChanged¿¡¼­´Â Æø°ú ³ôÀÌ, ±×¸®°í Æø, ³ôÀÌÀÇ 10% Å©±â¿Í ¸·´ëÀÇ ±½±â, ±æÀÌ µîÀ» ±¸ÇØ ³õ´Â´Ù. ÀåºñÀÇ ÇØ»óµµ¿Í »ó°ü¾øÀÌ ÀÏÁ¤ÇÑ ±æÀÌ¿Í ÆøÀ» °¡Áö±â À§ÇØ È­¸é Æø°ú ³ôÀ̸¦ ±âÁØÀ¸·Î Å©±â¸¦ °è»êÇß´Ù. ¸·´ëÀÇ µÎ²²´Â ³ôÀÌÀÇ 10%, ±æÀÌ´Â ³ÊºñÀÇ 80%·Î ¼³Á¤Çß´Ù. ·¹À̾ƿô¿¡ ¹èÄ¡ÇÏÁö ¾Ê°í È­¸é ºñÀ²¿¡ ¸Â°Ô °è»êÀ» ÇØ¾ß ¸ðµç Àåºñ¿¡ ÀÌ»ó¾øÀÌ µ¿ÀÛÇÑ´Ù.

¼¾¼­ ¸®½º³Ê´Â ¹æÇâ°ªÀÌ °»½ÅµÇ¸é ºä °´Ã¼ÀÇ Çʵ忡 °ªÀ» ÀúÀåÇÏ°í È­¸éÀ» ´Ù½Ã ±×¸®±â¸¸ ÇÑ´Ù. °»½ÅµÈ °ªÀ» ½ÇÁ¦ »ç¿ëÇÏ´Â °÷Àº onDrawÀÌ´Ù. °¡¸¸È÷ ÀÖ´Â »óÅ¿¡¼­´Â ºÒÇÊ¿äÇÑ ±×¸®±â¸¦ ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¹Ç·Î ÀÌÀü°ª°ú ´Ù¸¥Áö¸¦ Á¡°ËÇÏ¿© °»½ÅÇÒ ÇÊ¿ä°¡ ÀÖÀ» ¶§¸¸ ´Ù½Ã ±×¸°´Ù. ÆòÆòÇÑ ¹Ù´Ú¿¡ °¡¸¸È÷ ³õ¾Æ µÎ¾îµµ ¼¾½º°ªÀÌ Áö¼ÓÀûÀ¸·Î Àü´ÞµÇ´Âµ¥ À̶§¸¶´Ù ±×¸®±â¸¦ ´Ù½Ã ÇÒ ÇÊ¿ä´Â ¾ø´Ù. onDraw´Â ¼¾¼­ ¸®½º³Ê°¡ Çʵ忡 ÀúÀåÇØ ³õÀº °ªÀ» ÂüÁ¶ÇÏ¿© È­¸éÀ» ±×¸°´Ù.

 

¿¡¹Ä·¹ÀÌÅÍ´Â ¼¾¼­°¡ ¾øÀ¸¹Ç·Î ±×¸²¸¸ º¸¿©ÁÙ »Ó µ¿ÀÛÇÏÁö´Â ¾Ê´Â´Ù. ½ÇÀåºñ¿¡¼­´Â ¹°·Ð Àß µ¿ÀÛÇÑ´Ù. onDrawÀÇ ÄÚµå´Â ´Ü¼øÇÑ Ãâ·Â¹®ÀÌµÇ ÁÂÇ¥¸¦ °è»êÇÏ´Â »ê¼ö°¡ ´Ù¼Ò º¹ÀâÇÑ °Í »ÓÀÌ´Ù. ¼öÆò ¼öÁ÷ ¸·´ë±â´Â drawRect·Î °£´ÜÇÏ°Ô ±×¸± ¼ö ÀÖµÇ ÀåÄ¡ µ¶¸³¼ºÀ» À§ÇØ È­¸é Å©±â¸¦ ±âÁØÀ¸·Î ¹Ì¸® °è»êµÈ Å©±â°ªÀ» »ç¿ëÇÑ´Ù. ÇÇÄ¡, ·Ñ ¸·´ë±â´Â ¿ÞÂÊ, ¾Æ·¡ÂÊ¿¡ ¹èÄ¡ÇÏ°í ³ªÄ§¹ÝÀº Áß¾Ó¿¡ ºñÆ®¸ÊÀ¸·Î µû·Î ±×¸± °ÍÀÌ´Ù.

·Ñ ¸·´ë À§¿¡ ÇöÀç ·Ñ °ª À§Ä¡¸¦ ÀǹÌÇÏ´Â µ¿±×¶õ ¹°¹æ¿ïÀ» ¿øÀ¸·Î ±×¸°´Ù. ´Ü»ö ¿øÀ¸·Î ±×·È´Âµ¥ ¹°¹æ¿ï ¸ð¾çÀÇ ÀÔüÀûÀÎ À̹ÌÁö¸¦ »ç¿ëÇÏ¸é »ç½Ç°¨ÀÌ Çâ»óµÉ °ÍÀÌ´Ù. ·Ñ °ªÀÇ ¹üÀ§´Â 90µµ±îÁöÀÌÁö¸¸ ¾×ü´Â Á¡µµ°¡ ³·¾Æ »ì¦¸¸ ±â¿ï¿©µµ ¿òÁ÷ÀÌ´Â °ÍÀÌ »ó½ÄÀûÀ̹ǷΠ¹üÀ§¸¦ Á» Á¦ÇÑÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. MAX »ó¼ö´Â ¹°¹æ¿ïÀÌ Á¦ÀÏ À§¿¡ ´êÀ» ¶§ÀÇ °ªÀ» ÀǹÌÇϴµ¥ 30À¸·Î ¼³Á¤Çß´Ù. Áï, 30µµ ±â¿ïÀ̸é Á¦ÀÏ °¡ÀåÀÚ¸®·Î ¹°¹æ¿ïÀÌ À̵¿ÇÑ´Ù. rollvalue´Â ¼¾¼­·ÎºÎÅÍ Àü´ÞµÈ roll°ªÀ» -30~30 ¹üÀ§·Î Á¶Á¤ÇÑ °ªÀÌ´Ù.

rollcenter´Â ¸·´ëÀÇ Áß¾Ó ÁÂÇ¥À̸ç rollÀÌ 0ÀÏ ¶§ ¹°¹æ¿ïÀÇ À§Ä¡ÀÌ´Ù. ¸·´ë ¿ÞÂÊ ÁÂÇ¥¿¡ ±æÀÌÀÇ Àý¹ÝÀ» ´õÇÏ¸é ¿©±â°¡ Áß¾ÓÀÌ´Ù. rolllength´Â ¹°¹æ¿ïÀÌ ¿òÁ÷ÀÏ ¹üÀ§¸¦ ÁöÁ¤Ç쵂 ¸·´ëÀÇ ±æÀÌ¿¡ ±½±â¸¦ »©¼­ °è»êÇÑ´Ù. ¹°¹æ¿ïÀÇ ´ëÇ¥ ÁÂÇ¥´Â ¿øÀÇ Áß½ÉÀÌ¸ç °¡ÀåÀÚ¸®¿¡¼­´Â ¿øÀÇ ¹ÝÁö¸§¸¸Å­À» »©¾ß ¿øÀÌ ¸·´ëÀÇ ³¡¿¡ ±×·ÁÁú °ÍÀÌ´Ù. ¾çÂÊ ¿øÀÇ ¹ÝÁö¸§ ÇÕÀÌ ¸·´ëÀÇ ±½±â¿Í °°À¸¹Ç·Î ±½±â¸¸Å­¸¸ »©¸é µÈ´Ù. ±½±â¸¦ »©Áö ¾ÊÀ¸¸é °¡ÀåÀÚ¸®¿¡¼­ ¹°¹æ¿ïÀÌ ¸·´ë ¹ÛÀ¸·Î »ßÁ® ³ª°¡¸ç ÀÌ´Â ±â´ëµÇ´Â °á°ú°¡ ¾Æ´Ï´Ù.

rollpos´Â rollvalue°ª¿¡ µû¸¥ ¿øÀÇ À§Ä¡ÀÌ´Ù. 0À϶§ Áß¾ÓÀÌ°í MAXÀÏ ¶§ ¸·´ëÀÇ ³¡À¸·Î À̵¿ÇØ¾ß Çϸç MAXº¸´Ù ÀÛÀº °ªÀÏ ¶§´Â ºñÀ²¿¡ ¸Â°Ô À§Ä¡¸¦ °áÁ¤ÇÑ´Ù. ºñÀ² °è»êÀº ´Ü¼øÇÑ 1Â÷ ¹æÁ¤½ÄÀÏ »ÓÀ̹ǷΠ´ÙÀ½ °ø½Ä´ë·Î Ç®¸é ¾ÆÁÖ ½±´Ù. ºñÀ²À» Àû¾î ³õ°í ³»º¯³¢¸® °öÇÏ°í ¿Üº¯³¢¸® °öÇÑ ÈÄ ¿øÇÏ´Â °ª¿¡ ´ëÇÑ ¹æÁ¤½ÄÀ» Ç®¸é µÈ´Ù. ¼ö½ÄÀ¸·Î Àû¾î ³õÀ¸¸é ¹º°¡ ´ë´ÜÇÑ °ø½ÄÀÎ °Íó·³ º¸ÀÌÁö¸¸ ÁßÇб³ ¼öÁØÀÇ »ê¼öÀÏ »ÓÀÌ´Ù.

 

MAX:rolllength/2 = rollvalue:x

x * MAX = rolllength/2 * rollvalue

x = rolllength/2 * rollvalue / MAX

 

±¸ÇØÁø À§Ä¡°ª¿¡ ¸·´ëÀÇ Áß¾Ó ÁÂÇ¥¸¦ ´õÇØ ÆòÇà À̵¿½ÃÅ°¸é ¸·´ëÀÇ ¾ÈÂÊ¿¡ ¿øÀÌ ¹èÄ¡µÈ´Ù. rollvalue°¡ À½¼öÀÏ ¶§´Â ÀÚ¿¬½º·´°Ô ¸·´ë Áß¾Ó¿¡¼­ ¿ÞÂÊÀ¸·Î À̵¿ÇÑ´Ù. °ªÀ» ´Ù ±¸ÇßÀ¸¸é ÀÌÁ¦ ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù. ¼öÆòÀÌ ¸ÂÀ» ¶§´Â »¡°£»öÀ¸·Î ±×¸®°í ±×·¸Áö ¾ÊÀ» ¶§´Â ³ë¶õ»öÀ¸·Î ±×·È´Ù. ¿øÀº drawCircle·Î ±×¸®µÇ ¹ÝÁö¸§À» µÎ²²ÀÇ 90%·Î ¼³Á¤ÇÏ¿© ¾à°£ ¿©¹éÀ» µÎ¾úÀ¸¸ç °ªÀº Àû´çÇÑ À§Ä¡¿¡ ¹®ÀÚ¿­·Î Ãâ·ÂÇß´Ù.

ÇÇÄ¡°ªÀ» Ç¥½ÃÇÏ´Â Äڵ嵵 ·Ñ°ª Ç¥½Ã ·çƾ°ú °ÅÀÇ µ¿ÀÏÇ쵂 °ªÀ» Á¤±ÔÈ­ÇÏ´Â ºÎºÐ¸¸ Á¶±Ý ´Ù¸£´Ù. ·Ñ°ªÀº Àåºñ¸¦ µÚÁýÀ» ¶§ 0À¸·Î ´Ù½Ã ±ÙÁ¢ÇϹǷΠ±×´ë·Î »ç¿ëÇÏ¸é µÇÁö¸¸ ÇÇÄ¡´Â 180±îÁö Áõ°¡Çß´Ù°¡ ºÎÈ£¸¸ ¹Ù²ï´Ù. ÇÇÄ¡°¡ 90ÀÌ»óÀÏ ¶§´Â 180¿¡¼­ ÇÇÄ¡ÀÇ Àý´ë°ªÀ» »©°í ºÎÈ£¸¦ ±×´ë·Î À¯ÁöÇÏ¸é µÚÁý¾îÁø »óÅ¿¡¼­µµ ¹°¹æ¿ïÀÌ ¾Æ·¡ À§·Î Á¦´ë·Î ¿òÁ÷ÀδÙ. ÀÌ ±ÔÄ¢ÀÌ pitchvalue °è»ê½Ä¿¡ Ãß°¡ Àû¿ëµÇ¾î ÀÖÀ¸¸ç ³ª¸ÓÁö ³í¸®´Â ·Ñ°ª°ú µ¿ÀÏÇÏ´Ù.

¹æÀ§°¢À» Ç¥½ÃÇÏ´Â ³ªÄ§¹ÝÀº ȸÀü °è»êÀÌ µé¾î°¡¾ß ÇϹǷΠ±²ÀåÈ÷ º¹ÀâÇÒ °Í °°Áö¸¸ Çà·ÄÀ» »ç¿ëÇÏ¸é ¾ÆÁÖ ½±´Ù. Á¤ºÏÂÊÀ» À§·Î Ç¥½ÃÇÑ À̹ÌÁö¸¦ ÀÛ¼ºÇØ µÎ°í ¹æÀ§°¢¸¸Å­ ȸÀü½ÃÅ°µÇ ¹æÀ§°¢Àº ¹Ý½Ã°è ¹æÇâÀÌ°í Çà·ÄÀÇ °¢µµ´Â ½Ã°è ¹æÇâÀ̹ǷΠºÎÈ£¸¦ ¹Ý´ë·Î µÚÁý¾îÁØ´Ù. ȸÀüÀÇ Áß½ÉÁ¡Àº À̹ÌÁöÀÇ Áß¾Ó ÁöÁ¡À¸·Î ÁöÁ¤ÇÏ¿© À̹ÌÁöÀÇ °¡¿îµ¥¸¦ ±âÁØÀ¸·Î ȸÀüÇϵµ·Ï Çß´Ù. ȸÀü ÈÄ È­¸éÀÇ Áß¾Ó ÁöÁ¡À¸·Î ÆòÇà À̵¿½ÃÄÑ ³ªÄ§¹ÝÀÇ Áß¾ÓÀÌ ÇÇÄ¡, ·ÑÀÇ ±³Á¡ÀÌ µÇµµ·Ï Ç쵂 ÇÇÄ¡ ¸·´ë°¡ ¿ÞÂÊ¿¡ ÀÖÀ¸¹Ç·Î ¸·´ë µÎ²²¸¸Å­ ¿À¸¥ÂÊÀ¸·Î ´õ À̵¿½ÃÄ×´Ù.

ȸÀü ¹× ÆòÇà À̵¿ ¿¬»êÀ» ¿¬¼ÓÀ¸·Î ÇÏµÇ È¸ÀüÀ» ¸ÕÀúÇÑ ÈÄ À̵¿ÇØ¾ß ¿øÇÏ´Â °á°ú°¡ ³ª¿Â´Ù. ¼³¸í»óÀ¸·Î´Â º¹ÀâÇØ º¸ÀÌÁö¸¸ ÄÚµå·Î´Â ´Ü µÎ ÁÙ¿¡ ºÒ°úÇÏ´Ù. ȸÀü°ú À̵¿À» Àû¿ëÇÑ Çà·ÄÀ» ¸¸µç ÈÄ drawBitmapÀ¸·Î Çà·ÄÀ» Àü´ÞÇÏ¸é ºñÆ®¸ÊÀ» ȸÀü ¹× À̵¿½ÃÅ°´Â ÀÛ¾÷Àº ¸Þ¼­µå³»¿¡¼­ ÀÚµ¿À¸·Î ¼öÇàµÈ´Ù. Çà·ÄÀÌ ¾Æ´Ï¸é ÀÌ·± 󸮴 ±²ÀåÈ÷ ±î´Ù·Î¿îµ¥ ´ÙÇàÈ÷ ¾Èµå·ÎÀ̵å´Â Çà·Ä ¿¬»êÀ» ÈǸ¢È÷ Áö¿øÇÏ¸ç °ü·Ã ³»¿ëÀº ±×·¡ÇÈ ºÎºÐ¿¡¼­ ÀÌ¹Ì ¼³¸íÇÑ ¹Ù ÀÖ´Ù.

2.°¡¼Ó°è

°¡¼Ó°è´Â Àåºñ°¡ ¾î´À ¹æÇâÀ¸·Î ¿òÁ÷ÀÌ´Â ÁßÀÎÁö¸¦ ¾Ë¾Æ³»´Â ¼¾¼­ÀÌ´Ù. ÁÖÀÇÇÒ °ÍÀº ¾ó¸¶³ª »¡¸® ¿òÁ÷ÀÌ°í ÀÖ´ÂÁö¸¦ ³ªÅ¸³»´Â ¼Óµµ°è¿Í´Â ´Ù¸£´Ù´Â Á¡ÀÌ´Ù. °¡¼ÓÀ̶õ ¼öÇÐÀûÀ¸·Î ¼ÓµµÀÇ ¹ÌºÐÀ¸·Î Á¤ÀÇµÇ¸ç ¼Óµµ°¡ ¾î¶»°Ô º¯ÇÏ°í Àִ°¡¸¦ ³ªÅ¸³»´Â °ÍÀÌÁö ÇöÀçÀÇ À̵¿ ¼Óµµ¸¦ ³ªÅ¸³»´Â °ÍÀÌ ¾Æ´Ï´Ù. ¿­Â÷¿¡ Ÿ°í ÀÖ´Â »óÅ¿¡¼­´Â ÆùÀÌ ¿­Â÷¿Í °°Àº ¼Óµµ·Î ¿òÁ÷ÀÌÁö¸¸ ¿­Â÷ÀÇ ¼Óµµ°¡ ÀÏÁ¤ÇÏ´Ù¸é °¡¼ÓÀº Ç×»ó 0ÀÌ´Ù.

°¡¼Ó°è´Â Àåºñ°¡ ¸· ¿òÁ÷À̱⠽ÃÀÛÇÒ ¶§ ¼Óµµ°¡ ¾ó¸¶³ª ±Þ°ÝÇÏ°Ô ´Ã¾î³ª´ÂÁö, À̵¿À» ÁßÁöÇÒ ¶§ ¾ó¸¶³ª »¡¸® ¸ØÃß´ÂÁö¸¦ °¨ÁöÇس»´Â ¼¾¼­ÀÌ´Ù. µû¶ó¼­ °¡¼Ó°è°¡ ¹ÝÀÀÇÏ´Â °ÍÀ» È®ÀÎÇØ º¸·Á¸é Àåºñ¸¦ Èçµé¾î ºÁ¾ß ÇÏ¸ç ¼¼°Ô Èçµé¼ö·Ï °¡¼Ó°ªÀº Áõ°¡ÇÑ´Ù. ±×·¯³ª È­¸éÀÌ º¸ÀÏ Á¤µµ·Î Èçµé¾î¼­´Â °ªÀÌ °üÃøµÇÁö ¾ÊÀ¸¸ç ³Ê¹« ¼¼°Ô Èçµé¸é ±× °ªÀ» È®ÀÎÇϱ⠾î·Æ´Ù´Â °ï¶õÇÔÀÌ ÀÖ´Ù. SensorDump ¿¹Á¦´Â °¡¼Ó°ªÀ» Á¦´ë·Î Ãâ·ÂÇϱâ´Â ÇÏÁö¸¸ ÀÌ ¿¹Á¦¸¦ ¾Æ¹«¸® °·Á ºÁµµ ±ÔÄ¢À» ÆľÇÇϱ⿡´Â ÇÑ°è°¡ ÀÖ´Ù.

°¡¼ÓÀ̶õ ¼Óµµ¿Í ½Ã°£ÀÇ °³³äÀÌ °áÇÕµÈ °ÍÀ̶ó ÇÑ ½ÃÁ¡ÀÇ °¡¼Ó°ª¸¸ ºÁ¼­´Â º¯È­¸¦ È®ÀÎÇϱ⠾î·Á¿ì¸ç ½Ã°£ÀÇ °æ°ú¿¡ µû¶ó °ªÀÇ º¯È­ ÃßÀ̸¦ ½Ã°¢ÀûÀ¸·Î ±×·Á ºÁ¾ß °¡¼ÓÀÇ º¯È­¸¦ ¸íÈ®ÇÏ°Ô °æÇèÇØ º¼ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â X, Y, Z ¼¼ ¹æÇâ¿¡ ´ëÇØ ¼öÁ÷ÃàÀ¸·Î °ªÀÇ º¯È­¸¦ ¿¬¼ÓÀûÀ¸·Î º¸¿©ÁØ´Ù. ÀüüÀûÀÎ ±¸Á¶´Â Compass ¿¹Á¦¿Í ºñ½ÁÇ쵂 ¹æÇâ ¼¾¼­ ´ë½Å °¡¼Ó ¼¾¼­¿¡ ´ëÇÑ ¸®½º³Ê¸¦ ó¸®ÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù.

 

hard_Accelerator

public class hard_Accelerator extends Activity {

     SensorManager mSm;

     AcceleratorView mView;

     public void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          mView = new AcceleratorView(this);

          setContentView(mView);

         

          mSm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

     }

    

    protected void onResume() {

        super.onResume();

          mSm.registerListener(mView, mSm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),

                   SensorManager.SENSOR_DELAY_FASTEST);

    }

   

    protected void onPause() {

        super.onPause();

          mSm.unregisterListener(mView);

    }

   

    class AccelValue {

          float x;

          float y;

          float z;

     }

 

     class AcceleratorView extends View implements SensorEventListener {

          int width;

          int height;

          int w10;

          ArrayList<AccelValue> arValue = new ArrayList<AccelValue>();

          final static int MAGX = 2;

          final static int MAGY = 1;

          boolean mStop = false;

         

          public AcceleratorView(Context context) {

              super(context);

          }

 

          public void onSizeChanged(int w, int h, int oldw, int oldh) {

            super.onSizeChanged(w, h, oldw, oldh);

              width = w;

              height = h;

              w10 = width/10;

        }

 

          public void onAccuracyChanged(Sensor sensor, int accuracy) {

          }

 

          public void onSensorChanged(SensorEvent event) {

              if (mStop) {

                   return;

              }

              float[] v = event.values;

               switch (event.sensor.getType()) {

              case Sensor.TYPE_ACCELEROMETER:

                   if (arValue.size() * MAGY > height) {

                        arValue.clear();

                   }

                   AccelValue av = new AccelValue();

                   av.x = v[0];

                   av.y = v[1];

                   av.z = v[2];

                   arValue.add(av);

                   invalidate();

                   break;

              }

          }

 

        public void onDraw(Canvas canvas) {

              Paint Pnt = new Paint();

              Pnt.setColor(Color.WHITE);

              Pnt.setTextSize(20);

              Paint linePaint = new Paint();

              linePaint.setColor(0xff404040);

             

              int i;

              int x, y;

               int oldx, oldy;

              int basex;

 

              // X °¡¼Ó ±×¸²

              basex = oldx = w10 * 2;

              oldy = 0;

              canvas.drawText("X", basex - 25, 25, Pnt);

              canvas.drawLine(basex, 0, basex, height, linePaint);

              for (i = 0;i < arValue.size();i++) {

                   x = (int)(basex + arValue.get(i).x * MAGX);

                   y = i * MAGY;

                   canvas.drawLine(oldx, oldy, x, y, Pnt);

                   oldx = x;

                   oldy = y;

              }

 

              // Y °¡¼Ó ±×¸²

              basex = oldx = w10 * 5;

              oldy = 0;

              canvas.drawText("Y", basex - 25, 25, Pnt);

              canvas.drawLine(basex, 0, basex, height, linePaint);

              for (i = 0;i < arValue.size();i++) {

                   x = (int)(basex + arValue.get(i).y * MAGX);

                   y = i * MAGY;

                   canvas.drawLine(oldx, oldy, x, y, Pnt);

                   oldx = x;

                   oldy = y;

              }

 

              // Z °¡¼Ó ±×¸²

              basex = oldx = w10 * 8;

              oldy = 0;

              canvas.drawText("Z", basex - 25, 25, Pnt);

              canvas.drawLine(basex, 0, basex, height, linePaint);

              for (i = 0;i < arValue.size();i++) {

                   x = (int)(basex + (arValue.get(i).z - SensorManager.STANDARD_GRAVITY) * MAGX);

                   y = i * MAGY;

                   canvas.drawLine(oldx, oldy, x, y, Pnt);

                   oldx = x;

                   oldy = y;

              }

          }

       

          public boolean onTouchEvent(MotionEvent event) {

              if (event.getAction() == MotionEvent.ACTION_DOWN) {

                   mStop = !mStop;

                   return true;

              }

              return false;

          }

     }

}

 

AccelValue Ŭ·¡½º´Â °¡¼Ó ¼¾¼­·ÎºÎÅÍ Çѹø Àü´ÞµÇ´Â °ªÀÇ ÁýÇÕÀ̸ç ÀÌ Å¬·¡½ºÀÇ ¹è¿­ arValue´Â ¿¬¼ÓÀûÀÎ ¼¾¼­°ªÀ» ÀúÀåÇÑ´Ù. ´çÀåÀÇ °ª¸¸ ºÁ¼­´Â º¯È­ÀÇ ÃßÀ̸¦ È®ÀÎÇÒ ¼ö ¾øÀ¸¹Ç·Î Àü´ÞµÇ´Â °ªÀ» ¹è¿­¿¡ ÀúÀåÇØ ³õ°í ÀÏ·ÃÀÇ °ªÀ» ÇѲ¨¹ø¿¡ ±×·Á ºÁ¾ß ÇÑ´Ù. onDraw´Â ÀÌ °ªÀÇ ¿¬¼ÓÀ» °î¼± ÇüÅ·Πȭ¸é¿¡ ±×·Á °¡¼Ó°ªÀÌ ¾î¶»°Ô º¯ÇÏ´ÂÁö¸¦ º¸¿©ÁØ´Ù. X´Â È­¸éÆøÀÇ 20%, Y´Â 50%, Z´Â 80% À§Ä¡¿¡ ±×¸®¸ç ÀÌ À§Ä¡´Â basex º¯¼ö°¡ °¡Áø´Ù.

XÃàÀÇ °¡¼Ó ±×¸®±â¸¦ ºÐ¼®ÇØ º¸ÀÚ. °¡¼Ó°ªÀº basex¿¡¼­ºÎÅÍÀÇ °Å¸®·Î Ç¥ÇöÇÑ´Ù. arValue ¹è¿­ Àüü¸¦ ¼øȸÇϸ鼭 °¢ ½ÃÁ¡¿¡¼­ÀÇ °¡¼Ó°ªÀ» ²¨³» ¼øÂ÷ÀûÀÎ ¼±À¸·Î ¿¬°áÇÏ¿© °ªÀÌ ¾î¶»°Ô º¯ÇÏ´ÂÁö¸¦ °î¼± ±×·¡ÇÁ ÇüÅ·Π±×¸°´Ù. °¡¼Ó ¼¾¼­°ªÀº Çȼ¿º¸´Ù´Â Å©±â°¡ ÀÛÀ¸¹Ç·Î 2¸¦ °öÇØ ÁøÆøÀ» ´Ù¼Ò °úÀåÇß´Ù. Áß¿äÇÑ °ÍÀº °ªÀÌ º¯ÇÏ´Â °ÍÀ» º¸¿© ÁÖ´Â °ÍÀ̹ǷΠ½ÇÁ¦°ª°ú ¿ÏÀüÈ÷ ÀÏÄ¡ÇÒ ÇÊ¿ä´Â ¾ø´Ù.

YÃàÀÇ °¡¼Ó ±×¸®±â Äڵ嵵 ÂüÁ¶ÇÏ´Â ¼¾½º°ª¸¸ ´Ù¸¦ »Ó ±¸Á¶´Â ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù. ZÃàÀº °¡¸¸È÷ ÀÖÀ» ¶§ Áß·Â °¡¼Óµµ 9.8(STANDARD_GRAVITY)ÀÇ °ªÀ» °¡Áö¹Ç·Î ÀÌ °ªÀ» »©¾ß ÇÑ´Ù. ¼¾¼­ ¸®½º³Ê´Â °¡¼Ó°ªÀ» ¹ÞÀ» ¶§¸¶´Ù ¹è¿­¿¡ °ªÀ» ÀúÀåÇÏ°í È­¸éÀ» ¹«È¿È­ÇϹǷΠÁÖ±âÀûÀ¸·Î °î¼±ÀÌ °è¼Ó ±×·ÁÁø´Ù. ¿¡¹Ä·¹ÀÌÅÍ¿¡¼­´Â ½ÇÇàÇØ ºÃÀÚ Á÷¼±¸¸ ±×·ÁÁú »Ó ¾Æ¹«·± º¯È­°¡ ¾øÀ¸¸ç ½ÇÀåºñ·Î Å×½ºÆ®ÇØ ºÁ¾ß ÇÑ´Ù. ½ÇÇà ÈÄ Àåºñ¸¦ °¢ ¹æÇâÀ¸·Î ¸¶±¸ Èçµé¾î º¸ÀÚ.

ÆùÀ» Á¿ì·Î Èçµé¸é XÃàÀÇ °¡¼ÓÀÌ º¯ÇÑ´Ù. ½ÉÇÏ°Ô Èçµé¼ö·Ï ÁøÆøÀÌ Ä¿Áö¸ç Èçµå´Â ¼Óµµ°¡ »¡¶óÁö¸é ÁÖÆļö°¡ Á¶¹ÐÇØÁø´Ù. °¡¼ÓÇÏ¸é ¿À¸¥ÂÊÀ¸·Î Èçµé¸®°í °¨¼ÓÇÏ¸é ´Ù½Ã ¿ÞÂÊÀ¸·Î Èçµé·È´Ù°¡ °á±¹Àº 0ÀÇ ÀÚ¸®·Î µ¹¾Æ¿À´Âµ¥ Èçµé¾î ºÃÀÚ °á±¹Àº Á¦ÀÚ¸®·Î µ¹¾Æ¿À±â ¶§¹®ÀÌ´Ù. YÃàÀº ÆùÀ» ¾Æ·¡, À§·Î Èçµé ¶§ ¹ÝÀÀÇϸç ZÃàÀº ÆùÀ» ÇÏ´Ã, ¶¥ ¹æÇâÀ¸·Î Èçµé ¶§ ¹ÝÀÀÇÑ´Ù. »ç¿ëÀÚ°¡ ÆùÀ» ¾î´À ¹æÇâÀ¸·Î Èçµé°í ÀÖ´ÂÁö´Â ÀÌ ÆÄÇüÀ» ºÐ¼®Çؼ­ ¾Ë¾Æ ³»¾ß ÇÑ´Ù. °á°ú¸¦ Â÷ºÐÈ÷ »ìÆ캼 ¼ö ÀÖµµ·Ï È­¸éÀ» ÅÍÄ¡Çϸé Àá½Ã ¸ØÃß´Â ±â´Éµµ ÀÛ¼ºÇØ µÎ¾ú´Ù.

3.ȸÀü Çà·Ä·ÎºÎÅÍ ¹æÇâ ±¸Çϱâ

TYPE_ORIENTATION ¼¾¼­´Â Àß µ¿ÀÛÇÏ°í ÀÌÇØÇϱ⠽±Áö¸¸ ±¸Çü ¹æ½ÄÀÌ´Ù. SDK ¹öÀü 1.5ºÎÅÍ´Â Á» ´õ Á¤È®ÇÑ ¹æÇâ ¼¾¼­°¡ Á¦°øµÈ´Ù. ÇÏÀ§ ȣȯ¼ºÀÌ À¯ÁöµÇ¹Ç·Î ÀÌÀü ¹æ½Äµµ ¿©ÀüÈ÷ »ç¿ëÇÒ ¼ö´Â ÀÖÁö¸¸ ¾ÕÀ¸·Î´Â »õ·Î ¼Ò°³µÈ ¹æ½ÄÀ» »ç¿ëÇÏ´Â °ÍÀÌ ´õ ÁÁÀ» °ÍÀÌ´Ù. »õ ¹æ½ÄÀÇ ¹æÇâ Á¤º¸´Â SensorManagerÀÇ ´ÙÀ½ Á¤Àû ¸Þ¼­µå·Î ±¸ÇÑ´Ù.

 

static float[] getOrientation (float[] R, float[] values)

 

ÀÌ ¸Þ¼­µå´Â ȸÀü Çà·Ä¿¡ ±Ù°ÅÇÏ¿© ¹æÇâ°ªÀ» °è»êÇØ ³½´Ù. ù¹ø° Àμö RÀÌ È¸Àü Çà·ÄÀÌ¸ç µÎ ¹ø° Àμö¿Í ¸®ÅÏ°ªÀº °è»êµÈ ¹æÇâ°ªÀÌ´Ù. µÎ¹ø° Àμö·Îµµ °á°ú°¡ ´ëÀԵǹǷΠ¸®ÅÏ°ªÀº ±»ÀÌ ¹ÞÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù. Å©±â 3ÀÇ ¹è¿­ÀÌ ¸®ÅÏµÇ¸ç °¢°¢ ¹æÀ§°¢, ÇÇÄ¡, ·ÑÀÌ´Ù. ±¸Çü ¹æÇâ ¼¾¼­¿Í´Â ´Þ¸® ¸®ÅÏ°ªÀº ½Ã°è ¹Ý´ë ¹æÇâÀ¸·Î Áõ°¡ÇÏ´Â ¶óµð¾È°ªÀ̹ǷΠ°¢µµ·Î º¯°æÇÏ·Á¸é º°µµÀÇ ¼ö½ÄÀ» °ÅÃÄ¾ß ÇÑ´Ù. ȸÀü Çà·ÄÀº ´ÙÀ½ Á¤Àû ¸Þ¼­µå·Î ±¸ÇÑ´Ù.

 

static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)

 

°æ»ç Çà·Ä°ú ȸÀü Çà·ÄÀ» ±¸Çϴµ¥ ÀÌ µÎ Çà·ÄÀº º¤Å͸¦ ÀåÄ¡ ÁÂÇ¥°è¿¡¼­ ¿ùµå ÁÂÇ¥°è·Î º¯È¯Çϴµ¥ »ç¿ëµÈ´Ù. °ü½É¾ø´Â °ªÀº null·Î Á־ »ó°ü¾ø´Ù. ÀÌ º¯È¯¿¡´Â º¹ÀâÇÑ Çà·Ä¼ö½ÄÀÌ Àû¿ëµÈ´Ù. gravity¿Í geomagnetic Àμö´Â °¢°¢ °¡¼Ó°è¿Í ÀÚ±â°è ¼¾¼­·Î ±¸ÇÑ °ªÀÌ´Ù. ´ÙÀ½ ¸Þ¼­µå´Â °æ»ç Çà·Ä·ÎºÎÅÍ °æ»ç°¢µµ¸¦ ±¸ÇÑ´Ù.

 

static float getInclination (float[] I)

 

Á¤È®ÇÑ ¹æÇâÀ» ±¸ÇÏ·Á¸é °¡¼Ó°è¿Í ÀÚ±â°è ¼¾¼­·ÎºÎÅÍ °ªÀ» ¹ÞÀº ÈÄ ÀÌ °ªÀ¸·Î ȸÀü Çà·ÄÀ» ±¸ÇÏ°í ȸÀü Çà·Ä·ÎºÎÅÍ ¹æÇâÀ» ´Ù½Ã ±¸ÇØ¾ß ÇÑ´Ù. ¿¹Á¦ ¼Ò½º´Â ´ÙÀ½°ú °°´Ù.

 

hard_getOrientation

public class hard_getOrientation extends Activity {

     SensorManager mSm;

     int mOrientCount;

     TextView mTxtOrient;

     float[] mGravity = null;

     float[] mGeoMagnetic = null;

 

     public void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          setContentView(R.layout.hard_getorientation);

 

          mSm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

          mTxtOrient =(TextView)findViewById(R.id.result);

     }

    

    protected void onResume() {

        super.onResume();

          mSm.registerListener(mSensorListener, mSm.getDefaultSensor(

                   Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);

          mSm.registerListener(mSensorListener, mSm.getDefaultSensor(

                   Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);

    }

   

    protected void onPause() {

        super.onPause();

        mSm.unregisterListener(mSensorListener);

    }

   

    SensorEventListener mSensorListener = new SensorEventListener() {

          public void onAccuracyChanged(Sensor sensor, int accuracy) {

          }

 

          public void onSensorChanged(SensorEvent event) {

              switch (event.sensor.getType()) {

              case Sensor.TYPE_ACCELEROMETER:

                   mGravity = event.values.clone();

                   break;

              case Sensor.TYPE_MAGNETIC_FIELD:

                   mGeoMagnetic = event.values.clone();

                   break;

              }

             

              // µÑ ´Ù Á¶»çµÇ¾î ÀÖÀ» ¶§¸¸

              if (mGravity != null && mGeoMagnetic != null) {

                 float[] R = new float[16];

                 SensorManager.getRotationMatrix(R, null, mGravity, mGeoMagnetic);

 

                 float[] values = new float[3];

                 SensorManager.getOrientation(R, values);

      

                   mTxtOrient.setText("¹æÇâ = " + mOrientCount++ + "ȸ" +

                             "\nazimuth:" + Radian2Degree(values[0]) +

                             "\npitch:" + Radian2Degree(values[1]) +

                             "\nroll:" + Radian2Degree(values[2]));

              }

          }

     };

    

     float Radian2Degree(float radian) {

          return radian * 180 / (float)Math.PI;

     }

}

 

°¡¼Ó°è¿Í ÀÚ±â°è ¼¾¼­¿¡ ´ëÇÑ ¸®½º³Ê¸¦ ¼³Ä¡ÇÏ°í ¼¾¼­·ÎºÎÅÍ Àü´ÞµÈ °ªÀ» ¸â¹ö¿¡ ÀúÀåÇØ ³õ¾Ò´Ù. µÎ °ªÀÌ ¸ðµÎ Á¶»çµÇ¾úÀ» ¶§ ÀÌ °ªÀ¸·ÎºÎÅÍ È¸Àü Çà·ÄÀ» ±¸ÇÏ°í ¹æÇâ°ªÀ» ±¸ÇØ È­¸éÀ¸·Î Ãâ·ÂÇÑ´Ù. ¶óµð¾È°ªÀº Àб⠺ÒÆíÇϹǷΠ°¢µµ·Î º¯È¯ÇÏ¿© Ãâ·ÂÇß´Ù.

±¸ÇüÀÇ ¹æÇâ ¼¾¼­·Î ±¸ÇÑ °ª°ú »ç½Ç»ó °°Àº °ªÀÌµÇ ºÎÈ£³ª °ªÀÇ ¹üÀ§°¡ Á¶±Ý ´Ù¸¦ »ÓÀÌ´Ù. ÀÌ ¹æ¹ýÀÌ Á» ´õ Á¤È®ÇÏ´Ù°í ÇÏ¸ç ¼Ò¼öÁ¡ ¾Æ·¡±îÁö Á¤È®ÇÏ°Ô Á¶»çµÇ´Â °Í °°±â´Â ÇÏ´Ù. ±×·¯³ª ·¹ÆÛ·±½º¿¡ ¼³¸íÀÌ ³Ê¹« ºÎ½ÇÇѵ¥´Ù ¹°¸®ÇÐ Áö½ÄÀÌ ºÎÁ·ÇØ ¿Ö ´õ Á¤È®ÇÑÁö´Â ¼ÖÁ÷È÷ Àß ¸ð¸£°Ú´Ù. Â÷ÈÄ ¹°¸®ÇÐÀ» Á» ´õ ¿¬±¸ÇØ ºÁ¾ß ÀÌ ¿¹Á¦ÀÇ ¼Ò½º¸¦ ¿Ïº®ÇÏ°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» µíÇÏ´Ù.

4.ÀåºñÀÇ ¹æÇâ

¼¾¼­·ÎºÎÅÍ ±¸ÇÏ´Â ¹æÇâ Á¤º¸µéÀ» ºÐ¼®Çϸé Àåºñ°¡ ÇöÀç ¾î´À ¹æÇâÀ» ÇâÇÏ°í ÀÖ´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Ù. ±×·¯³ª ¼¾¼­ ¸®½º³Ê¸¦ µî·ÏÇÏ´Â °ÍÀÌ ¹ø°Å·Ó°í ¿©·¯ °¡Áö °ªµéÀ» Á¶ÇÕÇؼ­ ÆÇ´ÜÇØ¾ß ÇϹǷΠ»ê¼ö°¡ Á¶±Ý º¹ÀâÇÏ´Ù. ´Ü¼øÈ÷ ÀåºñÀÇ °¡·Î, ¼¼·Î ¹æÇâ¿¡¸¸ °ü½ÉÀÌ ÀÖ´Ù¸é Á» ´õ ½¬¿î ÆǺ°¹ýÀÌ ÀÖ´Ù. ¿î¿µÃ¼Á¦°¡ ¹æÇâÀ» ÆǺ°ÇÏ¿© ¾×ƼºñƼÀÇ ·¹À̾ƿôÀ» ÀÚµ¿À¸·Î Àâ¾Æ Áִµ¥ ÀÌ Ã³¸®¸¦ Á÷Á¢ ÇÏ°í ½ÍÀ» ¶§´Â È­¸éÀÇ ¹æÇâÀ» Á¶»çÇØ¾ß ÇÑ´Ù.

OrientationEventListener ´Â ¼¾¼­·ÎºÎÅͺÎÅÍ Àü´ÞµÈ ¹æÇâ°ªÀ» ºÐ¼®ÇÏ¿© È­¸éÀÇ ÇöÀç °¢µµ¸¸À» ¾Ë·Á ÁÖ´Â °í¼öÁØÀÇ µµ¿ì¹Ì Ŭ·¡½ºÀÌ´Ù. »ý¼ºÀڷΠȣÃâ Áֱ⸦ ÁöÁ¤ÇÏ¸ç ¸®½º³Ê °´Ã¼¸¦ »ý¼ºÇØ ³õ°í enable ¸Þ¼­µå¸¸ È£ÃâÇϸé Áï½Ã µ¿ÀÛÇϸç È­¸é °¢µµ°¡ º¯°æµÉ ¶§¸¶´Ù ¸®½º³ÊÀÇ ´ÙÀ½ ¸Þ¼­µå·Î ÇöÀç °¢µµ¸¦ ¾Ë·ÁÁØ´Ù.

 

void onOrientationChanged (int orientation)

 

Àü´ÞµÈ °ªÀº 360ºÐ¹ýÀÇ °¢µµÀ̸ç ÀåºñÀÇ À§ÂÊÀÌ ÇÏ´ÃÀ» ÇâÇÒ ¶§, Áï ¼¼·Î ¸ðµåÀÏ ¶§ 0µµÀÌ¸ç ½Ã°è¹æÇâÀ¸·Î Áõ°¡ÇÑ´Ù. 90µµÀ̸é ÀåºñÀÇ ¿ÞÂʸéÀÌ ÇÏ´ÃÂÊÀÌ°í 180µµÀÌ¸é ¹Ø¸éÀÌ À§·Î µÚÁýÈù »óÅÂÀ̸ç 270µµÀ̸é Àåºñ ¿À¸¥ÂÊÀÌ À§¸¦ ÇâÇÏ°í ÀÖ´Â »óÅÂÀÌ´Ù. 360µµ´Â ¹°·Ð 0µµ¿Í °°´Ù. Àåºñ¸¦ ¹Ù´Ú¿¡ ÆòÆòÇÏ°Ô ´¯È÷¸é À̶§´Â °¢µµ¸¦ ¾Ë ¼ö ¾ø´Â »óÅ°¡ µÇ¸ç ORIENTATION_UNKNOWNÀÎ -1·Î Á¶»çµÈ´Ù.

ÀÌ ¸®½º³Êµµ °á±¹Àº ¼¾¼­·ÎºÎÅÍ °ªÀ» ¹Þ¾Æ °è»êÀ» ÇÏ°ÚÁö¸¸ µî·Ï, ÇØÁ¦°°Àº º¹ÀâÇÑ °úÁ¤À» °ÅÄ¡Áö ¾Ê¾Æµµ µÇ¹Ç·Î »ç¿ëÇϱâ´Â ÈξÀ ´õ °£ÆíÇÏ´Ù. ´ÙÀ½ ¿¹Á¦´Â È­¸éÀÇ ÇöÀç °¢µµ¸¦ º¸¿©ÁÖ¸ç Á¢½ÃÀÇ ¾ó±¼ À̹ÌÁö°¡ Ç×»ó ÇÏ´ÃÀ» º¸µµ·Ï Á¶Á¤ÇÑ´Ù. ¸¶Ä¡ ¿À¶Ñ±âó·³ ÇÏ´ÃÀ» ÇâÇØ ¿ì¶Ò ¼­ ÀÖ´Â ¸ð½ÀÀÌ´Ù. Àåºñ¸¦ µ¹¸± ¶§ ¾×ƼºñƼ°¡ Àç»ý¼ºµÇ¸é ¾ÈµÇ¹Ç·Î ¹æÇâÀº ¼¼·Î·Î °íÁ¤ÇØ µÎ¾ú´Ù.

 

hard_Ottogi

public class hard_Ottogi extends Activity {

     AndroBoyView mView;

    OrientationEventListener mOrientationListener = null;

    int mOrientation = -1;

   

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

          mView = new AndroBoyView(this);

          setContentView(mView);

       

        mOrientationListener = new OrientationEventListener(this,

               SensorManager.SENSOR_DELAY_FASTEST) {

            public void onOrientationChanged(int orientation) {

            mOrientation = orientation;

             mView.invalidate();

            }

        };

        mOrientationListener.enable();

    }

 

    class AndroBoyView extends View {

          int width;

          int height;

          Bitmap ottogi;

 

          public AndroBoyView(Context context) {

              super(context);

              ottogi = BitmapFactory.decodeResource(getResources(), R.drawable.ottogi);

          }

 

          public void onSizeChanged(int w, int h, int oldw, int oldh) {

            super.onSizeChanged(w, h, oldw, oldh);

              width = w;

              height = h;

        }

 

        public void onDraw(Canvas canvas) {

              Paint Pnt = new Paint();

              Pnt.setAntiAlias(true);

              Pnt.setTextSize(30);

              Pnt.setTextAlign(Align.CENTER);

 

              canvas.drawColor(Color.WHITE);

 

              int cx = width/2;

              int cy = height/2;

              if (mOrientation != OrientationEventListener.ORIENTATION_UNKNOWN) {

                   canvas.rotate(-mOrientation, cx, cy);

              }

              canvas.drawBitmap(ottogi, cx - ottogi.getWidth()/2, cy - ottogi.getHeight()/2, Pnt);

              canvas.drawText("" + mOrientation, cx, cy, Pnt);

 

          }

     }

}

 

onCreate¿¡¼­ Ä¿½ºÅÒ ºä¸¦ »ý¼ºÇÏ¿© ä¿ì°í ¹æÇâ ¸®½º³Ê °´Ã¼¸¦ »ý¼ºÇÑ´Ù. È£Ãâ Áֱ⸦ ÃÖ´ëÇÑ ºü¸£°Ô ÇÏ¿© ºÎµå·´°Ô ȸÀüÇϵµ·Ï Çߴµ¥ ½ÇÁ¦ ¿¹¿¡¼­´Â Àû´çÇÑ Áֱ⸦ ¼±ÅÃÇØ¾ß ÇÑ´Ù. ÁÖÀÇÇÒ °ÍÀÎ ÀÌ ¸®½º³Ê´Â ¾×ƼºñƼ°¡ ÃʱâÈ­µÇ¾î¾ß Á¦´ë·Î µ¿ÀÛÇÑ´Ù´Â Á¡ÀÌ´Ù. ¸®½º³Ê µî·Ï½ÃÁ¡¿¡ ¾×ƼºñƼ Á¤º¸¸¦ ÇÊ¿ä·Î ÇϹǷΠ¸â¹ö·Î »ý¼ºÇؼ­´Â ¾ÈµÇ¸ç ÃÖ¼ÒÇÑ onCreate¿¡¼­ »ý¼ºÇØ¾ß Á¦´ë·Î µ¿ÀÛÇÑ´Ù. ¸®½º³Ê °´Ã¼ »ý¼ºÇÑ ÈÄ enable ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© Áï½Ã µ¿ÀÛÇϵµ·Ï Çß´Ù.

¸®½º³Ê´Â Àü´ÞµÈ °¢µµ°ªÀ» mOrientation Çʵ忡 ÀúÀåÇØ ³õ°í ºä¸¦ ´Ù½Ã ±×¸®µµ·Ï ÇÑ´Ù. °¢µµ°¡ ¹Ù²ð ¶§¸¶´Ù °»½ÅµÈ °¢µµ°ªÀ¸·Î È­¸é Àüü¸¦ ´Ù½Ã ±×¸®´Â ¼ÀÀÌ´Ù. Ä¿½ºÅÒ ºä´Â Ãâ·ÂÇÒ ºñÆ®¸ÊÀ» ¹Ì¸® ÀÐ¾î µÎ°í onDraw¿¡¼­ ºñÆ®¸ÊÀ» Ãâ·ÂÇÑ´Ù. ĵ¹ö½º¸¦ mOrientationÀÇ ¿ª¹æÇâÀ¸·Î ȸÀüÇÑ ÈÄ È­¸é Áß¾Ó¿¡ À̹ÌÁö¿Í °¢µµ°ªÀ» Ãâ·ÂÇß´Ù. °¢µµ°¡ º¯°æµÉ ¶§ ĵ¹ö½ºÀÇ È¸Àü°ªÀÌ °°ÀÌ ¹Ù²î¹Ç·Î À̹ÌÁö´Â ¾ðÁ¦³ª ÇÏ´ÃÂÊÀ» º¸°Ô µÉ °ÍÀÌ´Ù.

¾ÈŸ±õ°Ôµµ ÀÌ ¿¹Á¦´Â ¿¡¹Ä·¹ÀÌÅÍ¿¡¼­´Â µ¿ÀÛÀ» È®ÀÎÇÒ ¼ö ¾ø´Ù. À̹ÌÁö°¡ Ãâ·ÂµÇ±â´Â ÇÏÁö¸¸ °¢µµ°¡ Ç×»ó ÀÏÁ¤ÇϹǷΠ¾Æ¹«¸® ¸ð´ÏÅ͸¦ Àâ°í Èçµé¾î ºÁ¾ß ²Þ½µµ ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ½ÇÀåºñµµ ĸó È­¸éÀ¸·Î´Â ±â¿ï¾îÁø °Í¸¸ º¸ÀÏ »Ó È­¸éÀÌ µ¹¾Æ°¡´Â°É È®ÀÎÇϱâ´Â ¾î·Æ´Ù. ±×·¡¼­ ¾î¿ ¼ö ¾øÀÌ ½ÇÀåºñÀÇ ¸ð½ÀÀ» µðÁöÅÐ Ä«¸Þ¶ó·Î Âï¾î¼­ º¸ÀδÙ.

  

¹Ù´Ú¿¡ ÆòÆòÇÏ°Ô ´©À̸é È­¸éÀÇ ¹æÇâÀ» ÆǺ°ÇÒ ¼ö ¾øÀ¸¹Ç·Î À̶§´Â -1·Î Æò°¡µÈ´Ù. °¡·Î, ¼¼·Î Àü¿ëÀÇ ÇÁ·Î±×·¥ÀÌ´õ¶óµµ ÇöÀçÀÇ È­¸é ¹æÇâÀÌ ÇÊ¿äÇÑ °æ¿ì°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î Ä«¸Þ¶óÀÇ °æ¿ì °¡·Î ¸ðµå·Î µ¿ÀÛÇÏ´õ¶óµµ ÂïÀº À̹ÌÁö°¡ ¼¼·ÎÀÎÁö, °¡·ÎÀÎÁö ÆǺ°ÇÏ¿© Exif Á¤º¸¿¡ ½á ³Ö¾î¾ß Çϴµ¥ À̶§ Á¶»çµÈ °¢µµ°ªÀ» ÂüÁ¶ÇÏ¸é µÈ´Ù. À̹ÌÁö ºä¾î´Â ÃÔ¿µ ½ÃÁ¡ÀÇ Àåºñ ¹æÇâÀ» Exif Á¤º¸¿¡¼­ ¾ò¾î À̹ÌÁöÀÇ È¸Àü ¿©ºÎ¸¦ ÀÚµ¿À¸·Î ÆǺ°ÇÑ´Ù.