Тема: Странное.
Показать сообщение отдельно
Старый 29.10.2011, 15:25   #186
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
Mr_F_ (29.10.2011), Reizel (29.10.2011)