Example #1
0
float
HeatMap_Calc_Proximity_Boost_IMP(HeatMap *self, Span *span1, Span *span2) {
    HeatMapIVARS *const ivars = HeatMap_IVARS(self);
    int32_t comparison = Span_Compare_To(span1, (Obj*)span2);
    Span *lower = comparison <= 0 ? span1 : span2;
    Span *upper = comparison >= 0 ? span1 : span2;
    int32_t lower_end_offset = Span_Get_Offset(lower) + Span_Get_Length(lower);
    int32_t distance = Span_Get_Offset(upper) - lower_end_offset;

    // If spans overlap, set distance to 0.
    if (distance < 0) { distance = 0; }

    if (distance > (int32_t)ivars->window) {
        return 0.0f;
    }
    else {
        float factor = (ivars->window - distance) / (float)ivars->window;
        // Damp boost with greater distance.
        factor *= factor;
        return factor * (Span_Get_Weight(lower) + Span_Get_Weight(upper));
    }
}
Example #2
0
float
HeatMap_calc_proximity_boost(HeatMap *self, Span *span1, Span *span2)
{
    int32_t comparison = Span_Compare_To(span1, (Obj*)span2);
    Span *lower = comparison <= 0 ? span1 : span2;
    Span *upper = comparison >= 0 ? span1 : span2;
    int32_t lower_end_offset = lower->offset + lower->length;
    int32_t distance = upper->offset - lower_end_offset;

    // If spans overlap, set distance to 0. 
    if (distance < 0) distance = 0;

    if (distance > (int32_t)self->window) {
        return 0.0f;
    }
    else {
        float factor = (self->window - distance) / (float)self->window;
        // Damp boost with greater distance. 
        factor *= factor; 
        return factor * (lower->weight + upper->weight);
    }
}