달력

05

« 2018/05 »

  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  

Android - 두 선 사이의 각도 구하는 공식

|

제목 그래도 두 점이 아닌 두 선 사이의 거리를 구하는 공식입니다.


공식은 아래 사이트에서 있는 내용을 그대로 적용하였습니다.

출처:http://blog.naver.com/PostView.nhn?blogId=elkiss&logNo=140046040911&viewDate=&currentPage=1&listtype=0


import java.nio.FloatBuffer;


public class VertexMath {

public static double getAngle(FloatBuffer line1 , FloatBuffer line2){

float line1VecX = line1.get(3) - line1.get(0);

float line1VecY = line1.get(4) - line1.get(1);

float line2VecX = line2.get(3) - line2.get(0);

float line2VecY = line2.get(4) - line2.get(1);

return ArcCalc(line1VecX, line1VecY,line2VecX,line2VecY);

}

private static double ArcCalc(double vec1X,double vec1Y , double vec2X ,double vec2Y){

double angle = 0.0f;

double inner = (vec1X*vec2X + vec1Y*vec2Y);// 기본내적

double i1= Math.sqrt(vec1X*vec1X+ vec1Y*vec1Y); // 처음 직선의 노말라이즈 준비

double i2= Math.sqrt(vec2X*vec2X+ vec2Y*vec2Y); // 두번째 직선의 노말라이즈 준비

vec1X=(vec1X/i1); // 각 요소를 단위 벡터로 변환한다.

vec1Y=(vec1Y/i1);

vec2X=(vec2X/i2);

vec2Y=(vec2Y/i2);

//위 과정을 거치면 결과적으로 계산된 두 직선의 크기는 1이면서 방향은 이전과 같은 단위벡터가 된다.

inner =(vec1X*vec2X + vec1Y*vec2Y); //다시 내적을 구한다.

angle = Math.acos(inner)*180/Math.PI;

// 아크 코사인을 통해 라디안을 구하고 그걸 각도로 변환하기 위해 180을 곱하고 파이로나눈다.

if(vec1X > vec2X) angle=360-angle;//?? 이게 아닌거 같다.

// 사이각은 최대 0-180도 사이마 존재함으로 입력된 x값을 참조하여 360에 가까운 값으로 변환하는 과정을 거친다.

return angle;

}

}


FloatBuffer는 직선을 그리는 벡터로써

float [] lineIdx = {

// x , y , z

1.0f, 1.0f, 0,

1.0f, -1.0f, 0,

};

위 배열을 FloatBuffer로 바꿔서 사용하였습니다.

FloatBuffer로 바꾸는 소스는 다음과 같습니다.

ByteBuffer vbb = ByteBuffer.allocateDirect( lineIdx.length * 4);

vbb.order(ByteOrder.nativeOrder());

FloatBuffer vertexBuffer = vbb.asFloatBuffer();

vertexBuffer.clear();

vertexBuffer.put(lineIdx);

vertexBuffer.position(0);

그럼 좋은 정보가 되셨길 빌며~

오늘도 즐코딩 하세요~^^

Posted by mapagilove