在一个表格中,我有来自和来自日期的列,我在考虑周期的行之间突出显示重叠,这在嵌套循环中详尽地完成。这不是问题。 对于重叠的行,我需要相同的颜色。
sub highlight_overlaps {
my $date_from1;
my $date_to1;
my $date_from2;
my $date_to2;
my $i = 0;
my $j = 0;
for ($i; $i < $#DATE_HOLDER; $i++) {
$date_from1 = $DATE_HOLDER[$i][0];
$date_to1 = $DATE_HOLDER[$i][1];
my $red = int(rand(65)) + 190;
my $green = int(rand(290)) - 55;
my $blue = int(rand(290)) - 55;
for ($j=$i+1; $j<=$#DATE_HOLDER; $j++) {
$date_from2 = $DATE_HOLDER[$j][0];
$date_to2 = $DATE_HOLDER[$j][1];
if (($date_from1 le $date_to2 && $date_to1 ge $date_to2) ||
($date_from1 le $date_from2 && $date_to1 le $date_to2) ||
($date_from1 gt $date_from2 && $date_from1 lt $date_to2)) {
$tb->setCellStyle($i+2, 6, "background-color:rgb($red,$green,$blue);font-size:9pt");
$tb->setCellStyle($i+2, 7, "background-color:rgb($red,$green,$blue);font-size:9pt");
$tb->setCellStyle($j+2, 6, "background-color:rgb($red,$green,$blue);font-size:9pt");
$tb->setCellStyle($j+2, 7, "background-color:rgb($red,$green,$blue);font-size:9pt");
}
}
}
}
如果它只是一对日期,这可以正常工作;说:
1)25-06-2012 27-06-2012
2)18-06-2012 29-06-2012
将获得相同的颜色
如果我有
0)26-06-2012 28-06-2012
1)25-06-2012 27-06-2012
2)18-06-2012 29-06-2012
0将获得不同的颜色,而1&amp; 2按预期配对。
何时以及如何选择颜色,以便不同的颜色仅适用于不同的重叠?
跟进第一个答案;我如何表示重叠以便将它们存储在数据结构中,以便我可以在检测到后对它们进行着色?
答案 0 :(得分:1)
您必须将每个间隔与每个其他间隔进行比较,并在它们相等时将它们放入“桶”中。现在,当您将间隔与第三个间隔进行比较时,您将第三个间隔放在与该间隔相同的桶中。
然后你打印桶。
Perl的哈希会产生精美的桶。
如果
没有重叠或者,在Perl中:
if ($date_to1 lt $date_from2 || $date_to2 lt $date_from1) {
#overlap
}
使用Perl的unless
或使用de Morgan反转:
if ($date_to1 ge $date_from2 && $date_to2 ge $date_from1) {
#overlap
}