Постоянный случайный цвет - PullRequest
0 голосов
/ 14 февраля 2012

В таблице, в которой есть столбцы с датами до и от, я выделяю перекрытия между строками с учетом периодов, это делается исчерпывающе во вложенных циклах. Это не проблема. Мне нужен тот же цвет для строк, которые перекрываются.

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 и 2 спарены, как задумано

Когда и как выбирать цвета, чтобы разные цвета применялись только к разным перекрытиям?

продолжение первого ответа; как я могу представить перекрытия, чтобы сохранить их в структуре данных, чтобы я мог их раскрасить после их обнаружения?

1 Ответ

1 голос
/ 14 февраля 2012

Вам придется сравнивать каждый интервал с каждым интервалом и помещать их в «корзины», когда они равны.Теперь, когда вы сравниваете интервал с третьим интервалом, вы помещаете третий в тот же интервал, что и интервал.

Затем вы печатаете сегменты.1007 *

Об обнаружении перекрытия

Нет перекрытия, если

  • date1_to
  • date2_to

Или, в Perl:

if ($date_to1 lt $date_from2 || $date_to2 lt $date_from1) {
#overlap
}

Инвертировать, используя либо Perl's unless, либо де Моргана:

if ($date_to1 ge $date_from2 && $date_to2 ge $date_from1) {
#overlap
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...