Permalänk
Medlem

Hjälp med interpolering

Jag har ett program i C och OpenGL med en terräng genererad av en heightmap.
Terrängen skapas med ett rutnät som är lika stor och bred som heightmapen.
X och Z koordinaterna i terrängen motsvarar X och Y i heightmapen och Y koordinaten i terrängen motsvarar det röda färgvärdet.
Vad jag försöker göra är att få en sfär att förflytta sig ovanpå terrängen. Sfären förflyttar sig 0.1 i taget enligt rutnätet.
Eftersom ett höjdvärde bara finns på koordinater med heltal måste jag interpolera värdet på höjden för flyttalskoordinater.
Mitt försök till det ser ut så här:

float getHeight(float x, float z, int d) { float x2 = x + step; //Nästa x-koord, step är 1 i det här fallet. float z2 = z + step; //Nästa z-koord, step är 1 i det här fallet. int xi = (int)x; //Heltal av flyttal t.ex. 0.9 blir 0 int zi = (int)z; int x2i = (int)x2; int z2i = (int)z2; float lengthx =(float)x - xi; //Om x är 1.3 blir detta 0.3 float lengthx2 =1 - lengthx; //Om x är 1.3 blir detta 0.7 float lengthz =(float)z - zi; float lengthz2 = 1 - lengthz; float temp1 = (int)imagedata[(xi + zi*width)*3]; //Värdet för punkten xi, zi float temp2 = (int)imagedata[(x2i + zi*width)*3]; float temp3 = (int)imagedata[(xi + z2i*width)*3]; float rgbValue =(lengthx2 * temp1 + lengthx * temp2 + lengthz2 * temp1 + lengthz * temp3)/2; //Mitt interpolerade värde return rgbValue; }

Problemet jag har är att sfären gör hopp när den kommer till ett heltal.
Exempel på x-koordinat och vilket höjdvärde det ger:
63.5 41.69
63.6 41.78
63.7 41.89
63.8 41.99
63.9 42.08
64.0 43.14

Skillnaden i höjd mellan varje punkt är ca 0.1 förutom mellan 63.9 och 64.0 då skillnaden är 0.6.
Varför blir det så?