加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

数组 – 在perl数组中重新排序对

发布时间:2020-12-15 21:55:57 所属栏目:大数据 来源:网络整理
导读:我有一系列二维坐标从另一个程序提供给perl程序.其中有4个,它们组成一个四边形,共计8个数字,例如: x1 y1 x2 y2 x3 y3 x4 y4 我想确保它们都以相同的顺序指定,即顺时针或逆时针.我已经知道如何做到这一点,并通过查看交叉产品的标志来做到这一点. use strict;
我有一系列二维坐标从另一个程序提供给perl程序.其中有4个,它们组成一个四边形,共计8个数字,例如:

x1 y1 x2 y2 x3 y3 x4 y4

我想确保它们都以相同的顺序指定,即顺时针或逆时针.我已经知道如何做到这一点,并通过查看交叉产品的标志来做到这一点.

use strict;
use warnings;

my $line = "-0.702083 0.31 -0.676042 -0.323333 0.74375 -0.21 0.695833 0.485";
my @coord = split(/[,s]+/,$line);

# Vector cross product (Z is 0) to test CW/CCW
my @v1 = (-$coord[2]+$coord[0],-$coord[3]+$coord[1]);
my @v2 = (-$coord[2]+$coord[4],-$coord[3]+$coord[5]);
my $cross = ($v1[0]*$v2[1]) - ($v1[1]*$v2[0]);

一旦我确定订单是否需要更改,我目前使用以下方式更改它:

@coord = ($coord[6],$coord[7],$coord[4],$coord[5],$coord[2],$coord[3],$coord[0],$coord[1]) if ($cross < 0);

这有效,但我很确定这不是用perl编写它的最好方法.是否有一种更优雅,“更好”的方式来按顺序编写这种变化?最适合$n-2-pair的东西.这不是一个简单的反转数组问题的元素.

解决方法

可以使用数组切片重写最后几行:
@coord = @coord[6,7,4,5,2,3,1] if $cross < 0;

要处理任意数量的对,可以使用List :: MoreUtils :: natatime

use List::MoreUtils 'natatime';   

my $it = natatime 2,@coord;
@coord = (); 

while (my @vals = $it->()) {
    unshift @coord,@vals;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读