#Прямоугольные 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)
