gpt4 book ai didi

arrays - 重新排序 perl 数组中的对

转载 作者:行者123 更新时间:2023-12-04 10:43:16 29 4
gpt4 key购买 nike

我有一系列从另一个程序提供给 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 编写它的最佳方式。是否有一种更优雅、更“perly”的方式来按顺序编写此更改?对 $n 有用的东西最好是二维对。这不是一个简单的反转数组元素的问题。

最佳答案

最后几行可以使用数组切片重写:

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

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

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

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

关于arrays - 重新排序 perl 数组中的对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7159062/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com