void Update()
    {
        // solves current problem
        if (Input.GetKeyDown("p"))
        {
            InitVCProblem();
            ComputeAndShowCamera();
            DisplaySolutions(psoSolver.candidates, false);
        }

        // evaluates current camera against current problem
        if (Input.GetKeyDown("e"))
        {
            InitVCProblem();
            EvaluateCamera();
        }

        // show visibility points of current targets
        if (Input.GetKeyDown("l"))
        {
            InitVCProblem();

            foreach (Vector3 p in camLibCam.targets[0].visibilityPoints)
            {
                GameObject newView = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                newView.transform.position   = p;
                newView.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
            }
        }

        // test satisfaction n times on random cameras
        if (Input.GetKeyDown("t"))
        {
            InitVCProblem();

            float beginTime = Time.realtimeSinceStartup;

            for (int i = 0; i < 10000; i++)
            {
                camLibCam.EvaluateSatisfaction(cameraDomain.ComputeRandomViewpoint(6), 0.0001f);
            }

            float endTime = Time.realtimeSinceStartup;

            Debug.Log("10000 evaluations in " + (endTime - beginTime) + " seconds.");
        }

        // initializes candidates and shows them
        if (Input.GetKeyDown("i"))
        {
            InitVCProblem();
            psoSolver.evaluator = camLibCam;
            psoSolver.InitializeCandidates(new List <CLCandidate> ());
            DisplaySolutions(psoSolver.candidates, false);
        }

        // finds a camera that satisfies a size property
        if (Input.GetKeyDown("c"))
        {
            InitVCProblem();
            float distance = camLibCam.targets [0].ComputeDistanceFromSize(0.5f, CLSizeProperty.SizeMode.HEIGHT, camLibCam,
                                                                           camLibCam.unityCamera.fieldOfView);
            Debug.Log(distance);
            Vector3 pos = camLibCam.targets [0].ComputeWorldPosFromSphericalCoordinates(distance, 0.99F * 2 * Mathf.PI, Mathf.PI / 2);
            camLibCam.unityCamera.transform.position = pos;
            camLibCam.unityCamera.transform.LookAt(camLibCam.targets [0].boundingBox.center);
        }
    }