public double getMetric(CompressedTrack t1, CompressedTrack t2, int fps) { TimeSpan dt = new TimeSpan(0, 0, 0, 0, (int)Math.Floor(1000.0 / fps)); DateTime startTime1 = t1.startTime; DateTime startTime2 = t2.startTime; DateTime endTime1 = t1.endTime; DateTime endTime2 = t2.endTime; //is there any overlap at all? if (startTime1 > endTime2 || startTime2 > endTime1) { return(0); } //find overlap times DateTime commonStartTime = startTime1; if (startTime2 > startTime1) { commonStartTime = startTime2; } DateTime commonEndTime = endTime1; if (endTime2 < endTime1) { commonEndTime = endTime2; } //now compute the integral double sum = 0; for (DateTime t = commonStartTime; t <= commonEndTime; t += dt) { SpaceTime l1 = t1.getSpaceTimeAt(t); SpaceTime l2 = t2.getSpaceTimeAt(t); double overlap = BoundingBox.ComputeOverlapArea(l1.region, l2.region); sum += (overlap * dt.Milliseconds) / 1000; //pixel-sec } return(sum); }
public double getMetric(CompressedTrack t1, CompressedTrack t2, int fps) { TimeSpan dt = new TimeSpan(0, 0, 0, 0, (int)Math.Floor(1000.0 / fps)); DateTime startTime1 = t1.startTime; DateTime startTime2 = t2.startTime; DateTime endTime1 = t1.endTime; DateTime endTime2 = t2.endTime; //is there any overlap at all? if (startTime1 > endTime2 || startTime2 > endTime1) { return(0); } //find overlap times DateTime commonStartTime = startTime1; if (startTime2 > startTime1) { commonStartTime = startTime2; } DateTime commonEndTime = endTime1; if (endTime2 < endTime1) { commonEndTime = endTime2; } if (commonEndTime - commonStartTime < dt) { return(0); } //now compute the integral double IntersectionVolume = 0; for (DateTime t = commonStartTime; t <= commonEndTime; t += dt) { SpaceTime l1 = t1.getSpaceTimeAt(t); SpaceTime l2 = t2.getSpaceTimeAt(t); double overlap = BoundingBox.ComputeOverlapArea(l1.region, l2.region); IntersectionVolume += (overlap * dt.Milliseconds); } double UnionVolume = 0; for (DateTime t = startTime1; t <= endTime1; t += dt) { SpaceTime l1 = t1.getSpaceTimeAt(t); UnionVolume += (l1.region.ComputeArea() * dt.Milliseconds); } for (DateTime t = startTime2; t <= endTime2; t += dt) { SpaceTime l2 = t2.getSpaceTimeAt(t); UnionVolume += (l2.region.ComputeArea() * dt.Milliseconds); } UnionVolume -= IntersectionVolume; return(IntersectionVolume / UnionVolume); }