2017-12-08 9 views
0

나는이 (& I hope you can get the rectangle of ones) 등의 1과 0의 행렬을 가지고 :계산 사각형의 각도 (X/Y) 개요 위치를 알고

A

을 그리고 calculate the rectangles rotation angle 싶습니다. 나는 지금 (위 그림) ' ' (공백 상징) 사각형 윤곽의 위치 (x/y-coordinates) 모두이 같은 배열을 가지고 :

var outline_positions = [[120,22],[122,22],...,[94,119],[93,119]] 
내가 함께 시작 해요 그래서

이제 내 질문 : 각도 의 직사각형의 긴면이 X-asis와 평행하다는 것을 알고 X 축에 대한 직사각형 회전 각도를 계산하는 것이 어떻게 가능합니까?

내가 가지고 있기 때문에 지금은 방법이 코드를 시작하는 아이디어는 내가 지금까지 가지고 모든입니다 다음과 같이

var positions = [[120,22],[122,22],[120,22],[121,22],[122,22],[119,23],[125,23],[119,24],[127,24],[118,25],[129,25],[118,26],[131,26],[117,27],[132,27],[117,28],[134,28],[117,29],[137,29],[116,30],[139,30],[115,31],[141,31],[115,32],[142,32],[114,33],[142,33],[113,34],[142,34],[113,35],[142,35],[112,36],[141,36],[111,37],[140,37],[111,38],[140,38],[110,39],[139,39],[109,40],[139,40],[109,41],[138,41],[108,42],[138,42],[108,43],[137,43],[106,44],[137,44],[106,45],[136,45],[105,46],[136,46],[105,47],[135,47],[104,48],[135,48],[103,49],[134,49],[103,50],[134,50],[103,51],[133,51],[102,52],[132,52],[101,53],[132,53],[100,54],[131,54],[100,55],[131,55],[99,56],[130,56],[98,57],[129,57],[97,58],[128,58],[97,59],[128,59],[96,60],[127,60],[95,61],[127,61],[95,62],[126,62],[94,63],[126,63],[94,64],[125,64],[93,65],[124,65],[92,66],[124,66],[92,67],[124,67],[91,68],[123,68],[91,69],[122,69],[90,70],[121,70],[89,71],[121,71],[89,72],[120,72],[88,73],[120,73],[87,74],[119,74],[87,75],[118,75],[86,76],[118,76],[86,77],[116,77],[85,78],[116,78],[85,79],[116,79],[83,80],[115,80],[83,81],[115,81],[82,82],[115,82],[81,83],[114,83],[81,84],[113,84],[80,85],[113,85],[80,86],[112,86],[79,87],[112,87],[78,88],[112,88],[78,89],[111,89],[78,90],[110,90],[77,91],[110,91],[76,92],[109,92],[76,93],[109,93],[75,94],[108,94],[74,95],[107,95],[74,96],[107,96],[73,97],[106,97],[73,98],[105,98],[72,99],[105,99],[72,100],[104,100],[71,101],[104,101],[70,102],[103,102],[70,103],[103,103],[69,104],[102,104],[70,105],[102,105],[72,106],[101,106],[73,107],[101,107],[75,108],[100,108],[76,109],[100,109],[77,110],[99,110],[80,111],[98,111],[81,112],[98,112],[83,113],[97,113],[84,114],[96,114],[86,115],[96,115],[88,116],[96,116],[90,117],[95,117],[91,118],[94,118],[93,119],[94,119],[94,119],[93,119]] 
 

 

 
Array.prototype.calculate_rotation = function() { 
 
var array=this 
 
var max_x = array.filter(e => e[0] === Math.max(... array.map(e => e[0])))[0]; 
 
var min_x = array.filter(e => e[0] === Math.min(... array.map(e => e[0])))[0] 
 
return max_x[1]-min_x[1] 
 
} 
 

 
console.log(positions.calculate_rotation());

답변

0

한 가지 방법이 될 수 :

function calculate_rotation(arr){ 
    var N = arr.length; 

    if(!N) return; 

    var xmin = arr[0][0]; 
    var ymin = arr[0][1]; 
    var A = arr[0]; 
    var P = arr[0]; 

    for(var i = 0; i < N; ++i){ 
     var x = arr[i][0]; 
     var y = arr[i][1]; 

     if(x < xmin || (x == xmin && y < A[1])){ 
      xmin = x; 
      A = [x, y]; 
     } 
     if(y < ymin || (y == ymin && x > P[0])){ 
      ymin = y; 
      P = [x, y]; 
     } 
    } 

    return Math.atan2(P[1] - A[1], P[0] - A[0])*180/Math.PI; 
} 

아이디어는 맨 왼쪽 (A)과 맨 아래 ()를 식별하는 것입니다.) 포인트. 회전 각도는 점 A을 기준으로 계산됩니다. 또는 배열을 통해 두 번째 패스를 수행하고 AP을 연결하는 선분에있는 모든 점을 식별하고 기울기를 얻기 위해 선형 맞춤을 수행 할 수 있습니다.

+0

안녕하세요 제 예제 코드를 보면 var max_x = array.filter (e => e [0] === Math.max (... array.map (e => e [0])) [0];var min_y = array.filter (e => e [1] === Math.min (... array.map (e => e [1]))) [0]' 직업도. 그러나이 방법을 사용하면 특정 각도에서 더 이상 작동하지 않습니다! – Jonas0000

+0

편집 전에 x & y - min 메서드가 특정 각도에서 작동하지 않습니다. – Jonas0000

+0

@ Jonas0000 사각형이 이미 축에 평행 인 경우에도 작동해야하는 메서드를 업데이트했습니다. 예를 들어, 최소 x 좌표와 함께 포인트를 찾는 것이고, 더 많은 것이 발생하면 최소 "y"좌표, 즉 "코너" – ewcz