D:/Basile/VisualCppProjects/hydroMEX3/hydroMEX3/oGL_graphics/solid_objects.cpp

Go to the documentation of this file.
00001 
00009 #include "solid_objects.h"
00010 
00011 
00012 
00013 
00014 SolidObject hullStruct; 
00015 SolidObject *hull = &hullStruct;
00016 
00017 SolidObject rSwimmStruct; 
00018 SolidObject *rSwimm = &rSwimmStruct;
00019 
00020 SolidObject lSwimmStruct; 
00021 SolidObject *lSwimm = &lSwimmStruct;
00022 
00023 SolidObject bridgeMainStruct; 
00024 SolidObject *bridgeMain = &bridgeMainStruct;
00025 
00026 SolidObject bridge2Struct; 
00027 SolidObject *bridge2 = &bridge2Struct;
00028 
00029 SolidObject mastStruct; 
00030 SolidObject *mast = &mastStruct;
00031 
00032 SolidObject foilRightStruct; 
00033 SolidObject *foilr = &foilRightStruct;
00034 
00035 SolidObject foilLeftStruct; 
00036 SolidObject *foill = &foilLeftStruct;
00037 
00038 SolidObject yawStruct; 
00039 SolidObject *yaw = &yawStruct;
00040 
00041 SolidObject pitchStruct; 
00042 SolidObject *pitch = &pitchStruct;
00043 
00044 
00045 
00046 void SolidObject_create(SolidObject *so, int N, int M)
00047 {// allocate 2D arrays
00048         int n;
00049 
00050         so->N = N;
00051         so->M = M;
00052 
00053         so->X = new float* [N];
00054         so->Y = new float* [N];
00055         so->Z = new float* [N];
00056 
00057         so->nX = new float* [N];
00058         so->nY = new float* [N];
00059         so->nZ = new float* [N];
00060 
00061         so->R = new float* [N];
00062         so->G = new float* [N];
00063         so->B = new float* [N];
00064 
00065         for (n=0; n<N; n++)
00066         {
00067                 so->X[n] = new float[M];
00068                 so->Y[n] = new float[M];
00069                 so->Z[n] = new float[M];
00070 
00071                 so->nX[n] = new float[M];
00072                 so->nY[n] = new float[M];
00073                 so->nZ[n] = new float[M];
00074 
00075                 so->R[n] = new float[M];
00076                 so->G[n] = new float[M];
00077                 so->B[n] = new float[M];
00078         }
00079 }
00080 
00081 
00082 void SolidObject_delete(SolidObject *so)
00083 {//delete 2D arrays
00084         int n, N;
00085         N = so->N;
00086 
00087         for (n=0; n<N; n++)
00088         {
00089                 delete [] so->X[n];
00090                 delete [] so->Y[n];
00091                 delete [] so->Z[n];
00092 
00093                 delete [] so->nX[n];
00094                 delete [] so->nY[n];
00095                 delete [] so->nZ[n];
00096 
00097                 delete [] so->R[n];
00098                 delete [] so->G[n];
00099                 delete [] so->B[n];
00100         }
00101         delete [] so->X;
00102         delete [] so->Y;
00103         delete [] so->Z;
00104 
00105         delete [] so->nX;
00106         delete [] so->nY;
00107         delete [] so->nZ;
00108 
00109         delete [] so->R;
00110         delete [] so->G;
00111         delete [] so->B;
00112 }
00113 
00114 
00115 
00116 
00117 
00118 void cross_product(float *va, float *vb, float *vc)
00119 {// computes     vc = va x vb
00120         vc[0] = va[1]*vb[2] - va[2]*vb[1];
00121         vc[1] = va[2]*vb[0] - va[0]*vb[2];
00122         vc[2] = va[0]*vb[1] - va[1]*vb[0];
00123 }
00124 
00125 void one_normal(float *v1, float *v2, float *v3, float *v4, float *vn)
00126 {// computes     vn = c/|c|,  c = v1 x v2 + v2 x v3 + v3 x v4 + v4 x v1
00127         float c12[3]; //v1 x v2
00128         float c23[3]; //v2 x v3
00129         float c34[3]; //v3 x v4
00130         float c41[3]; //v4 x v1
00131 
00132         float vectorNorm, temp;
00133 
00134         cross_product(v1, v2, c12);
00135         cross_product(v2, v3, c23);
00136         cross_product(v3, v4, c34);
00137         cross_product(v4, v1, c41);
00138 
00139 
00140         vn[0] = (c12[0]) + (c23[0]) + (c34[0]) + (c41[0]);
00141         vn[1] = (c12[1]) + (c23[1]) + (c34[1]) + (c41[1]);
00142         vn[2] = (c12[2]) + (c23[2]) + (c34[2]) + (c41[2]);
00143 
00144         vectorNorm = sqrt(vn[0]*vn[0] + vn[1]*vn[1] + vn[2]*vn[2]);
00145 
00146         if (vectorNorm != (0.0f))
00147         {
00148                 vn[0] /= vectorNorm;
00149                 vn[1] /= vectorNorm;
00150                 vn[2] /= vectorNorm;
00151         }
00152         //printf("normed: vn[0]=%f, vn[1]=%f, vn[2]=%f \n",vn[0],vn[1],vn[2]);
00153 }
00154 
00155 void SolidObject_compute_normals(SolidObject *so)
00156 {
00157         int m, n;
00158         int *kx, *ky;
00159         int ix, iy;
00160 
00161         float v1[3]; //vectors between vetexes
00162         float v2[3];
00163         float v3[3];
00164         float v4[3];
00165 
00166         float vn[3]; // one normal vector (normalized)
00167 
00168         float **X, **Y, **Z;
00169 
00170         kx = new int [so->N+2];
00171         ky = new int [so->M+2];
00172 
00173         X = so->X; //solidObject vertexes coordiantes
00174         Y = so->Y;
00175         Z = so->Z;
00176 
00177         kx[0]=so->N-1;                                           //
00178         for (n=1; n<so->N+1; n++) kx[n]=n-1; // make index vector kx = {N-1, 0, 1, 2, ..., N-2, N-1, 0}
00179         kx[so->N+1] = 0;                                         // for easy wraping on Solidobject data
00180 
00181         ky[0]=so->M-1;                                           //
00182         for (m=1; m<so->M+1; m++) ky[m]=m-1; // make index vector ky = {M-1, 0, 1, 2, ..., M-2, M-1, 0}
00183         ky[so->M+1] = 0;                                         // for easy wraping on Solidobject data
00184 
00185         //       v2
00186         //       ¦
00187         //  v3 --p-- v1
00188         //       ¦
00189         //       v4
00190         //
00191         //normal at point p:  n = c/|c|,  c = v1 x v2 + v2 x v3 + v3 x v4 + v4 x v1
00192 
00193         for (n=1; n<so->N+1; n++)
00194         {
00195                 for (m=1; m<so->M+1; m++)
00196                 {
00197                         //compute vectors v1 ... v4
00198                         v1[0] = X[kx[n+1]][ky[m]]-X[kx[n]][ky[m]];
00199                         v1[1] = Y[kx[n+1]][ky[m]]-Y[kx[n]][ky[m]];
00200                         v1[2] = Z[kx[n+1]][ky[m]]-Z[kx[n]][ky[m]];
00201 
00202                         v2[0] = X[kx[n]][ky[m+1]]-X[kx[n]][ky[m]];
00203                         v2[1] = Y[kx[n]][ky[m+1]]-Y[kx[n]][ky[m]];
00204                         v2[2] = Z[kx[n]][ky[m+1]]-Z[kx[n]][ky[m]];
00205 
00206                         v3[0] = X[kx[n-1]][ky[m]]-X[kx[n]][ky[m]];
00207                         v3[1] = Y[kx[n-1]][ky[m]]-Y[kx[n]][ky[m]];
00208                         v3[2] = Z[kx[n-1]][ky[m]]-Z[kx[n]][ky[m]];
00209 
00210                         v4[0] = X[kx[n-1]][ky[m-1]]-X[kx[n]][ky[m]];
00211                         v4[1] = Y[kx[n-1]][ky[m-1]]-Y[kx[n]][ky[m]];
00212                         v4[2] = Z[kx[n-1]][ky[m-1]]-Z[kx[n]][ky[m]];
00213 
00214                         one_normal(v1, v2, v3, v4, vn);
00215 
00216                         // copy normal vector to solidObject nX, nY and nZ arrays
00217                         so->nX[kx[n]][ky[m]] = vn[0]; 
00218                         so->nY[kx[n]][ky[m]] = vn[1];
00219                         so->nZ[kx[n]][ky[m]] = vn[2];
00220                 }
00221         }
00222         
00223         delete [] kx;
00224         delete [] ky;
00225 }
00226 
00227 
00228 void SolidObject_draw(SolidObject *so)
00229 {
00230         int N, M, n, m;
00231 
00232         N = so->N;
00233         M = so->M;
00234         
00235         glBegin(GL_QUADS);      
00236         for (n=0; n<N-1; n++)
00237         {
00238                 for (m=0; m<M-1; m++)
00239                 {
00240                         glColor3f(so->R[n][m], so->G[n][m], so->B[n][m]);
00241                         glNormal3f(so->nX[n][m], so->nY[n][m], so->nZ[n][m]);
00242                         glVertex3f(so->X[n][m], so->Y[n][m], so->Z[n][m]);
00243 
00244                         glColor3f(so->R[n+1][m], so->G[n+1][m], so->B[n+1][m]);
00245                         glNormal3f(so->nX[n+1][m], so->nY[n+1][m], so->nZ[n+1][m]);
00246                         glVertex3f(so->X[n+1][m], so->Y[n+1][m], so->Z[n+1][m]);
00247 
00248                         glColor3f(so->R[n+1][m+1], so->G[n+1][m+1], so->B[n+1][m+1]);
00249                         glNormal3f(so->nX[n+1][m+1], so->nY[n+1][m+1], so->nZ[n+1][m+1]);
00250                         glVertex3f(so->X[n+1][m+1], so->Y[n+1][m+1], so->Z[n+1][m+1]);
00251 
00252                         glColor3f(so->R[n][m+1], so->G[n][m+1], so->B[n][m+1]);
00253                         glNormal3f(so->nX[n][m+1], so->nY[n][m+1], so->nZ[n][m+1]);
00254                         glVertex3f(so->X[n][m+1], so->Y[n][m+1], so->Z[n][m+1]);        
00255                 }
00256         }
00257         glEnd();
00258 }
00259 
00260 
00261 void Sail_create_and_draw(datas *d)
00262 {
00263         float v1[3], v2[3], vc[3], normv;
00264 
00265         //sail_E:
00266         v1[0] = d->x_sail - d->x_sail;
00267         v1[1] = d->y_sail - d->y_sail;
00268         v1[2] = d->z_foils+2.0f - d->z_foils+d->L_mast;
00269 
00270         v2[0] = d->x_sail - d->Baume/(sqrt(1.0 + d->tanAngle_sail*d->tanAngle_sail)) - d->x_sail;
00271         v2[1] = d->y_sail - d->Baume*d->tanAngle_sail/(sqrt(1.0 + d->tanAngle_sail*d->tanAngle_sail)) - d->y_sail;
00272         v2[2] = d->z_foils + 2.0f - d->z_foils+d->L_mast;
00273 
00274         cross_product(v1, v2 ,vc);
00275 
00276         normv = sqrt(vc[0]*vc[0] + vc[1]*vc[1] + vc[2]*vc[2]);
00277 
00278         vc[0] /= normv;
00279         vc[1] /= normv;
00280         vc[2] /= normv;
00281 
00282         glBegin(GL_TRIANGLES);
00283                 glNormal3f(vc[0],vc[1],vc[2]);
00284                 glColor3f(0.9f,0.9f,0.9f);
00285                 glVertex3f(d->x_sail, d->y_sail, d->z_foils+2.0f);                              
00286                 glVertex3f(d->x_sail, d->y_sail, d->z_foils+d->L_mast);                         
00287                 glVertex3f(d->x_sail - d->Baume/(sqrt(1.0 + d->tanAngle_sail*d->tanAngle_sail)), d->y_sail - d->Baume*d->tanAngle_sail/(sqrt(1.0 + d->tanAngle_sail*d->tanAngle_sail)), d->z_foils + 2.0f);
00288         glEnd();
00289 }
00290 
00291 
00292 void RelativeWind_draw(datas *d)
00293 {
00294         glLineWidth(1.0f);
00295         glColor3f(0.9, 0.2, 0.2);
00296         glPushMatrix();                              //stock current matrix
00297         glTranslatef(d->x_sail,d->y_sail,d->z_foils+d->L_mast); //translate it on top of mast
00298         glRotatef(-57.2958*d->psi,0.0f,0.0f,1.0f);       //unrotate psi
00299         glRotatef(-57.2958*d->theta,0.0f,1.0f,0.0f); //unrotate theta
00300         glRotatef(-57.2958*d->phi,1.0f,0.0f,0.0f);   //unrotate phi
00301         glBegin(GL_LINES); //draw relative wind vector in boat coordinates (but with "grand coordinate system"-coordinates => wrong)
00302                 glVertex3f(0.0f, 0.0f, 0.0f);
00303                 glVertex3f(d->Wind_x - d->dx, d->Wind_y - d->dy, 0.0f);
00304         glEnd();
00305         glPopMatrix();                               //restore matrix
00306 }
00307 
00308 
00309 void Target_draw(float x, float y)
00310 {
00311         int k, N;
00312         float a;
00313         glLineWidth(1.0f);
00314         glNormal3f(0.0,0.0,1.0);
00315 
00316         glColor3f(0.0, 0.0, 0.0);
00317         glBegin(GL_LINE_STRIP);
00318         for (a=0.0f; a<6.2834; a+=0.3141f)
00319         {
00320                 glVertex3f(cos(a),sin(a),0.0f);
00321         }
00322         glEnd();
00323 
00324         glColor3f(0.0, 0.0, 0.0);
00325         glBegin(GL_LINES);
00326                 glVertex3f(-1.1f, 0.0f, 0.0f);
00327                 glVertex3f( 1.1f, 0.0f, 0.0f);
00328                 glVertex3f( 0.0f,-1.1f, 0.0f);
00329                 glVertex3f( 0.0f, 1.1f, 0.0f);
00330         glEnd();
00331 
00332         glLineWidth(2.0f);
00333         glColor3f(1.0, 0.0, 0.0);
00334         glBegin(GL_LINES);
00335                 glVertex3f(-0.15f + x, 0.0f + y, 0.01f);
00336                 glVertex3f( 0.15f + x, 0.0f + y, 0.01f);
00337                 glVertex3f( 0.0f + x,-0.15f + y, 0.01f);
00338                 glVertex3f( 0.0f + x, 0.15f + y, 0.01f);
00339         glEnd();
00340 }
00341 
00342 
00343 void VSlider_draw(float x)
00344 {
00345         glLineWidth(1.0f);
00346         glColor3f(0.0,0.0,0.0);
00347         //scale:
00348         glBegin(GL_LINES);
00349                 glVertex3f(0.0f, 0.5f, 0.0f);
00350                 glVertex3f(0.0f,-0.5f, 0.0f);
00351 
00352                 glVertex3f(-0.1f, 0.5f, 0.0f);
00353                 glVertex3f( 0.1f, 0.5f, 0.0f);
00354 
00355                 glVertex3f(-0.1f, 0.0f, 0.0f);
00356                 glVertex3f( 0.1f, 0.0f, 0.0f);
00357 
00358                 glVertex3f(-0.1f, -0.5f, 0.0f);
00359                 glVertex3f( 0.1f, -0.5f, 0.0f);
00360         glEnd();
00361 
00362                 glLineWidth(2.0f);
00363                 glColor3f(1.0,0.0,0.0);
00364 
00365         //indicator:
00366         glBegin(GL_LINES);
00367                 glVertex3f(-0.1f, 0.5f*x, 0.01f);
00368                 glVertex3f( 0.1f, 0.5f*x, 0.01f);
00369         glEnd();
00370 }
00371 
00372 void HSlider_draw(float x)
00373 {
00374         glLineWidth(1.0f);
00375         glColor3f(0.0,0.0,0.0);
00376         //scale:
00377         glBegin(GL_LINES);
00378                 glVertex3f(-0.5f, 0.0f, 0.0f);
00379                 glVertex3f( 0.5f,0.0f, 0.0f);
00380 
00381                 glVertex3f( 0.5f,-0.1f, 0.0f);
00382                 glVertex3f( 0.5f, 0.1f, 0.0f);
00383 
00384                 glVertex3f( 0.0f,-0.1f, 0.0f);
00385                 glVertex3f( 0.0f, 0.1f, 0.0f);
00386 
00387                 glVertex3f(-0.5f,-0.1f, 0.0f);
00388                 glVertex3f(-0.5f, 0.1f, 0.0f);
00389         glEnd();
00390 
00391                 glLineWidth(2.0f);
00392                 glColor3f(1.0,0.0,0.0);
00393 
00394         //indicator:
00395         glBegin(GL_LINES);
00396                 glVertex3f( 0.5f*x,-0.1f, 0.0f);
00397                 glVertex3f( 0.5f*x, 0.1f, 0.0f);
00398         glEnd();
00399 }
00400 
00401 
00402 void Girouette_draw(datas *d) // I don't know the english name for a "girouette" :-) ...
00403 {
00404         float rx,lx,y, a, arrow_angle, hypo, baume_angle;
00405         float ax, ay;
00406         float Vrbx, Vrby, normVb, normVrb, num, denom;
00407         float va[3], vb[3], vc[3];
00408         a=0.5236; //Girouette half-opening angle (30 deg)
00409         y=-cos(a);
00410         rx=sin(a);
00411         lx=-rx;
00412         glLineWidth(1.0f);
00413         glNormal3f(0.0,0.0,1.0);
00414 
00415         glColor3f(0.0, 0.0, 0.0);
00416         //girouette arms
00417         glBegin(GL_LINES);
00418                 glVertex3f(0.0f, 0.0f, 0.0f);
00419                 glVertex3f(rx, y, 0.0f);
00420 
00421                 glVertex3f(0.0f, 0.0f, 0.0f);
00422                 glVertex3f(lx, y, 0.0f);
00423         glEnd();
00424 
00425         //red girouette pads:
00426         glColor3f(0.85,0.05,0.05);
00427         glBegin(GL_QUADS);
00428                 glVertex3f(rx+0.1f, y+0.1f, 0.0f);
00429                 glVertex3f(rx-0.1f, y+0.1f, 0.0f);
00430                 glVertex3f(rx-0.1f, y-0.1f, 0.0f);
00431                 glVertex3f(rx+0.1f, y-0.1f, 0.0f);
00432 
00433                 glVertex3f(lx+0.1f, y+0.1f, 0.0f);
00434                 glVertex3f(lx-0.1f, y+0.1f, 0.0f);
00435                 glVertex3f(lx-0.1f, y-0.1f, 0.0f);
00436                 glVertex3f(lx+0.1f, y-0.1f, 0.0f);
00437         glEnd();
00438 
00439         //girouette arrow (wind)
00440         ax = - (d->Wind_x - d->dx);
00441         ay = - (d->Wind_y - d->dy);
00442         hypo = sqrt(ax*ax + ay*ay);
00443         if (hypo != 0.0)
00444         {
00445                 Vrbx = d->Wind_x - d->dx;
00446                 Vrby = d->Wind_y - d->dy;
00447                 num = -d->dx*Vrbx - d->dy*Vrby;
00448                 denom = sqrt(d->dx*d->dx + d->dy*d->dy)*sqrt(Vrbx*Vrbx + Vrby*Vrby);
00449                 arrow_angle = 57.2958f*acos(num/denom);
00450                 va[0]=Vrbx;
00451                 va[1]=Vrby;
00452                 va[2]=0.0f;
00453                 vb[0]=-d->dx;
00454                 vb[1]=-d->dy;
00455                 vb[2]=0.0f;
00456                 cross_product(va, vb, vc);
00457                 if (vc[2]>0.0f) arrow_angle *= -1.0f;
00458                 d->angle_girouette = arrow_angle/57.2958f;
00459 
00460         //      if (Vrby<0.0f) arrow_angle *= -1.0f;
00461                 //arrow_angle = 57.2958f*acos(ax/hypo);
00462                 //if (ay<0.0f) arrow_angle = - arrow_angle; //cosinus ambiguity
00463                 //arrow_angle = 57.2958f*(atan(d->tanAngle_sail) - atan(d->Tan_AoA_sail));
00464                 //arrow_angle += 57.2958f*d->psi;
00465                 //printf("ax=%f, ay=%f, angle=%f , psi=%f \n",ax, ay, arrow_angle, 57.2958f*d->psi);
00466                 glLineWidth(2.0f);
00467                 glPushMatrix() ;
00468                 glRotatef(arrow_angle, 0.0f, 0.0f, 1.0f);
00469                 glBegin(GL_LINES);
00470                         glVertex3f(0.0f, 0.0f, 0.0f);
00471                         glVertex3f(0.0f, -0.8f, 0.0f);
00472 
00473                         glVertex3f(0.0f, -0.8f, 0.0f);
00474                         glVertex3f(0.1f, -0.7f, 0.0f);
00475         
00476                         glVertex3f(0.0f, -0.8f, 0.0f);
00477                         glVertex3f(-0.1f, -0.7f, 0.0f);
00478                 glEnd();
00479                 glPopMatrix() ;
00480 
00481                 //baume
00482                 baume_angle = atan(d->tanAngle_sail);
00483                 glColor3f(0.9,0.9,0.05);
00484                 glBegin(GL_LINES);
00485                         glVertex3f(0.0f, 0.0f, -0.001f);
00486                         glVertex3f(1.2f*sin(baume_angle), -1.2f*cos(baume_angle), -0.001f);
00487                 glEnd();
00488         }
00489 }
00490 
00491 
00492 
00493 
00494 void Boat_draw()
00495 {
00496         SolidObject_draw(hull);
00497 
00498         SolidObject_draw(rSwimm);
00499         SolidObject_draw(lSwimm);
00500 
00501         SolidObject_draw(bridgeMain);
00502         SolidObject_draw(bridge2);
00503 
00504         SolidObject_draw(mast);
00505 
00506         SolidObject_draw(foilr);
00507         SolidObject_draw(foill);
00508 
00509         SolidObject_draw(yaw);
00510 
00511         SolidObject_draw(pitch);
00512 }
00513 
00514 void Boat_delete()
00515 {
00516         SolidObject_delete(hull);
00517 
00518         SolidObject_delete(rSwimm);
00519         SolidObject_delete(lSwimm);
00520 
00521         SolidObject_delete(bridgeMain);
00522         SolidObject_delete(bridge2);
00523 
00524         SolidObject_delete(mast);
00525 
00526         SolidObject_delete(foilr);
00527         SolidObject_delete(foill);
00528 
00529         SolidObject_delete(yaw);
00530 
00531         SolidObject_delete(pitch);
00532 }
00533 
00534 
00535 
00536 
00537 
00538 void Boat_create(datas *d)
00539 {
00540         int n,m,k,q;
00541         float temp1, temp2;
00542 
00543         SolidObject_create(hull, 8, 9);
00544         SolidObject_create(rSwimm, 8, 9);
00545         SolidObject_create(lSwimm, 8, 9);
00546         SolidObject_create(bridgeMain, 4, 5);
00547         SolidObject_create(bridge2, 5, 5);
00548         SolidObject_create(mast, 2, 5);
00549         SolidObject_create(foilr, 2, 2);
00550         SolidObject_create(foill, 2, 2);
00551         SolidObject_create(yaw, 2, 2);
00552         SolidObject_create(pitch, 2, 2);
00553         
00554 
00555 //hull coordinates (column by collumn)
00556 
00557         for (k=0; k<9; k++) hull->X[0][k] = d->x_yaw-0.001;
00558 
00559         hull->X[1][0]=d->x_yaw-0.001;
00560         hull->X[1][8]=d->x_yaw-0.001;
00561         hull->X[1][6]=d->x_yaw-0.001;
00562         hull->X[1][1]=d->x_yaw-0.15f-0.001;
00563         hull->X[1][5]=d->x_yaw-0.15f-0.001;
00564         hull->X[1][2]=d->x_yaw-0.25f-0.001;
00565         hull->X[1][4]=d->x_yaw-0.25f-0.001;
00566         hull->X[1][3]=d->x_yaw-0.3f-0.001;
00567         hull->X[1][7]=d->x_yaw-0.1f-0.001;
00568 
00569         hull->X[2][0]=d->x_yaw;
00570         hull->X[2][8]=d->x_yaw;
00571         hull->X[2][6]=d->x_yaw;
00572         hull->X[2][1]=d->x_yaw-0.15f;
00573         hull->X[2][5]=d->x_yaw-0.15f;
00574         hull->X[2][2]=d->x_yaw-0.25f;
00575         hull->X[2][4]=d->x_yaw-0.25f;
00576         hull->X[2][3]=d->x_yaw-0.3f;
00577         hull->X[2][7]=d->x_yaw-0.1f;
00578 
00579         for (k=0; k<9; k++) hull->X[3][k] = d->x_yaw+(d->Long/3.0);
00580         for (k=0; k<9; k++) hull->X[4][k] = d->x_yaw+2.0*(d->Long/4.0);
00581         for (k=0; k<9; k++) hull->X[5][k] = d->x_yaw+3.0*(d->Long/4.0);
00582         for (k=0; k<9; k++) hull->X[6][k] = d->x_yaw+4.0*(d->Long/4.0);
00583         for (k=0; k<9; k++) hull->X[7][k] = d->x_yaw+4.0*(d->Long/4.0)-0.01;
00584 
00585 
00586         for (k=0; k<9; k++) hull->Y[0][k] = d->y_yaw;
00587 
00588         hull->Y[1][0] = d->y_yaw - 0.3f;
00589         hull->Y[1][8] = d->y_yaw - 0.3f;
00590         hull->Y[1][6] = d->y_yaw + 0.3f;
00591         hull->Y[1][1] = d->y_yaw - 0.3f;
00592         hull->Y[1][5] = d->y_yaw + 0.3f;
00593         hull->Y[1][2] = d->y_yaw - 0.2f;
00594         hull->Y[1][4] = d->y_yaw + 0.2f;
00595         hull->Y[1][3] = d->y_yaw;
00596         hull->Y[1][7] = d->y_yaw;
00597         
00598         hull->Y[2][0] = d->y_yaw - 0.3f;
00599         hull->Y[2][8] = d->y_yaw - 0.3f;
00600         hull->Y[2][6] = d->y_yaw + 0.3f;
00601         hull->Y[2][1] = d->y_yaw - 0.3f;
00602         hull->Y[2][5] = d->y_yaw + 0.3f;
00603         hull->Y[2][2] = d->y_yaw - 0.2f;
00604         hull->Y[2][4] = d->y_yaw + 0.2f;
00605         hull->Y[2][3] = d->y_yaw;
00606         hull->Y[2][7] = d->y_yaw;
00607 
00608         hull->Y[3][0] = d->y_yaw - 0.65f;
00609         hull->Y[3][8] = d->y_yaw - 0.65f;
00610         hull->Y[3][6] = d->y_yaw + 0.65f;
00611         hull->Y[3][1] = d->y_yaw - 0.65f;
00612         hull->Y[3][5] = d->y_yaw + 0.65f;
00613         hull->Y[3][2] = d->y_yaw - 0.4f;
00614         hull->Y[3][4] = d->y_yaw + 0.4f;
00615         hull->Y[3][3] = d->y_yaw;
00616         hull->Y[3][7] = d->y_yaw;
00617 
00618         hull->Y[4][0] = d->y_yaw - 0.8f;
00619         hull->Y[4][8] = d->y_yaw - 0.8f;
00620         hull->Y[4][6] = d->y_yaw + 0.8f;
00621         hull->Y[4][1] = d->y_yaw - 0.8f;
00622         hull->Y[4][5] = d->y_yaw + 0.8f;
00623         hull->Y[4][2] = d->y_yaw - 0.6f;
00624         hull->Y[4][4] = d->y_yaw + 0.6f;
00625         hull->Y[4][3] = d->y_yaw;
00626         hull->Y[4][7] = d->y_yaw;
00627 
00628         hull->Y[5][0] = d->y_yaw - 0.5f;
00629         hull->Y[5][8] = d->y_yaw - 0.5f;
00630         hull->Y[5][6] = d->y_yaw + 0.5f;
00631         hull->Y[5][1] = d->y_yaw - 0.5f;
00632         hull->Y[5][5] = d->y_yaw + 0.5f;
00633         hull->Y[5][2] = d->y_yaw - 0.3f;
00634         hull->Y[5][4] = d->y_yaw + 0.3f;
00635         hull->Y[5][3] = d->y_yaw;
00636         hull->Y[5][7] = d->y_yaw;
00637 
00638         hull->Y[6][0] = d->y_yaw - 0.01f;
00639         hull->Y[6][8] = d->y_yaw - 0.01f;
00640         hull->Y[6][6] = d->y_yaw + 0.01f;
00641         hull->Y[6][1] = d->y_yaw - 0.01f;
00642         hull->Y[6][5] = d->y_yaw + 0.01f;
00643         hull->Y[6][2] = d->y_yaw - 0.005f;
00644         hull->Y[6][4] = d->y_yaw + 0.005f;
00645         hull->Y[6][3] = d->y_yaw;
00646         hull->Y[6][7] = d->y_yaw;
00647 
00648         hull->Y[7][0] = d->y_yaw - 0.0f;
00649         hull->Y[7][8] = d->y_yaw - 0.0f;
00650         hull->Y[7][6] = d->y_yaw + 0.0f;
00651         hull->Y[7][1] = d->y_yaw - 0.0f;
00652         hull->Y[7][5] = d->y_yaw + 0.0f;
00653         hull->Y[7][2] = d->y_yaw - 0.0f;
00654         hull->Y[7][4] = d->y_yaw + 0.0f;
00655         hull->Y[7][3] = d->y_yaw;
00656         hull->Y[7][7] = d->y_yaw;
00657 
00658 
00659         for (k=0; k<9; k++) hull->Z[0][k] = d->z_foils;
00660 
00661         hull->Z[1][7] = d->z_foils + 0.03f;
00662         hull->Z[1][0] = d->z_foils - 0.0f;
00663         hull->Z[1][8] = d->z_foils - 0.0f;
00664         hull->Z[1][6] = d->z_foils - 0.0f;
00665         hull->Z[1][1] = d->z_foils - 0.3f;
00666         hull->Z[1][5] = d->z_foils - 0.3f;
00667         hull->Z[1][2] = d->z_foils - 0.5f;
00668         hull->Z[1][4] = d->z_foils - 0.5f;
00669         hull->Z[1][3] = d->z_foils - 0.6f;
00670 
00671         hull->Z[2][7] = d->z_foils + 0.03f;
00672         hull->Z[2][0] = d->z_foils - 0.0f;
00673         hull->Z[2][8] = d->z_foils - 0.0f;
00674         hull->Z[2][6] = d->z_foils - 0.0f;
00675         hull->Z[2][1] = d->z_foils - 0.3f;
00676         hull->Z[2][5] = d->z_foils - 0.3f;
00677         hull->Z[2][2] = d->z_foils - 0.5f;
00678         hull->Z[2][4] = d->z_foils - 0.5f;
00679         hull->Z[2][3] = d->z_foils - 0.6f;
00680 
00681         hull->Z[3][7] = d->z_foils + 0.07f;
00682         hull->Z[3][0] = d->z_foils - 0.0f;
00683         hull->Z[3][8] = d->z_foils - 0.0f;
00684         hull->Z[3][6] = d->z_foils - 0.0f;
00685         hull->Z[3][1] = d->z_foils - 0.4f;
00686         hull->Z[3][5] = d->z_foils - 0.4f;
00687         hull->Z[3][2] = d->z_foils - 0.8f;
00688         hull->Z[3][4] = d->z_foils - 0.8f;
00689         hull->Z[3][3] = d->z_foils - 1.1f;
00690 
00691         hull->Z[4][7] = d->z_foils + 0.1f;
00692         hull->Z[4][0] = d->z_foils - 0.0f;
00693         hull->Z[4][8] = d->z_foils - 0.0f;
00694         hull->Z[4][6] = d->z_foils - 0.0f;
00695         hull->Z[4][1] = d->z_foils - 0.4f;
00696         hull->Z[4][5] = d->z_foils - 0.4f;
00697         hull->Z[4][2] = d->z_foils - 0.9f;
00698         hull->Z[4][4] = d->z_foils - 0.9f;
00699         hull->Z[4][3] = d->z_foils - 1.2f;
00700 
00701         hull->Z[5][7] = d->z_foils + 0.06f;
00702         hull->Z[5][0] = d->z_foils - 0.0f;
00703         hull->Z[5][8] = d->z_foils - 0.0f;
00704         hull->Z[5][6] = d->z_foils - 0.0f;
00705         hull->Z[5][1] = d->z_foils - 0.3f;
00706         hull->Z[5][5] = d->z_foils - 0.3f;
00707         hull->Z[5][2] = d->z_foils - 0.7f;
00708         hull->Z[5][4] = d->z_foils - 0.7f;
00709         hull->Z[5][3] = d->z_foils - 1.0f;
00710 
00711         hull->Z[6][7] = d->z_foils + 0.0f;
00712         hull->Z[6][0] = d->z_foils - 0.0f;
00713         hull->Z[6][8] = d->z_foils - 0.0f;
00714         hull->Z[6][6] = d->z_foils - 0.0f;
00715         hull->Z[6][1] = d->z_foils - 0.2f;
00716         hull->Z[6][5] = d->z_foils - 0.2f;
00717         hull->Z[6][2] = d->z_foils - 0.35f;
00718         hull->Z[6][4] = d->z_foils - 0.35f;
00719         hull->Z[6][3] = d->z_foils - 0.5f;
00720 
00721         hull->Z[7][7] = d->z_foils + 0.0f;
00722         hull->Z[7][0] = d->z_foils - 0.0f;
00723         hull->Z[7][8] = d->z_foils - 0.0f;
00724         hull->Z[7][6] = d->z_foils - 0.0f;
00725         hull->Z[7][1] = d->z_foils - 0.2f;
00726         hull->Z[7][5] = d->z_foils - 0.2f;
00727         hull->Z[7][2] = d->z_foils - 0.35f;
00728         hull->Z[7][4] = d->z_foils - 0.35f;
00729         hull->Z[7][3] = d->z_foils - 0.5f;
00730 
00731         for (q=0; q<8; q++)
00732         {
00733                 for(k=0; k<9; k++)
00734                 {
00735                         hull->R[q][k]=0.95;
00736                         hull->G[q][k]=0.95;
00737                         hull->B[q][k]=0.95;
00738                 }
00739         }
00740 
00742 
00743         //swimmers (same as hull but smaller)
00744         //right swimmer:
00745         for (q=0; q<8; q++)
00746         {
00747                 for(k=0; k<9; k++)
00748                 {
00749                         rSwimm->X[q][k] = hull->X[q][k];
00750                         rSwimm->Y[q][k] = hull->Y[q][k] - d->y_yaw;
00751                         rSwimm->Z[q][k] = hull->Z[q][k] - d->z_foils;
00752 
00753                         rSwimm->R[q][k] = hull->R[q][k];
00754                         rSwimm->G[q][k] = hull->G[q][k];
00755                         rSwimm->B[q][k] = hull->B[q][k];
00756 
00757                         //resize:
00758                         rSwimm->X[q][k] *=0.45;
00759                         rSwimm->Y[q][k] *=0.45;
00760                         rSwimm->Z[q][k] *=0.45;
00761 
00762                         //translate:
00763                         rSwimm->X[q][k] += d->x_foils -1.0;
00764                         rSwimm->Y[q][k] += d->y_foil_right;
00765                         rSwimm->Z[q][k] += d->z_foils;                  
00766                 }
00767         }
00768 
00769         //left swimmer:
00770         for (q=0; q<8; q++)
00771         {
00772                 for(k=0; k<9; k++)
00773                 {
00774                         lSwimm->X[q][k] = hull->X[q][k];
00775                         lSwimm->Y[q][k] = hull->Y[q][k] - d->y_yaw;
00776                         lSwimm->Z[q][k] = hull->Z[q][k] - d->z_foils;
00777 
00778                         lSwimm->R[q][k] = hull->R[q][k];
00779                         lSwimm->G[q][k] = hull->G[q][k];
00780                         lSwimm->B[q][k] = hull->B[q][k];
00781 
00782                         //resize:
00783                         lSwimm->X[q][k] *=0.45;
00784                         lSwimm->Y[q][k] *=0.45;
00785                         lSwimm->Z[q][k] *=0.45;
00786 
00787                         //translate:
00788                         lSwimm->X[q][k] += d->x_foils -1.0;
00789                         lSwimm->Y[q][k] += d->y_foil_left;
00790                         lSwimm->Z[q][k] += d->z_foils;                  
00791                 }
00792         }
00793 
00794 
00795         //hull is too "flat"...:
00796         for (q=0; q<8; q++)
00797         {
00798                 for(k=0; k<9; k++)
00799                 {
00800                         hull->Z[q][k]*=1.5;
00801                 }
00802         }
00803 
00805 
00806         //Bridge main:
00807         temp1 = 0.7;
00808         temp2 = 0.2;
00809 
00810         for (k=0; k<4; k++)
00811         {
00812                 bridgeMain->X[k][0] = d->x_foils + temp2 - temp1;
00813                 bridgeMain->X[k][1] = d->x_foils + temp2 - temp1;
00814                 bridgeMain->X[k][2] = d->x_foils - temp2 - temp1;
00815                 bridgeMain->X[k][3] = d->x_foils - temp2 - temp1;
00816                 bridgeMain->X[k][4] = d->x_foils + temp2 - temp1;
00817         }
00818 
00819         for (q=0; q<5; q++)
00820         {
00821                 bridgeMain->Y[0][q] = d->y_foil_left;
00822                 bridgeMain->Y[1][q] = d->y_foil_left + 0.001*d->y_foil_right;
00823                 bridgeMain->Y[2][q] = d->y_foil_right + 0.001*d->y_foil_left;
00824                 bridgeMain->Y[3][q] = d->y_foil_right;
00825         }
00826 
00827         for (k=0; k<4; k++)
00828         {
00829                 bridgeMain->Z[k][0] = d->z_foils + temp2;
00830                 bridgeMain->Z[k][1] = d->z_foils - temp2;
00831                 bridgeMain->Z[k][2] = d->z_foils - temp2;
00832                 bridgeMain->Z[k][3] = d->z_foils + temp2;
00833                 bridgeMain->Z[k][4] = d->z_foils + temp2;
00834         }
00835 
00836         for (q=0; q<4; q++)
00837         {
00838                 for(k=0; k<5; k++)
00839                 {
00840                         bridgeMain->R[q][k] = hull->R[q][k];
00841                         bridgeMain->G[q][k] = hull->G[q][k];
00842                         bridgeMain->B[q][k] = hull->B[q][k]; 
00843                 }
00844         }
00845 
00846 
00848         // bridge2:
00849 
00850         for (k=0; k<5;k++)
00851         {
00852                 bridge2->X[k][0] = d->x_foils + temp2 - d->Chord_max + temp1;
00853                 bridge2->X[k][1] = d->x_foils + temp2 - d->Chord_max + temp1;
00854                 bridge2->X[k][2] = d->x_foils - temp2 - d->Chord_max + temp1;
00855                 bridge2->X[k][3] = d->x_foils - temp2 - d->Chord_max + temp1;
00856                 bridge2->X[k][4] = d->x_foils + temp2 - d->Chord_max + temp1;
00857         }
00858 
00859         for (k=0; k<5;k++)
00860         {
00861                 bridge2->X[2][k] -= 1.5;
00862         }
00863 
00864 
00865         for (q=0; q<5; q++)
00866         {
00867                 bridge2->Y[0][q] = d->y_foil_left;
00868                 bridge2->Y[1][q] = d->y_foil_left + 0.001*d->y_foil_right;
00869                 bridge2->Y[2][q] = 0.5*(d->y_foil_right+d->y_foil_left);
00870                 bridge2->Y[3][q] = d->y_foil_right + 0.001*d->y_foil_left;
00871                 bridge2->Y[4][q] = d->y_foil_right;
00872         }
00873 
00874 
00875         for (q=0; q<5; q++)
00876         {
00877                 bridge2->Z[q][0] = d->z_foils + temp2;
00878                 bridge2->Z[q][1] = d->z_foils - temp2;
00879                 bridge2->Z[q][2] = d->z_foils - temp2;
00880                 bridge2->Z[q][3] = d->z_foils + temp2;
00881                 bridge2->Z[q][4] = d->z_foils + temp2;
00882         }
00883 
00884 
00885         for (q=0; q<5; q++)
00886         {
00887                 for(k=0; k<5; k++)
00888                 {
00889                         bridge2->R[q][k] = hull->R[q][k];
00890                         bridge2->G[q][k] = hull->G[q][k];
00891                         bridge2->B[q][k] = hull->B[q][k]; 
00892                 }
00893         }
00894 
00896         // mast
00897         for (k=0; k<2; k++)
00898         {
00899                 mast->X[k][0] = d->x_sail - 0.18;
00900                 mast->X[k][1] = d->x_sail + 0.18;
00901                 mast->X[k][2] = d->x_sail + 0.18;
00902                 mast->X[k][3] = d->x_sail - 0.18;
00903                 mast->X[k][4] = d->x_sail - 0.18;
00904 
00905                 mast->Y[k][0] = d->y_sail - 0.18;
00906                 mast->Y[k][1] = d->y_sail - 0.18;
00907                 mast->Y[k][2] = d->y_sail + 0.18;
00908                 mast->Y[k][3] = d->y_sail + 0.18;
00909                 mast->Y[k][4] = d->y_sail - 0.18;
00910 
00911                 mast->nX[k][0] = - sqrt(2.0);
00912                 mast->nX[k][1] = + sqrt(2.0);
00913                 mast->nX[k][2] = + sqrt(2.0);
00914                 mast->nX[k][3] = - sqrt(2.0);
00915                 mast->nX[k][4] = - sqrt(2.0);
00916 
00917                 mast->nY[k][0] = - sqrt(2.0);
00918                 mast->nY[k][1] = - sqrt(2.0);
00919                 mast->nY[k][2] = + sqrt(2.0);
00920                 mast->nY[k][3] = + sqrt(2.0);
00921                 mast->nY[k][4] = - sqrt(2.0);
00922         }
00923         for (k=0; k<5; k++)
00924         {
00925                 mast->Z[0][k] = d->z_foils+d->L_mast;
00926                 mast->Z[1][k] = d->z_foils;
00927                 
00928                 for (q=0; q<2; q++)
00929                 {
00930                         mast->nZ[q][k] = 0.0;
00931 
00932                         mast->R[q][k] = 0.85;
00933                         mast->G[q][k] = 0.85;
00934                         mast->B[q][k] = 0.95;
00935                 }
00936         }
00937 
00938 
00940         //right foil:
00941 
00942         foilr->X[0][0] = d->x_foils-d->Chord_min;
00943         foilr->X[0][1] = d->x_foils;
00944         foilr->X[1][0] = d->x_foils-d->Chord_max;
00945         foilr->X[1][1] = d->x_foils;
00946 
00947         foilr->Y[0][0] = d->y_foil_right+cos(d->alpha_right)*d->E_foils;
00948         foilr->Y[0][1] = d->y_foil_right+cos(d->alpha_right)*d->E_foils;
00949         foilr->Y[1][0] = d->y_foil_right;
00950         foilr->Y[1][1] = d->y_foil_right;
00951 
00952         foilr->Z[0][0] = d->z_foils-sin(d->alpha_right)*d->E_foils;
00953         foilr->Z[0][1] = d->z_foils-sin(d->alpha_right)*d->E_foils;
00954         foilr->Z[1][0] = d->z_foils;
00955         foilr->Z[1][1] = d->z_foils;
00956 
00957         for (k=0; k<2; k++)
00958         {
00959                 for (q=0; q<2; q++)
00960                 {
00961                         foilr->nX[k][q] = 0.0;
00962                         foilr->nY[k][q] = sin(d->alpha_right);
00963                         foilr->nZ[k][q] = cos(d->alpha_right);
00964 
00965                         foilr->R[k][q] = hull->R[0][0];
00966                         foilr->G[k][q] = hull->G[0][0];
00967                         foilr->B[k][q] = hull->B[0][0];
00968                 }
00969         }
00970 
00971         //left foil:
00972 
00973         foill->X[1][0] = d->x_foils-d->Chord_min;
00974         foill->X[1][1] = d->x_foils;
00975         foill->X[0][0] = d->x_foils-d->Chord_max;
00976         foill->X[0][1] = d->x_foils;
00977 
00978         foill->Y[1][0] = d->y_foil_left-cos(d->alpha_left)*d->E_foils;
00979         foill->Y[1][1] = d->y_foil_left-cos(d->alpha_left)*d->E_foils;
00980         foill->Y[0][0] = d->y_foil_left;
00981         foill->Y[0][1] = d->y_foil_left;
00982 
00983         foill->Z[1][0] = d->z_foils-sin(d->alpha_left)*d->E_foils;
00984         foill->Z[1][1] = d->z_foils-sin(d->alpha_left)*d->E_foils;
00985         foill->Z[0][0] = d->z_foils;
00986         foill->Z[0][1] = d->z_foils;
00987 
00988         for (k=0; k<2; k++)
00989         {
00990                 for (q=0; q<2; q++)
00991                 {
00992                         foill->nX[k][q] = 0.0;
00993                         foill->nY[k][q] = -sin(d->alpha_right);
00994                         foill->nZ[k][q] = cos(d->alpha_right);
00995 
00996                         foill->R[k][q] = hull->R[0][0];
00997                         foill->G[k][q] = hull->G[0][0];
00998                         foill->B[k][q] = hull->B[0][0];
00999                 }
01000         }
01001 
01002 
01004         //yaw
01005         for (q=0; q<2; q++)
01006         {
01007                 yaw->X[0][q] = d->x_yaw;
01008                 yaw->X[1][q] = d->x_yaw+d->Chord_yaw;
01009 
01010                 yaw->Z[q][0] = d->z_foils;
01011                 yaw->Z[q][1] = d->z_yaw-d->E_yaw;
01012                 
01013                 for (k=0; k<2; k++)
01014                 {
01015                         yaw->Y[k][q] = d->y_yaw;
01016 
01017                         yaw->nX[k][q] = 0.0;
01018                         yaw->nY[k][q] = 1.0;
01019                         yaw->nZ[k][q] = 0.0;
01020 
01021                         yaw->R[k][q] = hull->R[0][0];
01022                         yaw->G[k][q] = hull->G[0][0];
01023                         yaw->B[k][q] = hull->B[0][0];
01024                 }
01025         }
01026 
01027 
01029         //pitch
01030         for (q=0; q<2; q++)
01031         {
01032                 pitch->X[q][0] = d->x_pitch;
01033                 pitch->X[q][1] = d->x_pitch+d->Chord_pitch;
01034 
01035                 pitch->Y[0][q] = d->y_pitch+0.5*d->Env_pitch;
01036                 pitch->Y[1][q] = d->y_pitch-0.5*d->Env_pitch;
01037 
01038                 for (k=0; k<2; k++)
01039                 {
01040                         pitch->Z[k][q] = d->z_pitch;
01041 
01042                         pitch->nX[k][q] = 0.0;
01043                         pitch->nY[k][q] = 0.0;
01044                         pitch->nZ[k][q] = 1.0;
01045 
01046                         pitch->R[k][q] = hull->R[0][0];
01047                         pitch->G[k][q] = hull->G[0][0];
01048                         pitch->B[k][q] = hull->B[0][0];
01049                 }
01050         }
01051 
01052 
01053         SolidObject_compute_normals(hull);
01054         SolidObject_compute_normals(rSwimm);
01055         SolidObject_compute_normals(lSwimm);
01056         SolidObject_compute_normals(bridgeMain);
01057         SolidObject_compute_normals(bridge2);
01058 
01059         for (k=0;k<8;k++)//normals errors at junction...:
01060         {
01061                 hull->nX[k][0] = hull->nX[k][6];
01062                 hull->nX[k][8] = hull->nX[k][6];
01063                 hull->nY[k][0] =-hull->nY[k][6];
01064                 hull->nY[k][8] =-hull->nY[k][6];
01065                 hull->nZ[k][0] = hull->nZ[k][6];
01066                 hull->nZ[k][8] = hull->nZ[k][6];
01067 
01068                 rSwimm->nX[k][0] = rSwimm->nX[k][6];
01069                 rSwimm->nX[k][8] = rSwimm->nX[k][6];
01070                 rSwimm->nY[k][0] =-rSwimm->nY[k][6];
01071                 rSwimm->nY[k][8] =-rSwimm->nY[k][6];
01072                 rSwimm->nZ[k][0] = rSwimm->nZ[k][6];
01073                 rSwimm->nZ[k][8] = rSwimm->nZ[k][6];
01074 
01075                 lSwimm->nX[k][0] = lSwimm->nX[k][6];
01076                 lSwimm->nX[k][8] = lSwimm->nX[k][6];
01077                 lSwimm->nY[k][0] =-lSwimm->nY[k][6];
01078                 lSwimm->nY[k][8] =-lSwimm->nY[k][6];
01079                 lSwimm->nZ[k][0] = lSwimm->nZ[k][6];
01080                 lSwimm->nZ[k][8] = lSwimm->nZ[k][6];
01081         }
01082         // mast normals entered by hand
01083         // foils normals entered by hand
01084 }
01085 
01086  

Generated on Fri Jun 9 19:10:21 2006 for hydroMex3 by  doxygen 1.4.6-NO