High-Level Control of Simulated Crowds: Directing Agent-based Crowds by means of General Constraints