#Прямоугольные AOIs в формате "Номер AOI"-"x1(лев-верх)"-"y1(лев-верх)"-
#                             "x2(прав-ниж)"-"y2(прав-ниж)"-"Заметка"
#в экранных координатах
states<-data.frame(AOI=1:10, x1=NA,y1=NA,x2=NA,y2=NA, note=NA)
states[2]=c(525,625,735,525,625,735,525,625,735,415)
states[3]=c(290,290,290,350,350,350,410,410,410,545)
states[4]=c(590,690,800,590,690,800,590,690,800,930)
states[5]=c(345,345,345,405,405,405,475,475,475,740)
states[1:9,6]="task" #Матрица Равена
states[10,6]="vars" #Ответы

#Наложение областей интереса на график
ShowAOIs <- function(states)
{
  for (i in 1:nrow(states))
  {
    x = c(states$x1[i],states$x1[i],states$x2[i],states$x2[i],states$x1[i]);
    y = c(states$y1[i],states$y2[i],states$y2[i],states$y1[i],states$y1[i]);
    points(x,y,col="red",type="l");
  }
}

#Считываем траектории последовательность точек
trajectory = read.csv("E://RDir/eyet_2.txt", sep = "\t", header = T,comment.char = "#")

#Создадим набор координат точек фиксации
indata = data.frame(x=as.integer(trajectory$R.POR.X..px.),y=as.integer(trajectory$R.POR.Y..px.))

#Определяем, в какую зону интереса попала точка
#Функция работает с предварительно обработанными точками, можно добавить также время
classify <- function(input,states)
{
  #Создадим переменную для хранения классифицированных точек
  out=data.frame(state=NA,x=NA,y=NA);
  #Переменная-флаг (попала ли точка в какой-нибудь AOI)
  classified = FALSE;
  #Для каждой из AOI будем сравнивать координаты углов с координатами точек
  for (i in 1:nrow(input)) #Проходим по каждой точке
  { 
    for (j in 1:nrow(states)) #Сравниваем с каждой AOI
      if ((input$x[i]>states$x1[j])&(input$x[i]<states$x2[j])&(input$y[i]>states$y1[j])&(input$y[i]<states$y2[j]))
      {
        out[i,]=c(j,input$x[i],input$y[i]);
        classified=TRUE;
        break;#Если точка попала в какую-либо AOI, выходим из цикла
      }
    if(!classified) out[i,]=c(0,0,0); #Если точка не попала ни в одну из AOI, указываем зону как (0,0,0)
    classified=FALSE;
  }
  return(out); #Возвращаем классифицированные точки с соответствующими зонами интереса
}

#Просматриваем результат классификации
cld = classify(indata[complete.cases(indata),], states)
head(cld$state,n=20)
##  [1] 0 0 5 0 8 5 8 8 8 8 8 8 8 8 8 8 8 8 8 8
#Вычисление SR-матрицы
getSR <- function(states, classified, alpha, gamma)
{
  #Размер матрицы - кол-во AOI 
  size = nrow(states);
  #Вектор полученных AOIs
  if (is.data.frame(classified))
    cv = classified$state #Classified_Vector
  else if (is.vector(classified))
    cv=classified;
  #Генерируем единичную матрицу I нужного размера
  I = diag(1,size);
  #Инициализируем новую SR-матрицу
  SR = matrix(0,size,size);
  #Заполняем матрицу данными
  for (i in 1:(length(cv)-1))
    if ((cv[i]!=0)&(cv[i+1]!=0))
      SR[,cv[i]] = SR[,cv[i]]+alpha*(I[,cv[i+1]]+gamma*SR[,cv[i+1]]-SR[,cv[i]]);
  #Выдаем полученную матрицу
  return(SR);
}

#Вычисляем SR-матрицу
SR = getSR(states,cld,0.233,0.255)
SR
##            [,1]         [,2]         [,3]      [,4]         [,5]
##  [1,] 1.1965052 1.424645e-04 0.000000e+00 0.1476906 0.000000e+00
##  [2,] 0.0000000 1.337637e+00 1.716227e-11 0.0000000 2.440034e-06
##  [3,] 0.0000000 0.000000e+00 1.057387e+00 0.0000000 2.618682e-02
##  [4,] 0.0594864 1.478388e-03 1.554500e-11 1.0826974 1.958572e-07
##  [5,] 0.0000000 1.989836e-03 2.048663e-05 0.0000000 6.056572e-01
##  [6,] 0.0000000 0.000000e+00 2.756247e-01 0.0000000 2.089892e-01
##  [7,] 0.0000000 0.000000e+00 9.499349e-10 0.0000000 1.196858e-05
##  [8,] 0.0000000 5.063465e-05 3.460392e-04 0.0000000 4.773864e-01
##  [9,] 0.0000000 0.000000e+00 6.518616e-03 0.0000000 0.000000e+00
## [10,] 0.0000000 0.000000e+00 4.479923e-08 0.0000000 1.914658e-02
##               [,6]       [,7]         [,8]         [,9]        [,10]
##  [1,] 0.000000e+00 0.00000000 0.000000e+00 0.000000e+00 0.000000e+00
##  [2,] 2.387134e-10 0.00000000 3.277076e-11 7.118471e-09 1.235461e-12
##  [3,] 3.881749e-01 0.00000000 8.396574e-04 1.873108e-02 3.104002e-06
##  [4,] 2.162185e-10 0.00000000 2.968264e-11 6.447668e-09 1.119038e-12
##  [5,] 2.849526e-04 0.00000000 3.911851e-05 8.497330e-03 1.474772e-06
##  [6,] 8.252368e-01 0.04189282 1.423738e-03 1.778233e-01 3.074451e-05
##  [7,] 1.321283e-08 1.28196307 1.574965e-02 1.760381e-02 6.838299e-11
##  [8,] 4.813128e-03 0.00000000 1.000666e+00 4.232802e-01 2.491034e-05
##  [9,] 9.066872e-02 0.00000000 1.566968e-02 3.967359e-01 5.908895e-04
## [10,] 6.231214e-07 0.00000000 3.063111e-01 1.358911e-02 1.341581e+00
#"Вытягиваем" матрицу в вектор построчно
SRvec = as.vector(t(SR))
plot(SRvec,type="l")

#Выведем траекторию на график
plot(indata, type="l", xlim=c(0,1280), ylim=c(0,1024))
#Добавим на график зоны интереса
ShowAOIs(states)