/**
 * Add used area (circle) near target object excluded from possible searcher position
 *
 *
 * @param size  Size of used circle
 * @param angle Angle of used circle center point from target-searcher line
 * @param dist  Distance from target object center point to used circle center point
 *
 * Used circles data stored as projections to searcher dist size circle as angle coordinate and half angle size
 */
void ObjectPosSelector::AddUsedArea(float size, float angle, float dist)
{
    float sr_dist = size + m_searcherSize;

    //  by Law of cosines, angle of searcher/used centers
    float sr_angle = acos((m_searcherDist * m_searcherDist + dist * dist - sr_dist * sr_dist) / (2 * m_searcherDist * dist));

    // skip some unexpected results.
    if (!finite(sr_angle) || sr_angle <= 0)
        return;

    if (angle >= 0)
        m_UsedAreaLists[USED_POS_PLUS].insert(UsedArea(angle, sr_angle));
    else
        m_UsedAreaLists[USED_POS_MINUS].insert(UsedArea(-angle, sr_angle));
}
/**
 * Add used area (circle) near target object excluded from possible searcher position
 *
 *
 * @param obj  Object that occupies area
 * @param angle Angle of used circle center point from target-searcher line
 * @param dist  Distance from target object center point to used circle center point
 *
 * Used circles data stored as projections to searcher dist size circle as angle coordinate and half angle size
 */
void ObjectPosSelector::AddUsedArea(WorldObject const* obj, float angle, float dist)
{
    MANGOS_ASSERT(obj);

    // skip some unexpected results.
    if (dist == 0.0f)
        return;

    // (half) angle that obj occupies
    float sr_angle = atan(OCCUPY_POS_ANGLE_ATAN_FACTOR * obj->GetObjectBoundingRadius() / dist);

    if (angle >= 0)
        m_UsedAreaLists[USED_POS_PLUS].insert(UsedArea(angle, OccupiedArea(sr_angle, obj)));
    else
        m_UsedAreaLists[USED_POS_MINUS].insert(UsedArea(-angle, OccupiedArea(sr_angle, obj)));
}