一致的随机颜色突出显示

时间:2012-02-14 14:12:59

标签: perl

在一个表格中,我有来自和来自日期的列,我在考虑周期的行之间突出显示重叠,这在嵌套循环中详尽地完成。这不是问题。 对于重叠的行,我需要相同的颜色。

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按预期配对。

何时以及如何选择颜色,以便不同的颜色仅适用于不同的重叠?

跟进第一个答案;我如何表示重叠以便将它们存储在数据结构中,以便我可以在检测到后对它们进行着色?

1 个答案:

答案 0 :(得分:1)

您必须将每个间隔与每个其他间隔进行比较,并在它们相等时将它们放入“桶”中。现在,当您将间隔与第三个间隔进行比较时,您将第三个间隔放在与该间隔相同的桶中。

然后你打印桶。

Perl的哈希会产生精美的桶。

关于重叠检测

如果

没有重叠
  • date1_to&lt; date2_from OR
  • date2_to&lt; date1_from

或者,在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
}