void ProxyViz::updateViewFrustum(MObject & thisNode) { MPlug matplg(thisNode, acameraspace); MObject matobj; matplg.getValue(matobj); MFnMatrixData matdata(matobj); MMatrix cameramat = matdata.matrix(); AHelper::ConvertToMatrix44F(*cameraSpaceR(), cameramat); AHelper::ConvertToMatrix44F(*cameraInvSpaceR(), cameramat.inverse() ); float peye[3]; peye[0] = cameramat.matrix[3][0]; peye[1] = cameramat.matrix[3][1]; peye[2] = cameramat.matrix[3][2]; setEyePosition(peye); MPlug hfaplg(thisNode, ahapeture); float hfa = hfaplg.asFloat(); MPlug vfaplg(thisNode, avapeture); float vfa = vfaplg.asFloat(); MPlug flplg(thisNode, afocallength); float fl = flplg.asFloat(); float farClip = -20.f; if(numPlants() > 0) getFarClipDepth(farClip, gridBoundingBox() ); setFrustum(hfa, vfa, fl, -10.f, farClip ); MPlug overscanPlug(thisNode, ainoverscan); setOverscan(overscanPlug.asDouble() ); }
McoStatus ScanCal::_globalcal(Matrix &mat, long num, double *mea, double *ref) { McoStatus status; long i, j; double white[3]; Matrix matdata(num, 3); double *rgbref; white[0] = 96.42; white[1] = 100.0; white[2] = 82.49; rgbref = (double*)McoMalloc(sizeof(double)*num*3); if(!rgbref) return MCO_MEM_ALLOC_ERROR; for(i = 0; i < num*3; i++) rgbref[i] = ref[i]; //convert lab to XYZ labtonxyzinplace(rgbref, num); nxyztoxyzinplace(rgbref, white, num); //convert XYZ to rgb matdata.loadstruct(rgbref); matdata.T(); Matrix matrefrgb = mat*matdata; matrefrgb.T(); matrefrgb.savestruct(rgbref); //build linearization double x[LINEAR_NUM], y[LINEAR_NUM]; long start = num - 23; long end = num; _linear = new PWlinear*[3]; for(j = 0; j < 3; j++){ for(i = start; i < end; i++){ y[i-start] = rgbref[i*3 + j]; x[i-start] = mea[i*3 + j]; } _linear[j] = new PWlinear(LINEAR_NUM, x, y); } //linearization stretch status = _linearstrech(3, _linear, num, mea); if(status != MCO_SUCCESS) return status; //create matrix for(i = 0; i < num*3; i++) rgbref[i] = ref[i]; //convert lab to xyz labtonxyzinplace(rgbref, num); nxyztoxyzinplace(rgbref, white, num); _gcal = new MultiLcal(3, 3, 3, func3); status = _gcal->compute(num, mea, rgbref); if(status != MCO_SUCCESS) { delete _gcal; return status; } McoFree(rgbref); return MCO_SUCCESS; }
int Drumm1(const Epetra_Map& map, bool verbose) { (void)verbose; //Simple 2-element problem (element as in "finite-element") from //Clif Drumm. Two triangular elements, one per processor, as shown //here: // // *----* // 3|\ 2| // | \ | // | 0\1| // | \| // *----* // 0 1 // //Element 0 on processor 0, element 1 on processor 1. //Processor 0 will own nodes 0,1 and processor 1 will own nodes 2,3. //Each processor will pass a 3x3 element-matrix to Epetra_FECrsMatrix. //After GlobalAssemble(), the matrix should be as follows: // // row 0: 2 1 0 1 //proc 0 row 1: 1 4 1 2 //---------------------------------- // row 2: 0 1 2 1 //proc 1 row 3: 1 2 1 4 // int numProcs = map.Comm().NumProc(); int localProc = map.Comm().MyPID(); if (numProcs != 2) return(0); //so first we'll set up a epetra_test::matrix_data object with //contents that match the above-described matrix. (but the //matrix_data object will have all 4 rows on each processor) int i; int rowlengths[4]; rowlengths[0] = 3; rowlengths[1] = 4; rowlengths[2] = 3; rowlengths[3] = 4; epetra_test::matrix_data matdata(4, rowlengths); for(i=0; i<4; ++i) { for(int j=0; j<matdata.rowlengths()[i]; ++j) { matdata.colindices()[i][j] = j; } } matdata.colindices()[0][2] = 3; matdata.colindices()[2][0] = 1; matdata.colindices()[2][1] = 2; matdata.colindices()[2][2] = 3; double** coefs = matdata.coefs(); coefs[0][0] = 2.0; coefs[0][1] = 1.0; coefs[0][2] = 1.0; coefs[1][0] = 1.0; coefs[1][1] = 4.0; coefs[1][2] = 1.0; coefs[1][3] = 2.0; coefs[2][0] = 1.0; coefs[2][1] = 2.0; coefs[2][2] = 1.0; coefs[3][0] = 1.0; coefs[3][1] = 2.0; coefs[3][2] = 1.0; coefs[3][3] = 4.0; //now we'll load a Epetra_FECrsMatrix with data that matches the //above-described finite-element problem. int indexBase = 0, ierr = 0; int myNodes[4]; double values[9]; values[0] = 2.0; values[1] = 1.0; values[2] = 1.0; values[3] = 1.0; values[4] = 2.0; values[5] = 1.0; values[6] = 1.0; values[7] = 1.0; values[8] = 2.0; int numMyNodes = 2; if (localProc == 0) { myNodes[0] = 0; myNodes[1] = 1; } else { myNodes[0] = 2; myNodes[1] = 3; } Epetra_Map Map(-1, numMyNodes, myNodes, indexBase, map.Comm()); numMyNodes = 3; if (localProc == 0) { myNodes[0] = 0; myNodes[1] = 1; myNodes[2] = 3; } else { myNodes[0] = 1; myNodes[1] = 2; myNodes[2] = 3; } int rowLengths = 3; Epetra_FECrsMatrix A(Copy, Map, rowLengths); EPETRA_TEST_ERR( A.InsertGlobalValues(numMyNodes, myNodes, numMyNodes, myNodes, values, Epetra_FECrsMatrix::ROW_MAJOR),ierr); EPETRA_TEST_ERR( A.GlobalAssemble(), ierr ); EPETRA_TEST_ERR( A.GlobalAssemble(), ierr ); //now the test is to check whether the FECrsMatrix data matches the //epetra_test::matrix_data object... bool the_same = matdata.compare_local_data(A); if (!the_same) { return(-1); } return(0); }