【问题标题】:Calculate rectangles angle knowing the outline positions (x/y)知道轮廓位置 (x/y) 计算矩形角度
【发布时间】:2017-12-08 17:02:21
【问题描述】:

我得到了一个这样的 1 和 0 矩阵 (& I hope you can get the rectangle of ones):

我想calculate the rectangles rotation angle

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

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

所以现在我的问题是:知道矩形的长边在角度 与 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());

【问题讨论】:

    标签: javascript math position angle


    【解决方案1】:

    一种方法可能如下:

    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 的线段上的所有点,然后进行线性拟合以获得斜率。

    【讨论】:

    • 嘿,请看我上面的示例代码var max_x = array.filter(e =&gt; e[0] === Math.max(... array.map(e =&gt; e[0])))[0]; var min_y = array.filter(e =&gt; e[1] === Math.min(... array.map(e =&gt; e[1])))[0] 我认为这些行也适用于这项工作。但是使用这种方法将不再适用于特定角度!
    • 就像我在您编辑之前提到的那样,x & y - min 方法不适用于特定角度。
    • @Jonas0000 我已经更新了即使矩形已经平行于轴也应该有效的方法 - 想法是寻找一个点,例如,最小x-coordinate,如果有碰巧更多,然后取最小y-坐标的那个,即“角落”
    猜你喜欢
    • 2012-11-04
    • 2020-05-25
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多