Let's see... The offset between two consecutive intervals is $start + $end + $period
. The start of interval k
is therefore at k * ($start + $end + $period) + $start
. By dividing x
from a given Interval (new Interval(x, y)
) by $start + $end + $period
we can calculate our k
:
// this is should be integer division...
$k = ($interval->start - $period->interval->start)
/ ($period->interval->start + $period->interval->end + $period->period);
Now we can calculate the bounds of interval k
and check if the given interval is inside of it.
$kStart = $k * (
$period->interval->start + $period->interval->end + $period->period
) + $period->interval->start;
$kEnd = $kStart + ($period->interval->end - $period->interval->start);
return $kStart <= $interval->start && interval->end <= $kEnd;
This yields the following with the period and the first interval from your question:
$k = (15 - 0) / (0 + 4 + 10) = 15 / 14 = 1
$kStart = 1 * (0 + 4 + 10) + 0 = 1 * 14 + 0 = 14
$kEnd = 14 + (4 - 0) = 18
return (14 <= 15 && 16 <= 18) // true
The values for the remaining intervals are:
iStart | iEnd | k | kStart | kEnd | result
-------+------+---+--------+------+-------
29 | 32 | 2 | 28 | 32 | true
3 | 5 | 0 | 0 | 4 | false
17 | 29 | 1 | 14 | 18 | false
11 | 12 | 0 | 0 | 4 | false
20 | 27 | 1 | 14 | 18 | false