public EyeMoveCalculation CalculateSaccadeParams(EyeMove saccadePosition, EyeMoveTypes eyeMoveType)
        {
            var frameCount = Math.Abs(saccadePosition.EyeEndIndex - saccadePosition.EyeStartIndex); //+ 1;

            var duration         = frameCount / this.trackerFrequency;
            var spotEyeIndexDiff = Math.Abs(saccadePosition.EyeStartIndex - saccadePosition.SpotMove.SpotStartIndex);
            var latency          = (spotEyeIndexDiff / this.trackerFrequency);

            double[] saccadeCoords;

            if (eyeCoords.Length > 1)
            {
                saccadeCoords = eyeCoords.Skip(saccadePosition.EyeStartIndex).Take(Math.Abs(saccadePosition.EyeEndIndex - saccadePosition.EyeStartIndex) + 1).ToArray();
            }
            else
            {
                saccadeCoords = eyeCoords;
            }

            var spotLenght = (saccadePosition.SpotMove.SpotEndIndex - saccadePosition.SpotMove.SpotStartIndex);
            var spotMove   = spotCoords.Skip(saccadePosition.SpotMove.SpotStartIndex).Take(spotLenght).ToArray();

            var eyeMoveDistancesOnScreen  = CountOnScreenDistance(saccadeCoords);
            var multipiedDistanceOnScreen = eyeMoveDistancesOnScreen.Sum();
            var spotMoveDistanceOnScreen  = CountOnScreenDistance(spotMove).Sum();

            var tangens      = multipiedDistanceOnScreen / this.distanceFromScreen;
            var ampInRadians = Math.Atan(tangens);
            var amplitude    = Math.Round(RadianToDegree(ampInRadians));

            var maxEyeDistance   = eyeMoveDistancesOnScreen.Max();
            var movePrecentage   = (maxEyeDistance / multipiedDistanceOnScreen) * 100;
            var maxAmpPercentage = (amplitude / 100) * movePrecentage;
            var maxVelocity      = maxAmpPercentage / 0.016; /* 0.016 = one frame*/

            var velocity = amplitude / duration;
            var gain     = multipiedDistanceOnScreen / spotMoveDistanceOnScreen;

            return(new EyeMoveCalculation
            {
                EyeMove = saccadePosition,
                LatencyFrameCount = Convert.ToInt32(spotEyeIndexDiff),
                DurationFrameCount = Convert.ToInt32(frameCount),
                Latency = Math.Round(latency, 3),
                Duration = Math.Round(duration, 3),
                Distance = Math.Round(multipiedDistanceOnScreen, 3),
                Amplitude = amplitude,
                AvgVelocity = Math.Round(velocity, 0),
                MaxVelocity = Math.Round(maxVelocity, 0),
                Gain = Math.Round(gain, 2)
            });
        }
예제 #2
0
        public static EyeMove GetSaccadePositionItem(int id, int saccadeStartIndex, int saccadeEndIndex, EyeMove prevoiusSaccadeItem, ResultData results)
        {
            var eyeMove = new EyeMove
            {
                Id            = id,
                IsStartFound  = prevoiusSaccadeItem.IsStartFound,
                EyeStartIndex = saccadeStartIndex,
                EyeStartTime  = results.TimeDeltas[saccadeStartIndex],
                EyeStartCoord = results.EyeCoords[saccadeStartIndex],

                IsEndFound  = prevoiusSaccadeItem.IsEndFound,
                EyeEndIndex = saccadeEndIndex,
                EyeEndTime  = results.TimeDeltas[saccadeEndIndex],
                EyeEndCoord = results.EyeCoords[saccadeEndIndex],

                SpotMove = prevoiusSaccadeItem.SpotMove
            };

            eyeMove = EyeMoveSearchToolBox.CountTestValuesForEyeMove(eyeMove, results);
            return(eyeMove);
        }