From 24b1268ea6c0b52e000d9693d858056d03e004bb Mon Sep 17 00:00:00 2001 From: treecity Date: Sat, 21 May 2011 09:57:09 +0000 Subject: [PATCH] [src] alle Elemente werden rotiert und das \delta richtig ausgewertet [src] konverter von 3 auf 4 Koordinaten pro element + in Datei schreiben git-svn-id: https://drops.fb12.tu-berlin.de/svn/bacc/trunk@29 26120e32-c555-405d-b3e1-1f783fb42516 --- src/build_A.cpp | 105 ++++++++++++++++++++++++++++++------------ src/exportCOEL.m | 48 +++++++++++++++---- src/test_solveError.m | 3 +- 3 files changed, 115 insertions(+), 41 deletions(-) diff --git a/src/build_A.cpp b/src/build_A.cpp index 12b42b8..d880ef5 100644 --- a/src/build_A.cpp +++ b/src/build_A.cpp @@ -40,21 +40,22 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { double * C = mxGetPr(prhs[0]); double * E = mxGetPr(prhs[1]); + double * x0 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); double * x1 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); - double * x2 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); double * x3 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); double * xn = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); double * xa = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); double * xb = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); + double * y0 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); double * y1 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); - double * y2 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); double * y3 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); double * yn = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); double * ya = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); double * yb = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); double * d = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); + double * dt = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL)); double tmp; @@ -63,23 +64,23 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { //Ausrechnen for (j = 0; j < em; ++j) { - x1[0] = C[(int) E[j] - 1]; - x1[1] = C[cm + (int) E[j] - 1]; - x1[2] = C[2 * cm + (int) E[j] - 1]; + x0[0] = C[(int) E[j] - 1]; + x0[1] = C[cm + (int) E[j] - 1]; + x0[2] = C[2 * cm + (int) E[j] - 1]; - x2[0] = C[(int) E[em + j] - 1]; - x2[1] = C[cm + (int) E[em + j] - 1]; - x2[2] = C[2 * cm + (int) E[em + j] - 1]; + x1[0] = C[(int) E[em + j] - 1]; + x1[1] = C[cm + (int) E[em + j] - 1]; + x1[2] = C[2 * cm + (int) E[em + j] - 1]; x3[0] = C[(int) E[2 * em + j] - 1]; x3[1] = C[cm + (int) E[2 * em + j] - 1]; x3[2] = C[2 * cm + (int) E[2 * em + j] - 1]; for (i = 0; i<3;++i) - xa[i] = x2[i] - x1[i]; + xa[i] = x1[i] - x0[i]; for (i = 0; i<3;++i) - xb[i] = x3[i] - x1[i]; + xb[i] = x3[i] - x0[i]; //Kreuzprodukt xn[0] = (xa[1]) * (xb[2]) - (xa[2]) * (xb[1]); @@ -87,7 +88,7 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { xn[2] = (xa[0]) * (xb[1]) - (xa[1]) * (xb[0]); - + // Lageeigenschaften des Flaechenstuecks //if(xn[0]*xn[0]+xn[1]*xn[1]0){ + if(xb[rxb]>0){ + for (i = 0; i<3;++i) + dt[i] = - x0[i]; + }else{ + for (i = 0; i<3;++i) + dt[i] = - x1[i]; + } + }else{ + if(xb[rxb]>0){ + for (i = 0; i<3;++i) + dt[i] = - x3[i]; + }else{ + //for (i = 0; i<3;++i) + // d[i] = - x2[i]; + printf("Error! Daten existieren nicht. Zugriff auf vierten punkt"); + } + } + + // printf("(%d n- %f | %f | %f)\n",j,xn[0],xn[1],xn[2]); for (k = 0; k < em; ++k) { - y1[0] = C[(int) E[k] - 1]; - y1[1] = C[cm + (int) E[k] - 1]; - y1[2] = C[2 * cm + (int) E[k] - 1]; + y0[0] = C[(int) E[k] - 1]; + y0[1] = C[cm + (int) E[k] - 1]; + y0[2] = C[2 * cm + (int) E[k] - 1]; - y2[0] = C[(int) E[em + k] - 1]; - y2[1] = C[cm + (int) E[em + k] - 1]; - y2[2] = C[2 * cm + (int) E[em + k] - 1]; + y1[0] = C[(int) E[em + k] - 1]; + y1[1] = C[cm + (int) E[em + k] - 1]; + y1[2] = C[2 * cm + (int) E[em + k] - 1]; y3[0] = C[(int) E[2 * em + k] - 1]; y3[1] = C[cm + (int) E[2 * em + k] - 1]; y3[2] = C[2 * cm + (int) E[2 * em + k] - 1]; for (i = 0; i<3;++i) - ya[i] = y2[i] - y1[i]; + ya[i] = y1[i] - y0[i]; for (i = 0; i<3;++i) - yb[i] = y3[i] - y1[i]; + yb[i] = y3[i] - y0[i]; yn[0] = (ya[1]) * (yb[2]) - (ya[2]) * (yb[1]); yn[1] = (ya[2]) * (yb[0]) - (ya[0]) * (yb[2]); @@ -158,22 +181,44 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { else ryb = 0; + //kleinste Ecke finden und fuer \delta verwenden + + if(ya[rya]>0){ + if(yb[ryb]>0){ + for (i = 0; i<3;++i) + d[i] = dt[i] + y0[i]; + }else{ + for (i = 0; i<3;++i) + d[i] = dt[i] + y1[i]; + } + }else{ + if(yb[ryb]>0){ + for (i = 0; i<3;++i) + d[i] = dt[i] + y3[i]; + }else{ + //for (i = 0; i<3;++i) + //d[i] += y2[i]; + printf("Error! Daten existieren nicht. Zugriff auf vierten punkt"); + } + } + for (i = 0; i<3;++i) - d[i] = y1[i] - x1[i]; // todo: Achtung -> geht davon aus das 1 die kleinste Ecke ist ! + d[i] = y0[i]-x0[i]; - //printf("(%d,%d)",rx,ry); + printf("(%d,%d)",rx,ry); if (rx == ry) { - //printf("%d,%d@%d,%d",rxa,rxb,rya,ryb); + printf("(%d,%d@%d,%d)",rxa,rxb,rya,ryb); + printf("[%.2f,%.2f@%.2f,%.2f]\n",xa[rxa],xb[rxb],ya[rya],yb[ryb]); if (rxa == rya) { - //printf("%d%d %.1f %.1f | %.1f %.1f || %.1f %.1f | %.1f %.1f || %.1f %.1f %.1f\n",j,k,x1[0], x2[0], x1[1], x3[1], y1[0], - // y2[0], y1[1], y3[1], d[0], d[1], d[2]); - //printf("%d%d %.1f %.1f %.1f\n",j,k,d[0],d[1],d[2]); + //printf("%d%d %.1f %.1f | %.1f %.1f || %.1f %.1f | %.1f %.1f || %.1f %.1f %.1f\n",j,k,x0[0], x1[0], x0[1], x3[1], y0[0], + // y1[0], y0[1], y3[1], d[0], d[1], d[2]); + printf("%d%d %.1f %.1f %.1f\n",j,k,d[0],d[1],d[2]); tmp = quad0Int(F_par, fabs(xa[rxa]), fabs(xb[rxb]), fabs(ya[rxa]), fabs(yb[rxb]), d[rxa], d[rxb], d[rx]); // printf("%d%d|%.2f\n",j,k,tmp); } else{ - //printf("%d%d %.1f %.1f | %.1f %.1f || %.1f %.1f | %.1f %.1f || %.1f %.1f %.1f\n",j,k,x1[0], x2[0], x1[1], x3[1], y1[0], - // y2[0], y1[1], y3[1], d[0], d[1], d[2]); + //printf("%d%d %.1f %.1f | %.1f %.1f || %.1f %.1f | %.1f %.1f || %.1f %.1f %.1f\n",j,k,x0[0], x1[0], x0[1], x3[1], y0[0], + // y1[0], y0[1], y3[1], d[0], d[1], d[2]); //printf("%d%d %.1f %.1f %.1f\n",j,k,d[0],d[1],d[2]); tmp = quad0Int(F_par, fabs(xa[rxa]), fabs(xb[rxb]), fabs(yb[rxa]), fabs(ya[rxb]), d[rxa], d[rxb], d[rx]); @@ -199,11 +244,11 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { } //Rueckgabe (eventuell zurueck schreiben) - // mxFree(x1); - //mxFree(x2); + // mxFree(x0); + //mxFree(x1); //mxFree(x3); + //mxFree(y0); //mxFree(y1); - //mxFree(y2); //mxFree(y3); //mxFree(xn); //mxFree(yn); diff --git a/src/exportCOEL.m b/src/exportCOEL.m index 92a1212..7dbe086 100644 --- a/src/exportCOEL.m +++ b/src/exportCOEL.m @@ -1,18 +1,46 @@ -function exportCOEL(coo, ele, file) +function [coo, ele] = exportCOEL(coo, ele, file) %EXPORTCOEL Summary of this function goes here % Detailed explanation goes here -dat = fopen(file,'w'); +if(size(ele,2) == 3) + disp 'erweitere auf 4 Koordinaten pro Element' + ele = ele(:,[1 2 3 3]); - for i=1:size(coo,1); - fprintf(dat,'v %.4f %.4f %.4f\n',coo(i,:)); - end - fprintf(dat,'\n'); - for i=1:size(ele,1); - fprintf(dat,'f %.0f %.0f %.0f\n',ele(i,:)); - end + for i = 1:size(ele,1); + + tri = ele(i,:); + a = (coo(tri(2),:)-coo(tri(1),:)); + x = coo(tri(3),:) + a; -fclose(dat); + found = 0; + for j = 1:size(coo,1) + if(coo(j,:) == x) + found = j; + break; + end + end + if(found == 0) + coo(j+1,:) = x; + ele(i,3) = j+1; + else + ele(i,3) = j; + end + end +end +if(size(ele,2)==4) +% disp 'schreibe in Datei' +% dat = fopen(file,'w'); +% +% for i=1:size(coo,1); +% fprintf(dat,'v %.4f %.4f %.4f\n',coo(i,:)); +% end +% fprintf(dat,'\n'); +% for i=1:size(ele,1); +% fprintf(dat,'f %.0f %.0f %.0f %.0f\n',ele(i,:)); +% end +% +% fclose(dat); +end end diff --git a/src/test_solveError.m b/src/test_solveError.m index 3a9fba0..5f2c47a 100644 --- a/src/test_solveError.m +++ b/src/test_solveError.m @@ -2,7 +2,8 @@ load exmpl_2DLShape -coordinates = coordinates(:,[ 1 3 2]); +% coordinates = coordinates(:,[ 1 3 2]); +% elements(2,:) = elements(2,[ 2 3 1]); % [coordinates,elements]=refineQuad(coordinates,elements,ones(1,size(elements,1))); % [coordinates,elements]=refineQuad(coordinates,elements,ones(1,size(elements,1))); -- 2.47.3