예제 #1
0
파일: plot.c 프로젝트: aahud/harvey
void
parseplanet(char *line, Planetrec *p)
{
	char *fld[6];
	int i, nfld;
	char *s;

	if(line[0] == '\0')
		return;
	line[10] = '\0';	/* terminate name */
	s = strrchr(line, ' ');
	if(s == nil)
		s = line;
	else
		s++;
	strcpy(p->name, s);
	for(i=0; s[i]!='\0'; i++)
		p->name[i] = tolower(s[i]);
	p->name[i] = '\0';
	nfld = getfields(line+11, fld, nelem(fld), 1, " ");
	p->ra = dangle(getra(fld[0]));
	p->dec = dangle(getra(fld[1]));
	p->az = atof(fld[2])*MILLIARCSEC;
	p->alt = atof(fld[3])*MILLIARCSEC;
	p->semidiam = atof(fld[4])*1000;
	if(nfld > 5)
		p->phase = atof(fld[5]);
	else
		p->phase = 0;
}
예제 #2
0
void DrawOceanTask::generateWaves()
{
    long seed = 1234567;
    float min = log(lambdaMin) / log(2.0f);
    float max = log(lambdaMax) / log(2.0f);

    vec4f *waves = new vec4f[nbWaves];

    sigmaXsq = 0.0;
    sigmaYsq = 0.0;
    meanHeight = 0.0;
    heightVariance = 0.0;
    amplitudeMax = 0.0;

#define nbAngles 5 // impair
#define angle(i)  (1.5*(((i)%nbAngles)/(float)(nbAngles/2)-1))
#define dangle()   (1.5/(float)(nbAngles/2))
    float Wa[nbAngles]; // normalised gaussian samples
    int index[nbAngles]; // to hash angle order
    float s=0;
    for (int i=0; i<nbAngles; i++) {
        index[i]=i;
        float a = angle(i); // (i/(float)(nbAngle/2)-1)*1.5;
        s += Wa[i] = exp(-.5*a*a);
    }
    for (int i=0; i<nbAngles; i++) {
        Wa[i] /= s;
    }

    const float waveDispersion = 0.9f;//6;
    const float U0 = 10.0f;
    const int spectrumType = 2;

    for (int i = 0; i < nbWaves; ++i) {
        float x = i / (nbWaves - 1.0f);

        float lambda = pow(2.0f, (1.0f - x) * min + x * max);
        float ktheta = grandom(0.0f, 1.0f, &seed) * waveDispersion;
        float knorm = 2.0f * M_PI_F / lambda;
        float omega = sqrt(9.81f * knorm);
        float amplitude;

        if (spectrumType == 1) {
            amplitude = heightMax * grandom(0.5f, 0.15f, &seed) / (knorm * lambdaMax / (2.0f * M_PI));
        } else if (spectrumType == 2) {
            float step = (max-min)/(nbWaves-1); // dlambda/di
            float omega0 = 9.81f / U0; // 100.0;
            if ((i%(nbAngles))==0) { // scramble angle ordre
                for (int k=0; k<nbAngles; k++) {   // do N swap in indices
                    int n1=lrandom(&seed)%nbAngles, n2=lrandom(&seed)%nbAngles,n;
                    n=index[n1]; index[n1]=index[n2]; index[n2]=n;
                }
            }
            ktheta = waveDispersion*(angle(index[(i)%nbAngles])+.4*srnd()*dangle());
            ktheta *= 1/(1+40*pow(omega0/omega,4));
            amplitude = (8.1e-3*9.81*9.81) / pow(omega,5) * exp(-0.74*pow(omega0/omega,4));
            amplitude *= .5*sqrt(2*3.14*9.81/lambda)*nbAngles*step; // (2/step-step/2);
            amplitude = 3*heightMax*sqrt(amplitude);
        }

        // cull breaking trochoids ( d(x+Acos(kx))=1-Akcos(); must be >0 )
        if (amplitude > 1.0f / knorm) {
            amplitude = 1.0f / knorm;
        } else if (amplitude < -1.0f / knorm) {
            amplitude = -1.0f / knorm;
        }

        waves[i].x = amplitude;
        waves[i].y = omega;
        waves[i].z = knorm * cos(ktheta);
        waves[i].w = knorm * sin(ktheta);
        sigmaXsq += pow(cos(ktheta), 2.0f) * (1.0f - sqrt(1.0f - knorm * knorm * amplitude * amplitude));
        sigmaYsq += pow(sin(ktheta), 2.0f) * (1.0f - sqrt(1.0f - knorm * knorm * amplitude * amplitude));
        meanHeight -= knorm * amplitude * amplitude * 0.5f;
        heightVariance += amplitude * amplitude * (2.0f - knorm * knorm * amplitude * amplitude) * 0.25f;
        amplitudeMax += fabs(amplitude);
    }

    float var = 4.0f;
    float h0 = meanHeight - var * sqrt(heightVariance);
    float h1 = meanHeight + var * sqrt(heightVariance);
    amplitudeMax = h1 - h0;

    ptr<Texture1D> wavesTexture = new Texture1D(nbWaves, RGBA32F, RGBA,
            FLOAT, Texture::Parameters().wrapS(CLAMP_TO_BORDER).min(NEAREST).mag(NEAREST),
            Buffer::Parameters(), CPUBuffer(waves));
    delete[] waves;

    nbWavesU->set(nbWaves);
    wavesU->set(wavesTexture);

    if (brdfShader != NULL) {
        assert(!brdfShader->getUsers().empty());
        Program *prog = *(brdfShader->getUsers().begin());
        prog->getUniform1f("seaRoughness")->set(sigmaXsq);
        prog->getUniform3f("seaColor")->set(seaColor);
    }
}