Calcul (très complexe) de la température en 1 point de la grille, compte tenu de l'heure et de l'altitude.

 

// Ce script donne la température ambiante

//cette fonction délivre, lorsque l'objet qui contient le script
//est cliqué, la température environnante

// Fonction utilisateur transportable dans un autre script
float $TemperatureCeltius()
//float = le résultat des calculs effectués dans
//cette fonction sera en virgule flottante
{
//Variables uniquement valables pour cette fonction
float fTemperatureF;
vector vSunDir;
vector vPos = llGetPos();
float fBase;
float fPascal;
float fSealevel = llWater(ZERO_VECTOR);
//Cette variable est initialisée avec le niveau
//de la mer à l'endroit où se trouve l'objet

vSunDir = llGetSunDirection();
vPos = llGetPos();

// Ce qui suit est un bon exemple d'utilisation d'une formule mathématique
fTemperatureF = (((((fSealevel + ((100.0 - vPos.z) * 0.018181818) + 30.0) * (2 * llPow(10.0, 22.0))) / (1.8311 * llPow(10.0, 20.0)) / 8.314472) / 19.85553747) + (vSunDir.z * 9));
// fTemperatureF est en degrès Farenheit

// la formule suivante convertit les degrés Farenheit en degrès Celtius
return (fTemperatureF - 32) * 5/9;
}

default
{
state_entry()
{
// llOwnerSay : permet de placer un message sur le chat
// mais lisible uniquement par le propriétaire du script
llOwnerSay("Touchez-moi pour avoir la temperature");
}

touch_start(integer total_number)
{
llOwnerSay("Temperature = " + (string) $TemperatureCeltius() + " Degrés Celsius");
}
}

 

 


Créer un cube, y placer le script, cliquer pour avoir la température dans le chat.

Mais cette température ressemble à quelque chose comme ; 23.897859 Degrés Celsius ; ce n'est pas très esthétique. Une température climatique se donne avec un chiffre après la virgule ; il serait simple de faire une troncature, mais nous allons plutôt utiliser une routine d'arrondi "à la Excel"!


 

// Ce script donne la température ambiante

//cette fonction délivre, lorsque l'objet qui contient le script
//est cliqué, la température environnante

// Fonction utilisateur transportable dans un autre script
float $TemperatureCeltius()
//float = le résultat des calculs effectués dans
//cette fonction sera en virgule flottante
{
//Variables uniquement valables pour cette fonction
float fTemperatureF;
vector vSunDir;
vector vPos = llGetPos();
float fBase;
float fPascal;
float fSealevel = llWater(ZERO_VECTOR);
//Cette variable est initialisée avec le niveau
//de la mer à l'endroit où se trouve l'objet

vSunDir = llGetSunDirection();
vPos = llGetPos();

// Ce qui suit est un bon exemple d'utilisation d'une formule mathématique
fTemperatureF = (((((fSealevel + ((100.0 - vPos.z) * 0.018181818) + 30.0) * (2 * llPow(10.0, 22.0))) / (1.8311 * llPow(10.0, 20.0)) / 8.314472) / 19.85553747) + (vSunDir.z * 9));
// fTemperatureF est en degrès Farenheit

// la formule suivante convertit les degrés Farenheit en degrès Celtius
return (fTemperatureF - 32) * 5/9;
}

//Fonction utilisateur pour faire un arrondi à la façon d'Excel
//Sert principalement à faire un affichage correct des nombres décimaux
//appel de la fonction :
//llSay("La quantité est de " + gkRound(flt, rnd) + " moles.");
//flt = le nombre flottant à arrondir
//rnd = un indicateur : rnd < 0 : nombre de décimales à garder
// rnd = 0 : arrondir à l'entier
// rnd > 0 : arrondir à la dizaine, centaine, au millier etc
//Cette fonction peut donner des résultats incohérents dans certains cas
//mais rien à voir avec le cas de la tempérture
string gkRound(float flt, integer rnd)
{
string sArr = (string) flt;
list lArr = llParseString2List(sArr,["."],[]);
if(rnd == 0)
{
sArr = llList2String(lArr, 0);
if((integer) llGetSubString(llList2String(lArr, 1), 0, 0) >= 5)
{
sArr = (string) ((integer) sArr + 1);
}
}
else
if(rnd < 0)
{
rnd = llAbs(rnd);
integer iArr = (integer) llList2String(lArr, 0);
string sDec = llList2String(lArr, 1);
integer iDec = 0;
if(rnd < llStringLength(sDec))
{
integer iRnd = (integer) llGetSubString(sDec, rnd, rnd);
iDec = (integer) llGetSubString(sDec, 0, rnd - 1);
if(iRnd >= 5)
{
iDec = iDec + 1;
float fRnd = (float) rnd;
if(iDec == (integer) llPow(10.0, fRnd))
{
iDec = 0;
iArr = iArr + 1;
}
}
}
sArr = (string) iArr + "." + (string) iDec;
}
else
{
string sFix = llList2String(lArr, 0);
if(rnd >= llStringLength(sFix))
{
sArr = "0";
}
else
{
string sArr = llGetSubString(sFix, 0, llStringLength(sFix) - rnd-1);
integer iRnd = (integer) llGetSubString(sFix, llStringLength(sFix) - rnd, llStringLength(sFix) - rnd);
if(iRnd >= 5)
{
sArr = (string) ((integer) sArr + 1);
}
sArr = (string) ((integer) ((integer) sArr * llPow(10, rnd)));
}
}
return sArr;
}


default
{
state_entry()
{
// llOwnerSay : permet de placer un message sur le chat
// mais lisible uniquement par le propriétaire du script
llOwnerSay("Touchez-moi pour avoir la temperature");
}

touch_start(integer total_number)
{
llOwnerSay("Temperature = " + gkRound($TemperatureCeltius(), -1) + " degrés Celsius");
}
}

 

 


Vous voilà un fervent météorologue de Second Life!