Beispiel #1
0
double runTrial(
  size_t index,
  size_t numTradingDays,
  double dt,
  double sqrtDT,
  double const (&choleskyTrans)[NS][NS],
  double const (&drifts)[NS]
  )
{
  uint32_t seed = initialSeed( 4096 * (1+index) );

  double amounts[NS];
  for ( size_t i=0; i<NS; ++i )
    amounts[i] = 100.0;

  for ( size_t day=0; day<numTradingDays; ++day )
  {
    double Z[NS];
    randomNormalVec( Z, seed );
    double X[NS];
    multMatVec( choleskyTrans, Z, X );
    for ( size_t i=0; i<NS; ++i )
      amounts[i] *= exp(drifts[i]*dt + X[i]*sqrtDT);
  }

  double value = 0.0;
  for ( size_t i=0; i<NS; ++i )
    value += amounts[i];
  return value;
}
Beispiel #2
0
static void drawTriangle(double x1,double y1,double z1,double u1,double v1,  double x2,double y2,double z2,double u2,double v2,  double x3,double y3,double z3,double u3,double v3, int tries) {
	set4(tempVert1, x1,y1,z1,1);
	set4(tempVert2, x2,y2,z2,1);
	set4(tempVert3, x3,y3,z3,1);

	multMatVec(completeMat, tempVert1, tempVert1);
	multMatVec(completeMat, tempVert2, tempVert2);
	multMatVec(completeMat, tempVert3, tempVert3);

	
	double oz1 = z1, oz2 = z2, oz3 = z3;
	
	double w1, w2, w3,
		miX, miY, maX, maY,
	        //x01, y01, z01,
	        x21, y21, z21,
	        x31, y31, z31,
	        //x32, y32, z32,
		az, bz, c,
	        //au, bu,
		//av, bv,
		area,
		s, t,
		depth;
		
	int x,y, u,v, miXi,miYi,maXi,maYi;
	//double ow1, ow2, ow3;
	
	
	
	/*ow1 = */w1 = tempVert1[3];	
	z1 = tempVert1[2]; ///w1;

	/*ow2 = */w2 = tempVert2[3];				
	z2 = tempVert2[2]; ///w2;
	
	/*ow3 = */w3 = tempVert3[3];
	z3 = tempVert3[2]; ///w3;

	// Completely outside of the frustem
	if(tries == 0) {
		if((z1 < near && z2 < near && z3 < near) || (z1 > far && z2 > far && z3 > far)) {
			////printf("offscreen...\n");
			return;
		}

		//Partially outside, need to clip
		if(z1 < pseudoNear || z2 < pseudoNear || z3 < pseudoNear) {		
			//printf("CLIP!\n");
			clip(x1,y1,oz1,u1,v1,	z1,
				x2,y2,oz2,u2,v2,	z2,
				x3,y3,oz3,u3,v3,	z3);
			return;
		}
	}
	
	//printf("ws <%lf, %lf, %lf>\n", w1, w2, w3);	

	w1 = fabs(w1);
	x1 = tempVert1[0]/-w1;
	y1 = tempVert1[1]/-w1;

	w2 = fabs(w2);
	x2 = tempVert2[0]/-w2;
	y2 = tempVert2[1]/-w2;
	
	w3 = fabs(w3);
	x3 = tempVert3[0]/-w3;
	y3 = tempVert3[1]/-w3;

	/*printf("--------------------------\n");	
	printf("ws <%lf, %lf, %lf>\n", w1, w2, w3);	
	printf("pt1 <%lf, %lf, %lf>\n", x1, y1, z1);
	printf("pt2 <%lf, %lf, %lf>\n", x2, y2, z2);
	printf("pt3 <%lf, %lf, %lf>\n", x3, y3, z3);
	printf("--------------------------\n");	
	printf("\n");*/
	
	
	miX = (x1 < x2) ? ((x1 < x3) ? x1 : x3) : ((x2 < x3) ? x2 : x3);
	miY = (y1 < y2) ? ((y1 < y3) ? y1 : y3) : ((y2 < y3) ? y2 : y3);
	maX = (x1 > x2) ? ((x1 > x3) ? x1 : x3) : ((x2 > x3) ? x2 : x3);
	maY = (y1 > y2) ? ((y1 > y3) ? y1 : y3) : ((y2 > y3) ? y2 : y3);

	miXi = (int) ((miX < 0) ? 0 : miX);
	miYi = (int) ((miY < 0) ? 0 : miY);
	maXi = (int) ((maX < RESOLUTION_WIDTH) ? maX : RESOLUTION_WIDTH);
	maYi = (int) ((maY < RESOLUTION_HEIGHT) ? maY : RESOLUTION_HEIGHT);

	x21 = x2-x1;
	y21 = y2-y1;
	z21 = z2-z1;

	x31 = x3-x1;
	y31 = y3-y1;
	z31 = z3-z1;
	
	/*
	x32 = x3-x2;
	y32 = y3-y2;
	z32 = z3-z2;
	*/

	az = y21*z31 - y31*z21;
	bz = -x21*z31 + x31*z21;
	c = x21*y31 - x31*y21;

	area = .5*(-y2*x3 + y1*(-x2+x3) + x1*(y2-y3) + x2*y3);
	
	if(area == 0)
		return;

	
	double b1, b2, b3, 
		bDenom = -1./((y2-y3)*x31 + (x3-x2)*y31);

	int index, dRGBA=0, 
		dR=0, dG=0, dB=0, dA=0,
		pR=0, pG=0, pB=0, pA=0;
	double val = 1, wp, up, vp, fr;						
	for(x = miXi; x < maXi; x++) {
		for(y = miYi; y < maYi; y++) {
			s = 1/(2*area)*(y1*x3 - x1*y3 + y31*x - x31*y);
			t = 1/(2*area)*(x1*y2 - y1*x2 - y21*x + x21*y);
			
			if(0 <= s && s <= 1 && 0 <= t && t <= 1 && s+t <= 1) {
				depth = (z1 + (az*(x-x1) + bz*(y-y1))/-c);
			
				b1 = ((y2-y3)*(x-x3) + (x3-x2)*(y-y3)) * bDenom;
				b2 = ((y3-y1)*(x-x3) + (x1-x3)*(y-y3)) * bDenom;
				b3 = 1. - b1 - b2;
								
				if(!doDepthTest || (depth >= near && depth <= far)) {
					index = y*RESOLUTION_WIDTH + x;

					if(!doDepthTest || (depth < depths[index])) {
						depths[index] = depth;
						
						if(texture == NULL || !doTexture) {
							if(!doFog)
								pixels[index] = RGBA;
							else {
								val = contain(0, (far-depth)/(far-near), 1);
								pixels[index] = convertRGB2Int((int)(R*val),(int)(G*val),(int)(B*val));
							}
						}
						else {
							wp = ( 1 / w1 ) * b1 + ( 1 / w2 ) * b2 + ( 1 / w3 ) * b3;
							up = ( ( u1 / w1 ) * b1 + ( u2 / w2 ) * b2 + ( u3 / w3 ) * b3 ) / wp;
							vp = ( ( v1 / w1 ) * b1 + ( v2 / w2 ) * b2 + ( v3 / w3 ) * b3 ) / wp;
						
							if(up < 0 || up > 1)
								up = fabs(fmod(up,1));
							if(vp < 0 || vp > 1)
								vp = fabs(fmod(vp,1));
						
							u = (int)(textureWidth * up);
							v = (int)(textureHeight * vp);

							
							dRGBA = texture[textureWidth*v + u];
							convertInt2RGBA(dRGBA, &dR,&dG,&dB,&dA);
							
							dR = (int) (dR/255. * R);
							dG = (int) (dG/255. * G);
							dB = (int) (dB/255. * B);
							dA = (int) (dA/255. * A);
							
							if(dA == 0)
								continue;
							
							dRGBA = convertRGBA2Int(dR,dG,dB,dA);
						
							
							if(!doFog) {
								if(dA == 255)
									pixels[index] = dRGBA;
								else if (dA > 0) {
									convertInt2RGBA(pixels[index], &pR,&pG,&pB,&pA);
									
									fr = dA/255.;

									// Colors have to be squared!
									pR = sqrt((1-fr)*pR*pR + fr*dR*dR);
									pG = sqrt((1-fr)*pG*pG + fr*dG*dG);
									pB = sqrt((1-fr)*pB*pB + fr*dB*dB);
									
									pixels[index] = convertRGB2Int((int)(pR),(int)(pG),(int)(pB));	
								}
							}
							else {
								val = contain(0, (far-depth)/(far-near), 1);
								
								if(dA == 1)
									pixels[index] = convertRGB2Int((int)(dR*val),(int)(dG*val),(int)(dB*val));
								else {
									convertInt2RGBA(pixels[index], &pR,&pG,&pB,&pA);
									pixels[index] = convertRGB2Int((int)(dR*val),(int)(dG*val),(int)(dB*val));									
								}									
							}
						}
					}
				}
			}
		}
	}
}