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)); } }
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); } }