Main Page Alphabetical List Compound List File List Compound Members Related Pages

# MDIFirstHit.cpp

    00001 //---------------------------------------------------------------------------
    00002
    00003 #include <vcl.h>
    00004 #pragma hdrstop
    00005
    00006 #include "MDIFirstHit.h"
    00007 #include "MDIEdit.h"
    00008 #include "MDIFrame.h"
    00009 #include <math.h>
    00010 #include <fastmath.h>
    00011
    00012 //---------------------------------------------------------------------------
    00013 #pragma package(smart_init)
    00014 #pragma resource "*.dfm"
    00015
    00016 #define MIN(x,y)        ((x<y) ? (x) : (y))
    00017 #define MAX(x,y)        ((x>y) ? (x) : (y))
    00018 rgb *firstview;
    00019 TFirstHitForm *FirstHitForm;
    00020
    00021 const float pi=3.141592;
    00022 const float pi2=2*pi;
    00023 const float pih=pi/2;
    00024 const float pirad=pi/180;
    00025
    00026 bool mdown;
    00027
    00028 //---------------------------------------------------------------------------
    00029 __fastcall TFirstHitForm::TFirstHitForm(TComponent* Owner)
    00030         : TForm(Owner)
    00031 {
    00032 }
    00033 //---------------------------------------------------------------------------
    00034 void __fastcall TFirstHitForm::SetPixelFormatDescriptor()
    00035 {
    00036     PIXELFORMATDESCRIPTOR pfd = {
    00037         sizeof(PIXELFORMATDESCRIPTOR),
    00038         1,
    00039         PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
    00040         PFD_TYPE_RGBA,
    00041         24,
    00042         0,0,0,0,0,0,
    00043         0,0,
    00044         0,0,0,0,0,
    00045         32,
    00046         0,
    00047         0,
    00048         PFD_MAIN_PLANE,
    00049         0,
    00050         0,0,0
    00051     };
    00052
    00053     PixelFormat = ChoosePixelFormat(hdc, &pfd);
    00054     SetPixelFormat(hdc, PixelFormat, &pfd);
    00055 }
    00056
    00057 //---------------------------------------------------------------------
    00058 void __fastcall TFirstHitForm::FormClose(TObject *Sender, TCloseAction &Action)
    00059 {
    00060 delete [] firstview;
    00061 Action=caFree;
    00062 FrameForm->FirstHit->Checked = false;
    00063 memusage = memusage - 3*1024*1024;
    00064 FrameForm->memupdate();
    00065 wglDeleteContext(hrc);
    00066 ReleaseDC(Handle,hdc);
    00067 }
    00068 //---------------------------------------------------------------------
    00069 void __fastcall TFirstHitForm::FormCreate(TObject *Sender)
    00070 {
    00071     int i,a;
    00072
    00073     firstview = new rgb[1024*1024];
    00074     memusage = memusage + 3*1024*1024;
    00075     FrameForm->memupdate();
    00076
    00077     mrotx=0; mroty=0;xres=256;yres=256;thresh = 400;
    00078     hdc = GetDC(Handle);
    00079     SetPixelFormatDescriptor();
    00080     hrc = wglCreateContext(hdc);
    00081     if(hrc == NULL) ShowMessage("Could not create DC!");
    00082     wglMakeCurrent(hdc, hrc);
    00083
    00084     w = ClientWidth;
    00085     h = ClientHeight;
    00086
    00087     glEnable(GL_DEPTH_TEST);
    00088     glEnable(GL_CULL_FACE);
    00089
    00090     glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
    00091     glOrtho (-50.0,50.0,-50.0,50.0,-50.0,50.0);
    00092
    00093     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    00094     glFlush();
    00095     SwapBuffers(hdc);
    00096     FormResize(Sender);
    00097     RayCast();
    00098 }
    00099 //---------------------------------------------------------------------
    00100 void __fastcall TFirstHitForm::FormResize(TObject *Sender)
    00101 {
    00102         tPanel->Height = ClientHeight-34;
    00103         TrackBar->Height = ClientHeight-36;
    00104         PrepareGLWindow();
    00105         if (autores->Checked) {RayCast();}
    00106         PaintGL();
    00107 }
    00108 //---------------------------------------------------------------------------
    00109 void __fastcall TFirstHitForm::FormPaint(TObject *Sender)
    00110 {
    00111         PaintGL();
    00112 }
    00113 //---------------------------------------------------------------------------
    00114 void __fastcall TFirstHitForm::PaintGL()
    00115 {
    00116         float i;
    00117
    00118         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    00119         PrepareGLWindow();
    00120         glColor3f(0.6f,0.6f,0.6f);
    00121         glLineWidth(3.0f);
    00122         glBegin(GL_LINE_STRIP);
    00123         glVertex3f(-50,-50,0);
    00124         glVertex3f(50,-50,0);
    00125         glVertex3f(50,50,0);
    00126         glVertex3f(-50,50,0);
    00127         glVertex3f(-50,-50,0);
    00128         glEnd();
    00129
    00130         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    00131         glDrawPixels(xres, yres, GL_RGB, GL_UNSIGNED_BYTE,firstview);
    00132                         // we use unsigned byte (char) to meet speed issues.
    00133                         // 16 bit data (__int16) slows down drawing to much.
    00134
    00135         glFlush();
    00136         SwapBuffers(hdc);
    00137 }
    00138
    00139 void __fastcall TFirstHitForm::PrepareGLWindow()
    00140 {
    00141         wglMakeCurrent(hdc, hrc);
    00142
    00143         GLfloat nRange = 50.0;
    00144         w = ClientWidth-200;
    00145         h = ClientHeight;
    00146
    00147         if(h == 0) h = 1;
    00148         if(w == 0) w = 1;
    00149
    00150         glViewport(200, 0, w, h);
    00151         glLoadIdentity();
    00152
    00153         if (w <= h)
    00154         {        glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
    00155                 glPixelZoom((float)w/(float)xres, (float)w/(float)yres);}
    00156          else
    00157         {        glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);
    00158                 glPixelZoom((float)h/(float)xres, (float)h/(float)yres);}
    00159
    00160         glRasterPos2d(-50,-50);
    00161 }
    00162 //---------------------------------------------------------------------------
    00163
    00164
    00165 void __fastcall TFirstHitForm::FormActivate(TObject *Sender)
    00166 {
    00167         PaintGL();
    00168 }
    00169 //---------------------------------------------------------------------------
    00170
    00171 void __fastcall TFirstHitForm::RayCast()
    00172 {
    00173         int a,i,j,k,maxres;
    00174         __int16 value;
    00175         int aktpos, rowsize,pagesize, px, py, pz;
    00176         int h,ita, ite, detval, detincval;
    00177         float t,ta,te,tx,ty,tz,xrcos,yrcos,zrcos,xrsin,yrsin,zrsin,xrot,yrot,zrot;
    00178         float valgx,valgy,valgz,value1,value2,value3, value4, value11, value22,pfx,pfy,pfz,sx,sy,sz,s1x,s1y;
    00179         float temp;
    00180         bool detset;
    00181         double valsh, ac, ac2;
    00182         float lx, ly, lz;
    00183         unsigned char col;
    00184
    00185         detval=DetTrackBar->Position-1;
    00186         vertex pppos;
    00187         vertex dlookup[1024];
    00188         if (autores->Checked)
    00189         { if (w>h) {xres=h;yres=h;} else {xres=w;yres=w;} }
    00190         else
    00191         {
    00192         xres = StrToInt(textx->Caption);
    00193         yres = StrToInt(texty->Caption);
    00194         }
    00195         xrot = (float)StrToFloat(txrot->Text)*pirad;
    00196 //        yrot = (float)StrToFloat(tyrot->Text)*pirad;
    00197         zrot = (float)StrToFloat(tzrot->Text)*pirad;
    00198
    00199         xrcos = _fm_cos(xrot);
    00200 //        yrcos = _fm_cos(yrot);
    00201         zrcos = _fm_cos(zrot);
    00202         xrsin = _fm_sin(xrot);
    00203 //        yrsin = _fm_sin(yrot);
    00204         zrsin = _fm_sin(zrot);
    00205
    00206         FrameForm->StatusProgress->Position = 0;
    00207         FrameForm->StatusProgress->Visible = true;
    00208         maxres = MAX(MAX(sizeX,sizeY),sizeZ);
    00209
    00210
    00211         lx =0; ly=1; lz=0;
    00212
    00213         temp = ly;
    00214         ly = temp*xrcos - lz * xrsin;
    00215         lz = temp*xrsin + lz * xrcos;
    00216
    00217         temp = lx;
    00218         lx = temp*zrcos - ly * zrsin;
    00219         ly = temp*zrsin + ly * zrcos;
    00220
    00221
    00222         dx.x = (float)maxres/(float)xres;
    00223         dx.y = 0;
    00224         dx.z = 0;
    00225
    00226         temp = dx.y;
    00227
    00228         dx.x = dx.x;
    00229         dx.y = temp * xrcos - dx.z*xrsin;
    00230         dx.z = temp * xrsin + dx.z*xrcos;
    00231
    00232         temp = dx.x;
    00233
    00234         dx.x = temp * zrcos - dx.y * zrsin;
    00235         dx.y = temp * zrsin + dx.y * zrcos;
    00236         dx.z = dx.z;
    00237
    00238         dy.x = 0;
    00239         dy.y = 0;
    00240         dy.z = (float)maxres/(float)yres;
    00241
    00242         temp = dy.y;
    00243
    00244         dy.x = dy.x;
    00245         dy.y = temp * xrcos - dy.z*xrsin;
    00246         dy.z = temp * xrsin + dy.z*xrcos;
    00247
    00248         temp = dy.x;
    00249
    00250         dy.x = temp * zrcos - dy.y * zrsin;
    00251         dy.y = temp * zrsin + dy.y * zrcos;
    00252         dy.z = dy.z;
    00253
    00254
    00255         dz.x = 0;
    00256         dz.y = 1;
    00257         dz.z = 0;
    00258
    00259         temp = dz.y;
    00260
    00261         dz.x = dz.x;
    00262         dz.y = temp * xrcos - dz.z*xrsin;
    00263         dz.z = temp * xrsin + dz.z*xrcos;
    00264
    00265         temp = dz.x;
    00266
    00267         dz.x = temp * zrcos - dz.y * zrsin;
    00268         dz.y = temp * zrsin + dz.y * zrcos;
    00269         dz.z = dz.z;
    00270
    00271         o.x = -(maxres/2);
    00272         o.y = -(sizeY/2);
    00273         o.z = -(maxres/2);
    00274
    00275         temp = o.y;
    00276
    00277         o.x = o.x;
    00278         o.y = temp * xrcos - o.z*xrsin;
    00279         o.z = temp * xrsin + o.z*xrcos;
    00280
    00281         temp = o.x;
    00282
    00283         o.x = temp * zrcos - o.y * zrsin;
    00284         o.y = temp * zrsin + o.y * zrcos;
    00285         o.z = o.z;
    00286
    00287         o.x = o.x + sizeX/2;
    00288         o.y = o.y + sizeY/2;
    00289         o.z = o.z + sizeZ/2;
    00290
    00291         pagesize = sizeX*sizeY;
    00292         rowsize = sizeX;
    00293
    00294         for (i=0; i<1024; i++)
    00295         {
    00296         dlookup[i].x = (i-512) * dz.x;        //Lookup-Values für RayCast berechnen
    00297         dlookup[i].y = (i-512) * dz.y;
    00298         dlookup[i].z = (i-512) * dz.z;
    00299         }
    00300
    00301         k = 0;
    00302         for (a=0; a<yres; a++)
    00303         {
    00304                 pppos.x = o.x + a * dy.x;
    00305                 pppos.y = o.y + a * dy.y;
    00306                 pppos.z = o.z + a * dy.z;
    00307
    00308                 if (arepaint->Checked == false) {FrameForm->StatusProgress->Position = (int)(100 * ((float)a / (float)yres));}
    00309                 for (i=0; i<xres; i++)
    00310                 {
    00311                         ppos.x = pppos.x + i * dx.x;     // Rotierten Startpunkt für parametrisierte
    00312                         ppos.y = pppos.y + i * dx.y;     // Gerade berechnen ...
    00313                         ppos.z = pppos.z + i * dx.z;
    00314
    00315                         ta = 9999;
    00316                         te = 9999;
    00317
    00318                         if (dz.x!=0)
    00319                         {
    00320                           t = -ppos.x/dz.x;                      // Schneide Ray mit x=0
    00321                           ty = ppos.y + t*dz.y;
    00322                           tz = ppos.z + t*dz.z;
    00323                           if (ty>=0 && tz>=2 && ty<sizeY-1 && tz<sizeZ-3) { if (ta==9999) ta=t; else te=t; }
    00324
    00325                           t = (sizeX-1-ppos.x)/dz.x;               // Schneide Ray mit x=sizeX
    00326                           ty = ppos.y + t*dz.y;
    00327                           tz = ppos.z + t*dz.z;
    00328                           if (ty>=0 && tz>=2 && ty<sizeY-1 && tz<sizeZ-3) { if (ta==9999) ta=t; else te=t; }
    00329                         }
    00330
    00331                         if (dz.y!=0)
    00332                         {
    00333                           t = -ppos.y/dz.y;                      // Schneide Ray mit y=0
    00334                           tx = ppos.x + t*dz.x;
    00335                           tz = ppos.z + t*dz.z;
    00336                           if (tx>=0 && tz>=2 && tx<sizeX-1 && tz<sizeZ-3) { if (ta==9999) ta=t; else te=t; }
    00337
    00338                           t = (sizeY-1-ppos.y)/dz.y;               // Schneide Ray mit y=sizeY
    00339                           tx = ppos.x + t*dz.x;
    00340                           tz = ppos.z + t*dz.z;
    00341                           if (tx>=0 && tz>=2 && tx<sizeX-1 && tz<sizeZ-3) { if (ta==9999) ta=t; else te=t; }
    00342                         }
    00343
    00344                         if (dz.z!=0)
    00345                         {
    00346                           t = (2-ppos.z)/dz.z;                      // Schneide Ray mit z=0
    00347                           tx = ppos.x + t*dz.x;
    00348                           ty = ppos.y + t*dz.y;
    00349                           if (tx>=0 && ty>=0 && tx<sizeX-1 && ty<sizeY-1) { if (ta==9999) ta=t; else te=t; }
    00350
    00351                           t = (sizeZ-3-ppos.z)/dz.z;               // Schneide Ray mit z=sizeZ
    00352                           tx = ppos.x + t*dz.x;
    00353                           ty = ppos.y + t*dz.y;
    00354                           if (tx>=0 && ty>=0 && tx<sizeX-1 && ty<sizeY-1) { if (ta==9999) ta=t; else te=t; }
    00355                         }
    00356
    00357                         if (ta>te) {t=ta; ta=te; te=t;}
    00358
    00359                         detset=0;
    00360
    00361                         if (te==9999)
    00362                         {
    00363                         firstview[k].r=firstview[k].b=firstview[k].g = 0;
    00364                         }
    00365                         else
    00366                         {
    00367                         value = 0; ita = (int)ta+512; ite = (int)te+512-detval;
    00368                         for (j=ita; j<ite && value<thresh; j++)
    00369                         { if (detset==0) j += detval;
    00370 /*
    00371                           pfx = (ppos.x) + j * dz.x;
    00372                           pfy = (ppos.y) + j * dz.y;
    00373                           pfz = (ppos.z) + j * dz.z;
    00374 */
    00375 label1:                   pfx = (ppos.x) + dlookup[j].x;
    00376                           pfy = (ppos.y) + dlookup[j].y;
    00377                           pfz = (ppos.z) + dlookup[j].z;
    00378
    00379                           px = (int)pfx;
    00380                           py = (int)pfy;
    00381                           pz = (int)pfz;
    00382                           aktpos = pagesize*pz + rowsize*py + px;
    00383                           if (trilinear->Checked)
    00384                           {
    00385                                 sx = pfx-px;
    00386                                 sy = pfy-py;
    00387                                 sz = pfz-pz;
    00388                                 s1x = 1-sx;
    00389                                 s1y = 1-sy;
    00390                                 value1 = (float)data[aktpos]*s1x                  + (float)data[aktpos+1]*sx;
    00391                                 value2 = (float)data[aktpos+rowsize]*s1x          + (float)data[aktpos+rowsize+1]*sx;
    00392                                 value3 = (float)data[aktpos+pagesize+rowsize]*s1x + (float)data[aktpos+pagesize+rowsize+1]*sx;
    00393                                 value4 = (float)data[aktpos+pagesize]*s1x         + (float)data[aktpos+pagesize+1]*sx;
    00394                                 value11 = value1*(s1y) + value2*(sy);
    00395                                 value22 = value4*(s1y) + value3*(sy);
    00396                                 value = (int)(value11*(1-sz) + value22*(sz));
    00397                           }
    00398                           else
    00399                           {
    00400                                 value = data[pagesize*pz + rowsize*py + px];
    00401                           }
    00402
    00403                           if (value>= thresh)
    00404
    00405                           {     if (adapt->Checked) { if (detset==0 && detval>0) {detset=1;j -= detval; goto label1;}}
    00406                                 if (trilinear2->Checked)
    00407                                 {
    00408                                 sx = pfx-px;
    00409                                 sy = pfy-py;
    00410                                 sz = pfz-pz;
    00411                                 s1x = 1-sx;
    00412
    00413                                 value1 = (float)gradient[aktpos].y*s1x                  + (float)gradient[aktpos+1].y*sx;
    00414                                 value2 = (float)gradient[aktpos+rowsize].y*s1x          + (float)gradient[aktpos+rowsize+1].y*sx;
    00415                                 value3 = (float)gradient[aktpos+pagesize+rowsize].y*s1x + (float)gradient[aktpos+pagesize+rowsize+1].y*sx;
    00416                                 value4 = (float)gradient[aktpos+pagesize].y*s1x         + (float)gradient[aktpos+pagesize+1].y*sx;
    00417                                 value11 = value1*(1-sy) + value2*(sy);
    00418                                 value22 = value4*(1-sy) + value3*(sy);
    00419                                 valgy=((value11*(1-sz) + value22*(sz)));
    00420
    00421                                 value1 = (float)gradient[aktpos].x*s1x                  + (float)gradient[aktpos+1].x*sx;
    00422                                 value2 = (float)gradient[aktpos+rowsize].x*s1x          + (float)gradient[aktpos+rowsize+1].x*sx;
    00423                                 value3 = (float)gradient[aktpos+pagesize+rowsize].x*s1x + (float)gradient[aktpos+pagesize+rowsize+1].x*sx;
    00424                                 value4 = (float)gradient[aktpos+pagesize].x*s1x         + (float)gradient[aktpos+pagesize+1].x*sx;
    00425                                 value11 = value1*(1-sy) + value2*(sy);
    00426                                 value22 = value4*(1-sy) + value3*(sy);
    00427                                 valgx=((value11*(1-sz) + value22*(sz)));
    00428
    00429                                 value1 = (float)gradient[aktpos].z*s1x                  + (float)gradient[aktpos+1].z*sx;
    00430                                 value2 = (float)gradient[aktpos+rowsize].z*s1x          + (float)gradient[aktpos+rowsize+1].z*sx;
    00431                                 value3 = (float)gradient[aktpos+pagesize+rowsize].z*s1x + (float)gradient[aktpos+pagesize+rowsize+1].z*sx;
    00432                                 value4 = (float)gradient[aktpos+pagesize].z*s1x         + (float)gradient[aktpos+pagesize+1].z*sx;
    00433                                 value11 = value1*(1-sy) + value2*(sy);
    00434                                 value22 = value4*(1-sy) + value3*(sy);
    00435                                 valgz=((value11*(1-sz) + value22*(sz)));
    00436
    00437                                 valsh = fabs(valgx*lx+valgy*ly+valgz*lz);
    00438                                 if (valsh<0) {valsh=0.0;}
    00439                                 //if (valsh>1) {valsh=1.0;}
    00440                                 ac = (_fm_acosl(valsh));
    00441                                 if (ac<0) {ac=0;}
    00442                                 if (ac>pih) {ac=pih;}
    00443                                 ac = 1-(ac/pih);
    00444                                 //ac = valsh;
    00445                                 //ac = fabs(valsh);
    00446                                 //ac2 = 1-(_fm_acosl(valsh)/pih);
    00447                                 //if (ac2<0) {ac2=0;}
    00448
    00449                                 if (highlights->Checked) {
    00450                                 valsh = valsh*valsh;
    00451                                 valsh = valsh*valsh;
    00452                                 valsh = valsh*valsh;
    00453                                 valsh = valsh*valsh;
    00454                                 valsh = valsh*valsh;
    00455                                 valsh = valsh*valsh;
    00456                                 ac2 = valsh + ac;
    00457                                 h = (int)255*ac2;
    00458                                 if (h>255) {col=255;} else {col = h;}
    00459                                 }
    00460                                 else {col = (int)255*ac;}
    00461
    00462
    00463
    00464                                 /*ac=_fm_acosl(valsh);
    00465                                 ac2=_fm_acosl(valsh);
    00466
    00467                                 if (ac<0) {ac=0;}
    00468                                 if (ac>pih) {ac=pih;}
    00469                                 if (ac2<0) {ac2=0;}
    00470                                 if (ac2>pih) {ac2=pih;}
    00471
    00472                                 ac = pih-ac;
    00473                                 ac2 = pih-ac2;
    00474                                 */
    00475
    00476
    00477
    00478                                 //if (highlights->Checked) {if (col+40*ac2>255) {col=255;} else {col=col+40*ac2;}}
    00479
    00480
    00481 /*                                if (ac>(pih))
    00482                                 {
    00483                                         firstview[k].r=firstview[k].b=firstview[k].g = 0;
    00484                                 }
    00485                                 else
    00486                                 {*/
    00487                                         firstview[k].r=firstview[k].b=firstview[k].g = (col);
    00488 //                                }
    00489                                 }
    00490                                 else
    00491                                 {
    00492                                 valsh = fabs(gradient[pagesize*pz + rowsize*py + px].x*lx+gradient[pagesize*pz + rowsize*py + px].y*ly+gradient[pagesize*pz + rowsize*py + px].z*lz);
    00493                                 //if (valsh<0) {valsh=0.0;}
    00494                                 //if (valsh>1) {valsh=1.0;}
    00495                                 ac=_fm_acos(valsh);
    00496                                 if (ac<0) {ac=0;}
    00497                                 if (ac>pih) {ac=pih;}
    00498                                 ac = 1-(ac/pih);
    00499
    00500                                 if (highlights->Checked) {
    00501                                 valsh = valsh*valsh;
    00502                                 valsh = valsh*valsh;
    00503                                 valsh = valsh*valsh;
    00504                                 valsh = valsh*valsh;
    00505                                 valsh = valsh*valsh;
    00506                                 valsh = valsh*valsh;
    00507                                 ac2 = valsh + ac;
    00508                                 h = (int)255*ac2;
    00509                                 if (h>255) {col=255;} else {col = h;}
    00510                                 }
    00511                                 else {col = (int)255*ac;}
    00512
    00513
    00514 /*                                if (ac>(pih))
    00515                                 {
    00516                                         firstview[k].r=firstview[k].b=firstview[k].g = 0;
    00517                                 }
    00518                                 else
    00519                                 {
    00520 */                                        firstview[k].r=firstview[k].b=firstview[k].g = col;
    00521 //                                }
    00522
    00523                                 }
    00524                           }
    00525                           else {firstview[k].r=firstview[k].b=firstview[k].g=20;
    00526                                 firstview[k].b=30;}
    00527                         }
    00528                         }
    00529
    00530                 k++;
    00531                 }
    00532         }
    00533         FrameForm->StatusProgress->Visible = false;
    00534 }
    00535
    00536 void __fastcall TFirstHitForm::TrackBarChange(TObject *Sender)
    00537 {
    00538 threshhold->Caption = IntToStr(TrackBar->Position);
    00539 thresh = TrackBar->Position;
    00540 if (arepaint->Checked) {RayCast(); PaintGL(); }
    00541 }
    00542 //---------------------------------------------------------------------------
    00543
    00544 void __fastcall TFirstHitForm::FormMouseDown(TObject *Sender,
    00545       TMouseButton Button, TShiftState Shift, int X, int Y)
    00546 {
    00547 mdown=true;
    00548 ox = X;
    00549 oy = Y;
    00550 }
    00551 //---------------------------------------------------------------------------
    00552
    00553
    00554
    00555 void __fastcall TFirstHitForm::FormMouseUp(TObject *Sender,
    00556       TMouseButton Button, TShiftState Shift, int X, int Y)
    00557 {
    00558 mdown=false;
    00559 RayCast();
    00560 PaintGL();
    00561 }
    00562 //---------------------------------------------------------------------------
    00563
    00564 void __fastcall TFirstHitForm::FormMouseMove(TObject *Sender,
    00565       TShiftState Shift, int X, int Y)
    00566 {
    00567 if (mdown)
    00568 {
    00569 mrotx -= (Y-oy);
    00570 mroty -= (X-ox);
    00571 if (mrotx<0) mrotx += 360;
    00572 if (mrotx>360) mrotx -= 360;
    00573 if (mroty<0) mroty += 360;
    00574 if (mroty>360) mroty -= 360;
    00575
    00576 if (arepaint->Checked) {RayCast(); PaintGL(); }
    00577 txrot->Text = IntToStr(mrotx);
    00578 tzrot->Text = IntToStr(mroty);
    00579 ox = X;
    00580 oy = Y;
    00581 }
    00582 }
    00583 //---------------------------------------------------------------------------
    00584
    00585 void __fastcall TFirstHitForm::autoresClick(TObject *Sender)
    00586 {
    00587 if (autores->Checked==true)
    00588         {
    00589         ResTrackBar->Enabled=false;
    00590         textx->Enabled=false;
    00591         Label2->Enabled=false;
    00592         texty->Enabled=false;
    00593         }
    00594         else
    00595         {
    00596         ResTrackBar->Enabled=true;
    00597         textx->Enabled=true;
    00598         Label2->Enabled=true;
    00599         texty->Enabled=true;
    00600         }
    00601 if (arepaint->Checked) {RayCast();PaintGL();}
    00602
    00603 }
    00604 //---------------------------------------------------------------------------
    00605
    00606 void __fastcall TFirstHitForm::adaptClick(TObject *Sender)
    00607 {
    00608 if (arepaint->Checked) {RayCast();PaintGL();}
    00609 }
    00610 //---------------------------------------------------------------------------
    00611
    00612 void __fastcall TFirstHitForm::ResTrackBarChange(TObject *Sender)
    00613 {
    00614 switch (ResTrackBar->Position)
    00615         {
    00616         case 1: textx->Caption = "32"; texty->Caption = "32"; break;
    00617         case 2: textx->Caption = "64"; texty->Caption = "64"; break;
    00618         case 3: textx->Caption = "128"; texty->Caption = "128"; break;
    00619         case 4: textx->Caption = "256"; texty->Caption = "256"; break;
    00620         case 5: textx->Caption = "512"; texty->Caption = "512"; break;
    00621         case 6: textx->Caption = "1024"; texty->Caption = "1024";
    00622         }
    00623 if (arepaint->Checked) {RayCast();PaintGL();}
    00624 }
    00625 //---------------------------------------------------------------------------
    00626
    00627 void __fastcall TFirstHitForm::DetTrackBarChange(TObject *Sender)
    00628 {
    00629 detail->Caption = IntToStr(DetTrackBar->Position);
    00630 if (arepaint->Checked) {RayCast();PaintGL();}
    00631 }
    00632 //---------------------------------------------------------------------------
    00633
    00634 void __fastcall TFirstHitForm::trilinearClick(TObject *Sender)
    00635 {
    00636 if (arepaint->Checked) {RayCast();PaintGL();}
    00637
    00638 }
    00639 //---------------------------------------------------------------------------
    00640
    00641 void __fastcall TFirstHitForm::trilinear2Click(TObject *Sender)
    00642 {
    00643 if (arepaint->Checked) {RayCast();PaintGL();}
    00644
    00645 }
    00646 //---------------------------------------------------------------------------
    00647
    00648
    00649
    00650