29.10.2011, 15:25
|
#186
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Как очень легко накодил це:

class base_point{
public:
int x;
int y;
float val;
};
class temp_data{
public:
//вес и index
float w0;
int v0;
float w1;
int v1;
float w2;
int v2;
float w3;
int v3;
//конструктор задающий нули в поля
temp_data(){
w0=0;
v0=0;
w1=0;
v1=0;
w2=0;
v2=0;
w3=0;
v3=0;
}
};
class map_matrix{
public:
int size;
//массив базовых точек
base_point *mas;
//массив для временных значений
temp_data **temp;
//результирующий граиент значений
float **result;
//текстура
Handle tex;
map_matrix(int a){
size=a;
//число базовых точек
int number=150;
mas=new base_point[number];
//запись в точки
for(int i=0;i<number;i++){
mas[i].val=xRnd(-5,5);
mas[i].x=xRand(0,size);
mas[i].y=xRand(0,size);}
temp=new temp_data*[size+1];
for(int i=0;i<=size;i++){temp[i]=new temp_data[size+1];}
//вычисление максимальной дистанции
float dist0=size*sqrt(2.0);
for(int i=0;i<=size;i++){
for(int j=0;j<=size;j++){
//индексы с предельными значениями весов
int i0,i1,i2,i3;
float we0=0;
float we1=0;
float we2=0;
float we3=0;
for(int k=0;k<number;k++){
int x=mas[k].x;
int y=mas[k].y;
float dist=sqrt((x-i)*(x-i)+(y-j)*(y-j));
float weight=(dist0-dist)/dist0;
//some kind of sort
if(weight>=we0){we3=we2;we2=we1;we1=we0;we0=weight; i3=i2;i2=i1;i1=i0;i0=k;}
if(weight>=we1){we3=we2;we2=we1;we1=weight;i3=i2;i2=i1;i1=k;}
if(weight>=we2){we3=we2;we2=weight;i3=i2;i2=k;}
if(weight>=we3){we3=weight;i3=k;}}
//для текущей точки i,j есть соседи
//пишем их в временную дату
temp[i][j].v0=i0;
temp[i][j].w0=we0;
temp[i][j].v1=i1;
temp[i][j].w1=we1;
temp[i][j].v2=i2;
temp[i][j].w2=we2;
temp[i][j].v3=i3;
temp[i][j].w3=we3;
}
}
//предварительная дата готова
//теперь нужно создать и посчитать итоговый массив данных
result=new float*[size+1];
for(int i=0;i<=size;i++){result[i]=new float[size+1];}
//calculations
for(int i=0;i<=size;i++){for(int j=0;j<=size;j++){
//смотрю в базовые точки
float val0=mas[temp[i][j].v0].val; float we0=temp[i][j].w0;
float val1=mas[temp[i][j].v1].val; float we1=temp[i][j].w1;
float val2=mas[temp[i][j].v2].val; float we2=temp[i][j].w2;
float val3=mas[temp[i][j].v3].val; float we3=temp[i][j].w3;
float mval=val0*we0+val1*we1+val2*we2+val3*we3;
//складываю квадраты весов.
float weights=we0+we1+we2+we3;
result[i][j]=mval/weights;
}}
//to 0,1
float min=100000;
float max=-100000;
for(int i=0;i<=size;i++){for(int j=0;j<=size;j++){
if(result[i][j]>max){max=result[i][j];}
if(result[i][j]<min){min=result[i][j];}
}}
for(int i=0;i<=size;i++){for(int j=0;j<=size;j++){
result[i][j]=(result[i][j]-min)/(max-min);
}}
//вывод в текстуру
tex=xCreateTexture(size,size);
xSetBuffer(xTextureBuffer(tex));
xLockBuffer(xTextureBuffer(tex));
for (int i=0;i<size;i++){
for (int j=0;j<size;j++){
float val0=result[i][j];
xWritePixelFast(i,j,ARGB(255,val0*255,val0*255,val0*255),xTextureBuffer(tex));
}
}
xSetBuffer(xBackBuffer());
xUnlockBuffer(xTextureBuffer(tex));
}
};

Последний раз редактировалось dsd, 29.10.2011 в 16:26.
|
(Offline)
|
|