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 {
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 {
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 {
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 {
00127 float c12[3];
00128 float c23[3];
00129 float c34[3];
00130 float c41[3];
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
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];
00162 float v2[3];
00163 float v3[3];
00164 float v4[3];
00165
00166 float vn[3];
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;
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;
00179 kx[so->N+1] = 0;
00180
00181 ky[0]=so->M-1;
00182 for (m=1; m<so->M+1; m++) ky[m]=m-1;
00183 ky[so->M+1] = 0;
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 for (n=1; n<so->N+1; n++)
00194 {
00195 for (m=1; m<so->M+1; m++)
00196 {
00197
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
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 GLuint *texture = get_texture();
00266
00267 glBindTexture( GL_TEXTURE_2D, texture[0] );
00268 glEnable( GL_TEXTURE_2D );
00269
00270
00271
00272 v1[0] = d->x_sail - d->x_sail;
00273 v1[1] = d->y_sail - d->y_sail;
00274 v1[2] = d->z_foils+2.0f - d->z_foils+d->L_mast;
00275
00276 v2[0] = d->x_sail - d->Baume/(sqrt(1.0 + d->tanAngle_sail*d->tanAngle_sail)) - d->x_sail;
00277 v2[1] = d->y_sail - d->Baume*d->tanAngle_sail/(sqrt(1.0 + d->tanAngle_sail*d->tanAngle_sail)) - d->y_sail;
00278 v2[2] = d->z_foils + 2.0f - d->z_foils+d->L_mast;
00279
00280 cross_product(v1, v2 ,vc);
00281
00282 normv = sqrt(vc[0]*vc[0] + vc[1]*vc[1] + vc[2]*vc[2]);
00283
00284 vc[0] /= normv;
00285 vc[1] /= normv;
00286 vc[2] /= normv;
00287
00288 glBegin( GL_QUADS );
00289 glNormal3f(vc[0],vc[1],vc[2]);
00290 glColor3f(0.9f,0.9f,0.9f);
00291 glTexCoord2f( 0.0f, 1.0f );
00292 glVertex3f(d->x_sail, d->y_sail, d->z_foils+2.0f);
00293 glTexCoord2f( 0.0f, 0.0f );
00294
00295 glVertex3f(d->x_sail, d->y_sail, d->z_foils+d->L_mast);
00296 glTexCoord2f( 1.0f, 0.0f );
00297 glVertex3f(d->x_sail, d->y_sail, d->z_foils+d->L_mast);
00298 glTexCoord2f( 1.0f, 1.0f );
00299 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);
00300 glEnd();
00301 glDisable( GL_TEXTURE_2D );
00302 }
00303
00304
00305 void RelativeWind_draw(datas *d)
00306 {
00307 glLineWidth(1.0f);
00308 glColor3f(0.9, 0.2, 0.2);
00309 glPushMatrix();
00310 glTranslatef(d->x_sail,d->y_sail,d->z_foils+d->L_mast);
00311 glRotatef(-57.2958*d->psi,0.0f,0.0f,1.0f);
00312 glRotatef(-57.2958*d->theta,0.0f,1.0f,0.0f);
00313 glRotatef(-57.2958*d->phi,1.0f,0.0f,0.0f);
00314 glBegin(GL_LINES);
00315 glVertex3f(0.0f, 0.0f, 0.0f);
00316 glVertex3f(d->Wind_x - d->dx, d->Wind_y - d->dy, 0.0f);
00317 glEnd();
00318 glPopMatrix();
00319 }
00320
00321
00322 void Target_draw(float x, float y)
00323 {
00324 int k, N;
00325 float a;
00326 glLineWidth(1.0f);
00327 glNormal3f(0.0,0.0,1.0);
00328
00329 glColor3f(0.0, 0.0, 0.0);
00330 glBegin(GL_LINE_STRIP);
00331 for (a=0.0f; a<6.2834; a+=0.3141f)
00332 {
00333 glVertex3f(cos(a),sin(a),0.0f);
00334 }
00335 glEnd();
00336
00337 glColor3f(0.0, 0.0, 0.0);
00338 glBegin(GL_LINES);
00339 glVertex3f(-1.1f, 0.0f, 0.0f);
00340 glVertex3f( 1.1f, 0.0f, 0.0f);
00341 glVertex3f( 0.0f,-1.1f, 0.0f);
00342 glVertex3f( 0.0f, 1.1f, 0.0f);
00343 glEnd();
00344
00345 glLineWidth(2.0f);
00346 glColor3f(1.0, 0.0, 0.0);
00347 glBegin(GL_LINES);
00348 glVertex3f(-0.15f + x, 0.0f + y, 0.0f);
00349 glVertex3f( 0.15f + x, 0.0f + y, 0.0f);
00350 glVertex3f( 0.0f + x,-0.15f + y, 0.0f);
00351 glVertex3f( 0.0f + x, 0.15f + y, 0.0f);
00352 glEnd();
00353 }
00354
00355
00356 void VSlider_draw(float x)
00357 {
00358 glLineWidth(1.0f);
00359 glColor3f(0.0,0.0,0.0);
00360
00361 glBegin(GL_LINES);
00362 glVertex3f(0.0f, 0.5f, 0.0f);
00363 glVertex3f(0.0f,-0.5f, 0.0f);
00364
00365 glVertex3f(-0.1f, 0.5f, 0.0f);
00366 glVertex3f( 0.1f, 0.5f, 0.0f);
00367
00368 glVertex3f(-0.1f, 0.0f, 0.0f);
00369 glVertex3f( 0.1f, 0.0f, 0.0f);
00370
00371 glVertex3f(-0.1f, -0.5f, 0.0f);
00372 glVertex3f( 0.1f, -0.5f, 0.0f);
00373 glEnd();
00374
00375 glLineWidth(2.0f);
00376 glColor3f(1.0,0.0,0.0);
00377
00378
00379 glBegin(GL_LINES);
00380 glVertex3f(-0.1f, 0.5f*x, 0.0f);
00381 glVertex3f( 0.1f, 0.5f*x, 0.0f);
00382 glEnd();
00383 }
00384
00385 void HSlider_draw(float x)
00386 {
00387 glLineWidth(1.0f);
00388 glColor3f(0.0,0.0,0.0);
00389
00390 glBegin(GL_LINES);
00391 glVertex3f(-0.5f, 0.0f, 0.0f);
00392 glVertex3f( 0.5f,0.0f, 0.0f);
00393
00394 glVertex3f( 0.5f,-0.1f, 0.0f);
00395 glVertex3f( 0.5f, 0.1f, 0.0f);
00396
00397 glVertex3f( 0.0f,-0.1f, 0.0f);
00398 glVertex3f( 0.0f, 0.1f, 0.0f);
00399
00400 glVertex3f(-0.5f,-0.1f, 0.0f);
00401 glVertex3f(-0.5f, 0.1f, 0.0f);
00402 glEnd();
00403
00404 glLineWidth(2.0f);
00405 glColor3f(1.0,0.0,0.0);
00406
00407
00408 glBegin(GL_LINES);
00409 glVertex3f( 0.5f*x,-0.1f, 0.0f);
00410 glVertex3f( 0.5f*x, 0.1f, 0.0f);
00411 glEnd();
00412 }
00413
00414
00415 void Girouette_draw(datas *d)
00416 {
00417 float rx,lx,y, a, arrow_angle, hypo, baume_angle;
00418 float ax, ay;
00419 float Vrbx, Vrby, normVb, normVrb, num, denom;
00420 float va[3], vb[3], vc[3];
00421 a=0.5236;
00422 y=-cos(a);
00423 rx=sin(a);
00424 lx=-rx;
00425 glLineWidth(1.0f);
00426 glNormal3f(0.0,0.0,1.0);
00427
00428 glColor3f(0.0, 0.0, 0.0);
00429
00430 glBegin(GL_LINES);
00431 glVertex3f(0.0f, 0.0f, 0.0f);
00432 glVertex3f(rx, y, 0.0f);
00433
00434 glVertex3f(0.0f, 0.0f, 0.0f);
00435 glVertex3f(lx, y, 0.0f);
00436 glEnd();
00437
00438
00439 glColor3f(0.85,0.05,0.05);
00440 glBegin(GL_QUADS);
00441 glVertex3f(rx+0.1f, y+0.1f, 0.0f);
00442 glVertex3f(rx-0.1f, y+0.1f, 0.0f);
00443 glVertex3f(rx-0.1f, y-0.1f, 0.0f);
00444 glVertex3f(rx+0.1f, y-0.1f, 0.0f);
00445
00446 glVertex3f(lx+0.1f, y+0.1f, 0.0f);
00447 glVertex3f(lx-0.1f, y+0.1f, 0.0f);
00448 glVertex3f(lx-0.1f, y-0.1f, 0.0f);
00449 glVertex3f(lx+0.1f, y-0.1f, 0.0f);
00450 glEnd();
00451
00452
00453 ax = - (d->Wind_x - d->dx);
00454 ay = - (d->Wind_y - d->dy);
00455 hypo = sqrt(ax*ax + ay*ay);
00456 if (hypo != 0.0)
00457 {
00458 Vrbx = d->Wind_x - d->dx;
00459 Vrby = d->Wind_y - d->dy;
00460 num = -d->dx*Vrbx - d->dy*Vrby;
00461 denom = sqrt(d->dx*d->dx + d->dy*d->dy)*sqrt(Vrbx*Vrbx + Vrby*Vrby);
00462 arrow_angle = 57.2958f*acos(num/denom);
00463 va[0]=Vrbx;
00464 va[1]=Vrby;
00465 va[2]=0.0f;
00466 vb[0]=-d->dx;
00467 vb[1]=-d->dy;
00468 vb[2]=0.0f;
00469 cross_product(va, vb, vc);
00470 if (vc[2]>0.0f) arrow_angle *= -1.0f;
00471 d->angle_girouette = arrow_angle/57.2958f;
00472
00473
00474
00475
00476
00477
00478
00479 glLineWidth(2.0f);
00480 glPushMatrix() ;
00481 glRotatef(arrow_angle, 0.0f, 0.0f, 1.0f);
00482 glBegin(GL_LINES);
00483 glVertex3f(0.0f, 0.0f, 0.0f);
00484 glVertex3f(0.0f, -0.8f, 0.0f);
00485
00486 glVertex3f(0.0f, -0.8f, 0.0f);
00487 glVertex3f(0.1f, -0.7f, 0.0f);
00488
00489 glVertex3f(0.0f, -0.8f, 0.0f);
00490 glVertex3f(-0.1f, -0.7f, 0.0f);
00491 glEnd();
00492 glPopMatrix() ;
00493
00494
00495 baume_angle = atan(d->tanAngle_sail);
00496 glColor3f(0.9,0.9,0.05);
00497 glBegin(GL_LINES);
00498 glVertex3f(0.0f, 0.0f, -0.001f);
00499
00500 glVertex3f(1.2f*sin(baume_angle), -1.2f*cos(baume_angle), -0.001f);
00501 glEnd();
00502 }
00503 }
00504
00505
00506
00507
00508 void Boat_draw()
00509 {
00510 SolidObject_draw(hull);
00511
00512 SolidObject_draw(rSwimm);
00513 SolidObject_draw(lSwimm);
00514
00515 SolidObject_draw(bridgeMain);
00516 SolidObject_draw(bridge2);
00517
00518 SolidObject_draw(mast);
00519
00520 SolidObject_draw(foilr);
00521 SolidObject_draw(foill);
00522
00523 SolidObject_draw(yaw);
00524
00525 SolidObject_draw(pitch);
00526 }
00527
00528 void Boat_delete()
00529 {
00530 SolidObject_delete(hull);
00531
00532 SolidObject_delete(rSwimm);
00533 SolidObject_delete(lSwimm);
00534
00535 SolidObject_delete(bridgeMain);
00536 SolidObject_delete(bridge2);
00537
00538 SolidObject_delete(mast);
00539
00540 SolidObject_delete(foilr);
00541 SolidObject_delete(foill);
00542
00543 SolidObject_delete(yaw);
00544
00545 SolidObject_delete(pitch);
00546 }
00547
00548
00549
00550
00551
00552 void Boat_create(datas *d)
00553 {
00554 int n,m,k,q;
00555 float temp1, temp2;
00556
00557 SolidObject_create(hull, 8, 9);
00558 SolidObject_create(rSwimm, 8, 9);
00559 SolidObject_create(lSwimm, 8, 9);
00560 SolidObject_create(bridgeMain, 4, 5);
00561 SolidObject_create(bridge2, 5, 5);
00562 SolidObject_create(mast, 2, 5);
00563 SolidObject_create(foilr, 2, 2);
00564 SolidObject_create(foill, 2, 2);
00565 SolidObject_create(yaw, 2, 2);
00566 SolidObject_create(pitch, 2, 2);
00567
00568
00569
00570
00571 for (k=0; k<9; k++) hull->X[0][k] = d->x_yaw-0.001;
00572
00573 hull->X[1][0]=d->x_yaw-0.001;
00574 hull->X[1][8]=d->x_yaw-0.001;
00575 hull->X[1][6]=d->x_yaw-0.001;
00576 hull->X[1][1]=d->x_yaw-0.15f-0.001;
00577 hull->X[1][5]=d->x_yaw-0.15f-0.001;
00578 hull->X[1][2]=d->x_yaw-0.25f-0.001;
00579 hull->X[1][4]=d->x_yaw-0.25f-0.001;
00580 hull->X[1][3]=d->x_yaw-0.3f-0.001;
00581 hull->X[1][7]=d->x_yaw-0.1f-0.001;
00582
00583 hull->X[2][0]=d->x_yaw;
00584 hull->X[2][8]=d->x_yaw;
00585 hull->X[2][6]=d->x_yaw;
00586 hull->X[2][1]=d->x_yaw-0.15f;
00587 hull->X[2][5]=d->x_yaw-0.15f;
00588 hull->X[2][2]=d->x_yaw-0.25f;
00589 hull->X[2][4]=d->x_yaw-0.25f;
00590 hull->X[2][3]=d->x_yaw-0.3f;
00591 hull->X[2][7]=d->x_yaw-0.1f;
00592
00593 for (k=0; k<9; k++) hull->X[3][k] = d->x_yaw+(d->Long/3.0);
00594 for (k=0; k<9; k++) hull->X[4][k] = d->x_yaw+2.0*(d->Long/4.0);
00595 for (k=0; k<9; k++) hull->X[5][k] = d->x_yaw+3.0*(d->Long/4.0);
00596 for (k=0; k<9; k++) hull->X[6][k] = d->x_yaw+4.0*(d->Long/4.0);
00597 for (k=0; k<9; k++) hull->X[7][k] = d->x_yaw+4.0*(d->Long/4.0)-0.01;
00598
00599
00600 for (k=0; k<9; k++) hull->Y[0][k] = d->y_yaw;
00601
00602 hull->Y[1][0] = d->y_yaw - 0.3f;
00603 hull->Y[1][8] = d->y_yaw - 0.3f;
00604 hull->Y[1][6] = d->y_yaw + 0.3f;
00605 hull->Y[1][1] = d->y_yaw - 0.3f;
00606 hull->Y[1][5] = d->y_yaw + 0.3f;
00607 hull->Y[1][2] = d->y_yaw - 0.2f;
00608 hull->Y[1][4] = d->y_yaw + 0.2f;
00609 hull->Y[1][3] = d->y_yaw;
00610 hull->Y[1][7] = d->y_yaw;
00611
00612 hull->Y[2][0] = d->y_yaw - 0.3f;
00613 hull->Y[2][8] = d->y_yaw - 0.3f;
00614 hull->Y[2][6] = d->y_yaw + 0.3f;
00615 hull->Y[2][1] = d->y_yaw - 0.3f;
00616 hull->Y[2][5] = d->y_yaw + 0.3f;
00617 hull->Y[2][2] = d->y_yaw - 0.2f;
00618 hull->Y[2][4] = d->y_yaw + 0.2f;
00619 hull->Y[2][3] = d->y_yaw;
00620 hull->Y[2][7] = d->y_yaw;
00621
00622 hull->Y[3][0] = d->y_yaw - 0.65f;
00623 hull->Y[3][8] = d->y_yaw - 0.65f;
00624 hull->Y[3][6] = d->y_yaw + 0.65f;
00625 hull->Y[3][1] = d->y_yaw - 0.65f;
00626 hull->Y[3][5] = d->y_yaw + 0.65f;
00627 hull->Y[3][2] = d->y_yaw - 0.4f;
00628 hull->Y[3][4] = d->y_yaw + 0.4f;
00629 hull->Y[3][3] = d->y_yaw;
00630 hull->Y[3][7] = d->y_yaw;
00631
00632 hull->Y[4][0] = d->y_yaw - 0.8f;
00633 hull->Y[4][8] = d->y_yaw - 0.8f;
00634 hull->Y[4][6] = d->y_yaw + 0.8f;
00635 hull->Y[4][1] = d->y_yaw - 0.8f;
00636 hull->Y[4][5] = d->y_yaw + 0.8f;
00637 hull->Y[4][2] = d->y_yaw - 0.6f;
00638 hull->Y[4][4] = d->y_yaw + 0.6f;
00639 hull->Y[4][3] = d->y_yaw;
00640 hull->Y[4][7] = d->y_yaw;
00641
00642 hull->Y[5][0] = d->y_yaw - 0.5f;
00643 hull->Y[5][8] = d->y_yaw - 0.5f;
00644 hull->Y[5][6] = d->y_yaw + 0.5f;
00645 hull->Y[5][1] = d->y_yaw - 0.5f;
00646 hull->Y[5][5] = d->y_yaw + 0.5f;
00647 hull->Y[5][2] = d->y_yaw - 0.3f;
00648 hull->Y[5][4] = d->y_yaw + 0.3f;
00649 hull->Y[5][3] = d->y_yaw;
00650 hull->Y[5][7] = d->y_yaw;
00651
00652 hull->Y[6][0] = d->y_yaw - 0.01f;
00653 hull->Y[6][8] = d->y_yaw - 0.01f;
00654 hull->Y[6][6] = d->y_yaw + 0.01f;
00655 hull->Y[6][1] = d->y_yaw - 0.01f;
00656 hull->Y[6][5] = d->y_yaw + 0.01f;
00657 hull->Y[6][2] = d->y_yaw - 0.005f;
00658 hull->Y[6][4] = d->y_yaw + 0.005f;
00659 hull->Y[6][3] = d->y_yaw;
00660 hull->Y[6][7] = d->y_yaw;
00661
00662 hull->Y[7][0] = d->y_yaw - 0.0f;
00663 hull->Y[7][8] = d->y_yaw - 0.0f;
00664 hull->Y[7][6] = d->y_yaw + 0.0f;
00665 hull->Y[7][1] = d->y_yaw - 0.0f;
00666 hull->Y[7][5] = d->y_yaw + 0.0f;
00667 hull->Y[7][2] = d->y_yaw - 0.0f;
00668 hull->Y[7][4] = d->y_yaw + 0.0f;
00669 hull->Y[7][3] = d->y_yaw;
00670 hull->Y[7][7] = d->y_yaw;
00671
00672
00673 for (k=0; k<9; k++) hull->Z[0][k] = d->z_foils;
00674
00675 hull->Z[1][7] = d->z_foils + 0.03f;
00676 hull->Z[1][0] = d->z_foils - 0.0f;
00677 hull->Z[1][8] = d->z_foils - 0.0f;
00678 hull->Z[1][6] = d->z_foils - 0.0f;
00679 hull->Z[1][1] = d->z_foils - 0.3f;
00680 hull->Z[1][5] = d->z_foils - 0.3f;
00681 hull->Z[1][2] = d->z_foils - 0.5f;
00682 hull->Z[1][4] = d->z_foils - 0.5f;
00683 hull->Z[1][3] = d->z_foils - 0.6f;
00684
00685 hull->Z[2][7] = d->z_foils + 0.03f;
00686 hull->Z[2][0] = d->z_foils - 0.0f;
00687 hull->Z[2][8] = d->z_foils - 0.0f;
00688 hull->Z[2][6] = d->z_foils - 0.0f;
00689 hull->Z[2][1] = d->z_foils - 0.3f;
00690 hull->Z[2][5] = d->z_foils - 0.3f;
00691 hull->Z[2][2] = d->z_foils - 0.5f;
00692 hull->Z[2][4] = d->z_foils - 0.5f;
00693 hull->Z[2][3] = d->z_foils - 0.6f;
00694
00695 hull->Z[3][7] = d->z_foils + 0.07f;
00696 hull->Z[3][0] = d->z_foils - 0.0f;
00697 hull->Z[3][8] = d->z_foils - 0.0f;
00698 hull->Z[3][6] = d->z_foils - 0.0f;
00699 hull->Z[3][1] = d->z_foils - 0.4f;
00700 hull->Z[3][5] = d->z_foils - 0.4f;
00701 hull->Z[3][2] = d->z_foils - 0.8f;
00702 hull->Z[3][4] = d->z_foils - 0.8f;
00703 hull->Z[3][3] = d->z_foils - 1.1f;
00704
00705 hull->Z[4][7] = d->z_foils + 0.1f;
00706 hull->Z[4][0] = d->z_foils - 0.0f;
00707 hull->Z[4][8] = d->z_foils - 0.0f;
00708 hull->Z[4][6] = d->z_foils - 0.0f;
00709 hull->Z[4][1] = d->z_foils - 0.4f;
00710 hull->Z[4][5] = d->z_foils - 0.4f;
00711 hull->Z[4][2] = d->z_foils - 0.9f;
00712 hull->Z[4][4] = d->z_foils - 0.9f;
00713 hull->Z[4][3] = d->z_foils - 1.2f;
00714
00715 hull->Z[5][7] = d->z_foils + 0.06f;
00716 hull->Z[5][0] = d->z_foils - 0.0f;
00717 hull->Z[5][8] = d->z_foils - 0.0f;
00718 hull->Z[5][6] = d->z_foils - 0.0f;
00719 hull->Z[5][1] = d->z_foils - 0.3f;
00720 hull->Z[5][5] = d->z_foils - 0.3f;
00721 hull->Z[5][2] = d->z_foils - 0.7f;
00722 hull->Z[5][4] = d->z_foils - 0.7f;
00723 hull->Z[5][3] = d->z_foils - 1.0f;
00724
00725 hull->Z[6][7] = d->z_foils + 0.0f;
00726 hull->Z[6][0] = d->z_foils - 0.0f;
00727 hull->Z[6][8] = d->z_foils - 0.0f;
00728 hull->Z[6][6] = d->z_foils - 0.0f;
00729 hull->Z[6][1] = d->z_foils - 0.2f;
00730 hull->Z[6][5] = d->z_foils - 0.2f;
00731 hull->Z[6][2] = d->z_foils - 0.35f;
00732 hull->Z[6][4] = d->z_foils - 0.35f;
00733 hull->Z[6][3] = d->z_foils - 0.5f;
00734
00735 hull->Z[7][7] = d->z_foils + 0.0f;
00736 hull->Z[7][0] = d->z_foils - 0.0f;
00737 hull->Z[7][8] = d->z_foils - 0.0f;
00738 hull->Z[7][6] = d->z_foils - 0.0f;
00739 hull->Z[7][1] = d->z_foils - 0.2f;
00740 hull->Z[7][5] = d->z_foils - 0.2f;
00741 hull->Z[7][2] = d->z_foils - 0.35f;
00742 hull->Z[7][4] = d->z_foils - 0.35f;
00743 hull->Z[7][3] = d->z_foils - 0.5f;
00744
00745 for (q=0; q<8; q++)
00746 {
00747 for(k=0; k<9; k++)
00748 {
00749 hull->R[q][k]=0.95;
00750 hull->G[q][k]=0.95;
00751 hull->B[q][k]=0.95;
00752 }
00753 }
00754
00756
00757
00758
00759 for (q=0; q<8; q++)
00760 {
00761 for(k=0; k<9; k++)
00762 {
00763 rSwimm->X[q][k] = hull->X[q][k];
00764 rSwimm->Y[q][k] = hull->Y[q][k] - d->y_yaw;
00765 rSwimm->Z[q][k] = hull->Z[q][k] - d->z_foils;
00766
00767 rSwimm->R[q][k] = hull->R[q][k];
00768 rSwimm->G[q][k] = hull->G[q][k];
00769 rSwimm->B[q][k] = hull->B[q][k];
00770
00771
00772 rSwimm->X[q][k] *=0.45;
00773 rSwimm->Y[q][k] *=0.45;
00774 rSwimm->Z[q][k] *=0.45;
00775
00776
00777 rSwimm->X[q][k] += d->x_foils -1.0;
00778 rSwimm->Y[q][k] += d->y_foil_right;
00779 rSwimm->Z[q][k] += d->z_foils;
00780 }
00781 }
00782
00783
00784 for (q=0; q<8; q++)
00785 {
00786 for(k=0; k<9; k++)
00787 {
00788 lSwimm->X[q][k] = hull->X[q][k];
00789 lSwimm->Y[q][k] = hull->Y[q][k] - d->y_yaw;
00790 lSwimm->Z[q][k] = hull->Z[q][k] - d->z_foils;
00791
00792 lSwimm->R[q][k] = hull->R[q][k];
00793 lSwimm->G[q][k] = hull->G[q][k];
00794 lSwimm->B[q][k] = hull->B[q][k];
00795
00796
00797 lSwimm->X[q][k] *=0.45;
00798 lSwimm->Y[q][k] *=0.45;
00799 lSwimm->Z[q][k] *=0.45;
00800
00801
00802 lSwimm->X[q][k] += d->x_foils -1.0;
00803 lSwimm->Y[q][k] += d->y_foil_left;
00804 lSwimm->Z[q][k] += d->z_foils;
00805 }
00806 }
00807
00808
00809
00810 for (q=0; q<8; q++)
00811 {
00812 for(k=0; k<9; k++)
00813 {
00814 hull->Z[q][k]*=1.5;
00815 }
00816 }
00817
00819
00820
00821 temp1 = 0.7;
00822 temp2 = 0.2;
00823
00824 for (k=0; k<4; k++)
00825 {
00826 bridgeMain->X[k][0] = d->x_foils + temp2 - temp1;
00827 bridgeMain->X[k][1] = d->x_foils + temp2 - temp1;
00828 bridgeMain->X[k][2] = d->x_foils - temp2 - temp1;
00829 bridgeMain->X[k][3] = d->x_foils - temp2 - temp1;
00830 bridgeMain->X[k][4] = d->x_foils + temp2 - temp1;
00831 }
00832
00833 for (q=0; q<5; q++)
00834 {
00835 bridgeMain->Y[0][q] = d->y_foil_left;
00836 bridgeMain->Y[1][q] = d->y_foil_left + 0.001*d->y_foil_right;
00837 bridgeMain->Y[2][q] = d->y_foil_right + 0.001*d->y_foil_left;
00838 bridgeMain->Y[3][q] = d->y_foil_right;
00839 }
00840
00841 for (k=0; k<4; k++)
00842 {
00843 bridgeMain->Z[k][0] = d->z_foils + temp2;
00844 bridgeMain->Z[k][1] = d->z_foils - temp2;
00845 bridgeMain->Z[k][2] = d->z_foils - temp2;
00846 bridgeMain->Z[k][3] = d->z_foils + temp2;
00847 bridgeMain->Z[k][4] = d->z_foils + temp2;
00848 }
00849
00850 for (q=0; q<4; q++)
00851 {
00852 for(k=0; k<5; k++)
00853 {
00854 bridgeMain->R[q][k] = hull->R[q][k];
00855 bridgeMain->G[q][k] = hull->G[q][k];
00856 bridgeMain->B[q][k] = hull->B[q][k];
00857 }
00858 }
00859
00860
00862
00863
00864 for (k=0; k<5;k++)
00865 {
00866 bridge2->X[k][0] = d->x_foils + temp2 - d->Chord_max + temp1;
00867 bridge2->X[k][1] = d->x_foils + temp2 - d->Chord_max + temp1;
00868 bridge2->X[k][2] = d->x_foils - temp2 - d->Chord_max + temp1;
00869 bridge2->X[k][3] = d->x_foils - temp2 - d->Chord_max + temp1;
00870 bridge2->X[k][4] = d->x_foils + temp2 - d->Chord_max + temp1;
00871 }
00872
00873 for (k=0; k<5;k++)
00874 {
00875 bridge2->X[2][k] -= 1.5;
00876 }
00877
00878
00879 for (q=0; q<5; q++)
00880 {
00881 bridge2->Y[0][q] = d->y_foil_left;
00882 bridge2->Y[1][q] = d->y_foil_left + 0.001*d->y_foil_right;
00883 bridge2->Y[2][q] = 0.5*(d->y_foil_right+d->y_foil_left);
00884 bridge2->Y[3][q] = d->y_foil_right + 0.001*d->y_foil_left;
00885 bridge2->Y[4][q] = d->y_foil_right;
00886 }
00887
00888
00889 for (q=0; q<5; q++)
00890 {
00891 bridge2->Z[q][0] = d->z_foils + temp2;
00892 bridge2->Z[q][1] = d->z_foils - temp2;
00893 bridge2->Z[q][2] = d->z_foils - temp2;
00894 bridge2->Z[q][3] = d->z_foils + temp2;
00895 bridge2->Z[q][4] = d->z_foils + temp2;
00896 }
00897
00898
00899 for (q=0; q<5; q++)
00900 {
00901 for(k=0; k<5; k++)
00902 {
00903 bridge2->R[q][k] = hull->R[q][k];
00904 bridge2->G[q][k] = hull->G[q][k];
00905 bridge2->B[q][k] = hull->B[q][k];
00906 }
00907 }
00908
00910
00911 for (k=0; k<2; k++)
00912 {
00913 mast->X[k][0] = d->x_sail - 0.18;
00914 mast->X[k][1] = d->x_sail + 0.18;
00915 mast->X[k][2] = d->x_sail + 0.18;
00916 mast->X[k][3] = d->x_sail - 0.18;
00917 mast->X[k][4] = d->x_sail - 0.18;
00918
00919 mast->Y[k][0] = d->y_sail - 0.18;
00920 mast->Y[k][1] = d->y_sail - 0.18;
00921 mast->Y[k][2] = d->y_sail + 0.18;
00922 mast->Y[k][3] = d->y_sail + 0.18;
00923 mast->Y[k][4] = d->y_sail - 0.18;
00924
00925 mast->nX[k][0] = - sqrt(2.0);
00926 mast->nX[k][1] = + sqrt(2.0);
00927 mast->nX[k][2] = + sqrt(2.0);
00928 mast->nX[k][3] = - sqrt(2.0);
00929 mast->nX[k][4] = - sqrt(2.0);
00930
00931 mast->nY[k][0] = - sqrt(2.0);
00932 mast->nY[k][1] = - sqrt(2.0);
00933 mast->nY[k][2] = + sqrt(2.0);
00934 mast->nY[k][3] = + sqrt(2.0);
00935 mast->nY[k][4] = - sqrt(2.0);
00936 }
00937 for (k=0; k<5; k++)
00938 {
00939 mast->Z[0][k] = d->z_foils+d->L_mast;
00940 mast->Z[1][k] = d->z_foils;
00941
00942 for (q=0; q<2; q++)
00943 {
00944 mast->nZ[q][k] = 0.0;
00945
00946 mast->R[q][k] = 0.85;
00947 mast->G[q][k] = 0.85;
00948 mast->B[q][k] = 0.95;
00949 }
00950 }
00951
00952
00954
00955
00956 foilr->X[0][0] = d->x_foils-d->Chord_min;
00957 foilr->X[0][1] = d->x_foils;
00958 foilr->X[1][0] = d->x_foils-d->Chord_max;
00959 foilr->X[1][1] = d->x_foils;
00960
00961 foilr->Y[0][0] = d->y_foil_right+cos(d->alpha_right)*d->E_foils;
00962 foilr->Y[0][1] = d->y_foil_right+cos(d->alpha_right)*d->E_foils;
00963 foilr->Y[1][0] = d->y_foil_right;
00964 foilr->Y[1][1] = d->y_foil_right;
00965
00966 foilr->Z[0][0] = d->z_foils-sin(d->alpha_right)*d->E_foils;
00967 foilr->Z[0][1] = d->z_foils-sin(d->alpha_right)*d->E_foils;
00968 foilr->Z[1][0] = d->z_foils;
00969 foilr->Z[1][1] = d->z_foils;
00970
00971 for (k=0; k<2; k++)
00972 {
00973 for (q=0; q<2; q++)
00974 {
00975 foilr->nX[k][q] = 0.0;
00976 foilr->nY[k][q] = sin(d->alpha_right);
00977 foilr->nZ[k][q] = cos(d->alpha_right);
00978
00979 foilr->R[k][q] = hull->R[0][0];
00980 foilr->G[k][q] = hull->G[0][0];
00981 foilr->B[k][q] = hull->B[0][0];
00982 }
00983 }
00984
00985
00986
00987 foill->X[1][0] = d->x_foils-d->Chord_min;
00988 foill->X[1][1] = d->x_foils;
00989 foill->X[0][0] = d->x_foils-d->Chord_max;
00990 foill->X[0][1] = d->x_foils;
00991
00992 foill->Y[1][0] = d->y_foil_left-cos(d->alpha_left)*d->E_foils;
00993 foill->Y[1][1] = d->y_foil_left-cos(d->alpha_left)*d->E_foils;
00994 foill->Y[0][0] = d->y_foil_left;
00995 foill->Y[0][1] = d->y_foil_left;
00996
00997 foill->Z[1][0] = d->z_foils-sin(d->alpha_left)*d->E_foils;
00998 foill->Z[1][1] = d->z_foils-sin(d->alpha_left)*d->E_foils;
00999 foill->Z[0][0] = d->z_foils;
01000 foill->Z[0][1] = d->z_foils;
01001
01002 for (k=0; k<2; k++)
01003 {
01004 for (q=0; q<2; q++)
01005 {
01006 foill->nX[k][q] = 0.0;
01007 foill->nY[k][q] = -sin(d->alpha_right);
01008 foill->nZ[k][q] = cos(d->alpha_right);
01009
01010 foill->R[k][q] = hull->R[0][0];
01011 foill->G[k][q] = hull->G[0][0];
01012 foill->B[k][q] = hull->B[0][0];
01013 }
01014 }
01015
01016
01018
01019 for (q=0; q<2; q++)
01020 {
01021 yaw->X[0][q] = d->x_yaw;
01022 yaw->X[1][q] = d->x_yaw+d->Chord_yaw;
01023
01024 yaw->Z[q][0] = d->z_foils;
01025 yaw->Z[q][1] = d->z_yaw-d->E_yaw;
01026
01027 for (k=0; k<2; k++)
01028 {
01029 yaw->Y[k][q] = d->y_yaw;
01030
01031 yaw->nX[k][q] = 0.0;
01032 yaw->nY[k][q] = 1.0;
01033 yaw->nZ[k][q] = 0.0;
01034
01035 yaw->R[k][q] = hull->R[0][0];
01036 yaw->G[k][q] = hull->G[0][0];
01037 yaw->B[k][q] = hull->B[0][0];
01038 }
01039 }
01040
01041
01043
01044 for (q=0; q<2; q++)
01045 {
01046 pitch->X[q][0] = d->x_pitch;
01047 pitch->X[q][1] = d->x_pitch+d->Chord_pitch;
01048
01049 pitch->Y[0][q] = d->y_pitch+0.5*d->Env_pitch;
01050 pitch->Y[1][q] = d->y_pitch-0.5*d->Env_pitch;
01051
01052 for (k=0; k<2; k++)
01053 {
01054 pitch->Z[k][q] = d->z_pitch;
01055
01056 pitch->nX[k][q] = 0.0;
01057 pitch->nY[k][q] = 0.0;
01058 pitch->nZ[k][q] = 1.0;
01059
01060 pitch->R[k][q] = hull->R[0][0];
01061 pitch->G[k][q] = hull->G[0][0];
01062 pitch->B[k][q] = hull->B[0][0];
01063 }
01064 }
01065
01066
01067 SolidObject_compute_normals(hull);
01068 SolidObject_compute_normals(rSwimm);
01069 SolidObject_compute_normals(lSwimm);
01070 SolidObject_compute_normals(bridgeMain);
01071 SolidObject_compute_normals(bridge2);
01072
01073 for (k=0;k<8;k++)
01074 {
01075 hull->nX[k][0] = hull->nX[k][6];
01076 hull->nX[k][8] = hull->nX[k][6];
01077 hull->nY[k][0] =-hull->nY[k][6];
01078 hull->nY[k][8] =-hull->nY[k][6];
01079 hull->nZ[k][0] = hull->nZ[k][6];
01080 hull->nZ[k][8] = hull->nZ[k][6];
01081
01082 rSwimm->nX[k][0] = rSwimm->nX[k][6];
01083 rSwimm->nX[k][8] = rSwimm->nX[k][6];
01084 rSwimm->nY[k][0] =-rSwimm->nY[k][6];
01085 rSwimm->nY[k][8] =-rSwimm->nY[k][6];
01086 rSwimm->nZ[k][0] = rSwimm->nZ[k][6];
01087 rSwimm->nZ[k][8] = rSwimm->nZ[k][6];
01088
01089 lSwimm->nX[k][0] = lSwimm->nX[k][6];
01090 lSwimm->nX[k][8] = lSwimm->nX[k][6];
01091 lSwimm->nY[k][0] =-lSwimm->nY[k][6];
01092 lSwimm->nY[k][8] =-lSwimm->nY[k][6];
01093 lSwimm->nZ[k][0] = lSwimm->nZ[k][6];
01094 lSwimm->nZ[k][8] = lSwimm->nZ[k][6];
01095 }
01096
01097
01098 }
01099
01100