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; }
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)); } } } } } } } } }