知道轮廓位置(x / y)计算矩形角度

时间:2017-12-08 17:02:21

标签: javascript math position angle

我有一个像这样的一个零和一个零的矩阵(& I hope you can get the rectangle of ones):

A

我想calculate the rectangles rotation angle

所以我开始:我现在所有矩形的(x/y-coordinates)位置(在上图中用' '(空格)符号表示)并将它们放在一个数组中像这样:

var outline_positions = [[120,22],[122,22],...,[94,119],[93,119]]
  

所以现在我的问题是:如何知道角度为的矩形的长边与x轴平行,如何计算X轴的矩形旋转角度X-asis?

因为我现在知道如何启动此代码是我到目前为止的所有内容:



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());




1 个答案:

答案 0 :(得分: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)和最底部(P)点。然后相对于点A计算旋转角度。或者,可以在阵列中进行第二次传递,识别连接AP的线段上的所有点,并进行线性拟合以获得斜率。