MarkerIndex[] IEnvironment.matchByPosition(Vector3[] rays, Vector3 origin)
    {
        float sqrTolerance = 0.02f;
        var   res          = Enumerable.Repeat(MarkerIndex.Unknown, rays.Length).ToArray();


        Vector2 shift       = new Vector2(origin.x, origin.z);
        var     projections = projectRaysOnFloor(rays, origin.y).Select(p => p + shift).ToList();

        for (int idMarker = 0; idMarker < 3; ++idMarker)
        {
            for (int idProjection = 0; idProjection < rays.Length; ++idProjection)
            {
                int numMatches = 0;
                if ((_markers[idMarker] - projections[idProjection]).sqrMagnitude < sqrTolerance)
                {
                    res[idProjection].value = (uint)idMarker;
                    ++numMatches;
                }

                if (numMatches > 1)
                {
                    res[idProjection] = MarkerIndex.Invalid;
                }
            }
        }

        lock (_visobject)
        {
            _machPos = new MatchByPositionVisualization(rays.ToList(), origin, res);
        }
        return(res);
    }
 public MatchByPositionVisualization(MatchByPositionVisualization other)
 {
     rays           = other.rays.ToList();
     origin         = other.origin;
     markersIndices = other.markersIndices.ToList();
 }
    void Update()
    {
        MatchByPositionVisualization positionsonfloor = _dyamicuser.getMatchByPositionVisualization();

        if (positionsonfloor != null)
        {
            transform.position = new Vector3(positionsonfloor.origin.x, positionsonfloor.origin.y, positionsonfloor.origin.z);
        }
        if (axes == RotationAxes.MouseXAndY)
        {
            rotationX += Input.GetAxis("Mouse X") * sensitivityX;
            rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
            rotationX  = ClampAngle(rotationX, minimumX, maximumX);
            rotationY  = ClampAngle(rotationY, minimumY, maximumY);
            Quaternion xQuaternion = Quaternion.AngleAxis(rotationX, Vector3.up);
            Quaternion yQuaternion = Quaternion.AngleAxis(rotationY, -Vector3.right);
            transform.localRotation = originalRotation * xQuaternion * yQuaternion * _offset;
        }
        else if (axes == RotationAxes.MouseX)
        {
            rotationX += Input.GetAxis("Mouse X") * sensitivityX;
            rotationX  = ClampAngle(rotationX, minimumX, maximumX);
            Quaternion xQuaternion = Quaternion.AngleAxis(rotationX, Vector3.up);
            transform.localRotation = originalRotation * xQuaternion;
        }
        else
        {
            rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
            rotationY  = ClampAngle(rotationY, minimumY, maximumY);
            Quaternion yQuaternion = Quaternion.AngleAxis(-rotationY, Vector3.right);
            transform.localRotation = originalRotation * yQuaternion * _offset;
        }

        transform.TransformDirection(transform.localRotation.eulerAngles);

        if (Input.GetKey(KeyCode.LeftArrow))
        {
            //  transform.position += Vector3.left * speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            // transform.position += Vector3.right * speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.Translate(0, 0, speed * Time.deltaTime, Space.Self);
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.Translate(0, 0, -speed * Time.deltaTime, Space.Self);
        }
        transform.position = new Vector3(transform.position.x, height, transform.position.z);

        if (_currentTest != null && _lastPosition != null)
        {
            float distance = Vector3.Distance(_lastPosition, transform.position);
            if (distance > 0)
            {
                float change = (distance / _currentTest.Distance) * _currentTest.MaxAngle;
                ApplyManipulation(change);
            }
        }

        _lastPosition = transform.position;
    }