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