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
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();
00297 glTranslatef(d->x_sail,d->y_sail,d->z_foils+d->L_mast);
00298 glRotatef(-57.2958*d->psi,0.0f,0.0f,1.0f);
00299 glRotatef(-57.2958*d->theta,0.0f,1.0f,0.0f);
00300 glRotatef(-57.2958*d->phi,1.0f,0.0f,0.0f);
00301 glBegin(GL_LINES);
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();
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
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
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
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
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)
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;
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
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
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
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
00461
00462
00463
00464
00465
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
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
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
00744
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
00758 rSwimm->X[q][k] *=0.45;
00759 rSwimm->Y[q][k] *=0.45;
00760 rSwimm->Z[q][k] *=0.45;
00761
00762
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
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
00783 lSwimm->X[q][k] *=0.45;
00784 lSwimm->Y[q][k] *=0.45;
00785 lSwimm->Z[q][k] *=0.45;
00786
00787
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
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
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
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
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
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
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
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
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++)
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
01083
01084 }
01085
01086