#Прямоугольные 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(100,200,300,100,200,300,100,200,300,100)
states[3]=c(20,20,20,110,110,110,200,200,200,310)
states[4]=c(190,290,390,190,290,390,190,290,390,390)
states[5]=c(100,100,100,190,190,190,280,280,280,470)
states[1:9,6]="task" #Матрица Равена
states[10,6]="vars" #Ответы
states
##    AOI  x1  y1  x2  y2 note
## 1    1 100  20 190 100 task
## 2    2 200  20 290 100 task
## 3    3 300  20 390 100 task
## 4    4 100 110 190 190 task
## 5    5 200 110 290 190 task
## 6    6 300 110 390 190 task
## 7    7 100 200 190 280 task
## 8    8 200 200 290 280 task
## 9    9 300 200 390 280 task
## 10  10 100 310 390 470 vars
#Генерируем последовательность точек
inputdata=data.frame(x=sample(1:490,100,replace=T), y=sample(1:490,100,replace=T))
head(inputdata)
##     x   y
## 1 343 409
## 2 150 408
## 3 179 213
## 4 472 292
## 5 170 293
## 6  34 161
#Определяем, в какую зону интереса попала точка
#Функция работает с предварительно обработанными точками, можно добавить также время
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); #Возвращаем классифицированные точки с соответствующими зонами интереса
}

#Просматриваем результат классификации
head(classify(inputdata,states),n=10)
##    state   x   y
## 1     10 343 409
## 2     10 150 408
## 3      7 179 213
## 4      0   0   0
## 5      0   0   0
## 6      0   0   0
## 7      0   0   0
## 8      2 256  42
## 9     10 311 433
## 10     7 160 234