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