2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

プログラミングのお題スレ Part17

245 :デフォルトの名無しさん:2020/04/19(日) 15:33:55 ID:xgV79Bs/.net
>>186 Perl5、P0-P2-P4-P1-P3が凸五角形であるか、で判定

@t = ([[0,0], [1,2], [2,0], [0,1], [2,1]],
   [[0,0], [1,2], [2,0], [0,2], [2,2]],
   [[0,0], [0,1], [1,2], [2,1], [2,0]],
   [[0,0], [5,5], [0,5], [1,0], [1,6]],
   [[0,1], [0,0], [1,0],[-1,-2],[-2,-1]]
   );
@s = qw{0 2 4 1 3 0 2};
use PDL;
use PDL::Math;
use PDL::Constants qw(PI);
use feature 'signatures';
sub f($v1, $v2) {
 my $sp = sum $v1 * $v2;
 $v2 = -$v2 if $sp < 0.0;
 my $ang = asin det pdl $v1 , $v2;
 $ang = $ang >= 0.0 ? -PI + $ang : PI + $ang if $sp < 0.0;
 $ang
}
for $ps (@t) {
 @vs = map{pdl $ps->[$s[$_]]} 0..6;
 @es = map{norm($vs[$_+1] - $vs[$_])} 0..5;
 $angs = pdl map{f $es[$_], $es[$_+1]} 0..4;
 $ans = 'true';
 $ans = 'false' if (grep{abs $angs->at($_) < 0.0001} 0..4)
            or $angs->min * $angs->max < 0.0;
 $ttl = sum $angs;
 $ans = 'false' if abs $ttl < 6.28 or abs $ttl > 6.29;
 print "$ttl = Σ$angs: $ans\n";
}

総レス数 1004
265 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★