RayTracing
|
00001 /* NAME: Kirill Vasil'evich Timofeev, 322 00002 * ASGN: N1 00003 */ 00004 00005 #include <QtGui> 00006 00007 #include "mainwindow.h" 00008 00009 MainWindow::MainWindow() 00010 { 00011 window = new QWidget; 00012 Hey = 192; 00013 Wid = 256; 00014 AntiAl = false; 00015 labelIm = new QLabel; 00016 image = new QPixmap(Wid, Hey); 00017 curImage = new QImage(Wid, Hey, QImage::Format_ARGB32); 00018 CamPos = Vector3D((float)0, (float)0, (float)-1.5); 00019 00020 00021 makeFigures(); 00022 makeLights(); 00023 00024 Paint(); 00025 00026 statusBar()->showMessage(tr("Rayed"), 2000); 00027 mainLayout = new QVBoxLayout; 00028 mainLayout->setSizeConstraint(QLayout::SetMinimumSize); 00029 labelIm->setPixmap(*image); 00030 mainLayout->addWidget(labelIm); 00031 window->setLayout(mainLayout); 00032 setCentralWidget(window); 00033 00034 createActions(); 00035 createMenus(); 00036 createStatusBar(); 00037 00038 setUnifiedTitleAndToolBarOnMac(true); 00039 } 00040 00041 MainWindow::~MainWindow() 00042 { 00043 00044 delete image; 00045 delete curImage; 00046 delete labelIm; 00047 delete mainLayout; 00048 delete window; 00049 00050 00051 } 00052 00053 00054 void MainWindow::SerializeInXml() 00055 { 00056 XMLS Serial; 00057 00058 QMessageBox msgBox; 00059 msgBox.setWindowTitle("Message"); 00060 msgBox.setText("Input file name for writing in XML format in"); 00061 msgBox.exec(); 00062 00063 if (Serializing(&Serial)) 00064 statusBar()->showMessage(tr("Serialized in XML")); 00065 else 00066 statusBar()->showMessage(tr("Error")); 00067 00068 } 00069 00070 void MainWindow::SerializeInBin() 00071 { 00072 BinS Serial; 00073 00074 QMessageBox msgBox; 00075 msgBox.setWindowTitle("Message"); 00076 msgBox.setText("Input file name for writing in Binary format in"); 00077 msgBox.exec(); 00078 00079 if (Serializing(&Serial)) 00080 statusBar()->showMessage(tr("Serialized in Bin")); 00081 else 00082 statusBar()->showMessage(tr("Error")); 00083 00084 } 00085 00086 void MainWindow::LoadFromXml() 00087 { 00088 XMLL Serial; 00089 00090 QMessageBox msgBox; 00091 msgBox.setWindowTitle("Message"); 00092 msgBox.setText("Input file name for reading in XML format from"); 00093 msgBox.exec(); 00094 00095 if (Serializing(&Serial)) 00096 { 00097 statusBar()->showMessage(tr("Loaded from Xml")); 00098 delete image; 00099 delete curImage; 00100 image = new QPixmap(Wid, Hey); 00101 curImage = new QImage(Wid, Hey, QImage::Format_ARGB32); 00102 labelIm->setPixmap(*image); 00103 Paint(); 00104 repaint(); // обновление изображения 00105 statusBar()->showMessage(tr("RayTraced")); 00106 } 00107 else 00108 statusBar()->showMessage(tr("Error")); 00109 00110 } 00111 00112 void MainWindow::LoadFromBin() 00113 { 00114 BinL Serial; 00115 00116 QMessageBox msgBox; 00117 msgBox.setWindowTitle("Message"); 00118 msgBox.setText("Input file name for reading in Binary format from"); 00119 msgBox.exec(); 00120 if (Serializing(&Serial)) 00121 { 00122 statusBar()->showMessage(tr("Loaded from Bin")); 00123 delete image; 00124 delete curImage; 00125 image = new QPixmap(Wid, Hey); 00126 curImage = new QImage(Wid, Hey, QImage::Format_ARGB32); 00127 labelIm->setPixmap(*image); 00128 Paint(); 00129 repaint(); // обновление изображения 00130 statusBar()->showMessage(tr("RayTraced")); 00131 } 00132 else 00133 statusBar()->showMessage(tr("Error")); 00134 00135 } 00136 00137 bool MainWindow::Serializing(Serializer *Serial) 00138 { 00139 AntiAl = false; 00140 00141 QString newStr; 00142 do 00143 { 00144 newStr = QFileDialog::getOpenFileName(this); 00145 } 00146 while (newStr.isEmpty()); 00147 00148 bool b = Serial->Start(newStr); 00149 if (b) 00150 { 00151 Serial->SerPic(Wid, Hey); 00152 Serial->SerCam(CamPos); 00153 Serial->SerSph(Sphere1,"Sphere1"); 00154 Serial->SerSph(Sphere2,"Sphere2"); 00155 Serial->SerThor(Thor1,"Thor1"); 00156 Serial->SerThor(Thor2,"Thor2"); 00157 Serial->SerThor(Thor3,"Thor3"); 00158 Serial->SerLight(Light1,"Light1"); 00159 Serial->SerLight(Light2,"Light2"); 00160 00161 Serial->End(); 00162 } 00163 00164 return b; 00165 00166 } 00167 00168 void MainWindow::exit() 00169 { 00170 QMessageBox msgBox; 00171 msgBox.setWindowTitle("Exit"); 00172 msgBox.setText("Thank you for using my Program)) Goodbye!!"); 00173 msgBox.exec(); 00174 close(); 00175 } 00176 00177 void MainWindow::createActions() 00178 { 00179 00180 XMLLAct = new QAction(tr("&XML"), this); 00181 //XMLLAct->setShortcuts(Qt::CTRL + Qt::Key_L + Qt::Key_X); 00182 XMLLAct->setStatusTip(tr("Load attributes from XML format")); 00183 connect(XMLLAct, SIGNAL(triggered()), this, SLOT(LoadFromXml())); 00184 00185 BinLAct = new QAction(tr("&Bin"), this); 00186 //BinLAct->setShortcuts(Qt::CTRL + Qt::Key_L + Qt::Key_B); 00187 BinLAct->setStatusTip(tr("Load attributes from Binary format")); 00188 connect(BinLAct, SIGNAL(triggered()), this, SLOT(LoadFromBin())); 00189 00190 exitAct = new QAction(tr("E&xit"), this); 00191 exitAct->setShortcuts(QKeySequence::Quit); 00192 exitAct->setStatusTip(tr("Exit RayTracing")); 00193 connect(exitAct, SIGNAL(triggered()), this, SLOT(exit())); 00194 00195 XMLSAct = new QAction(tr("&XML"), this); 00196 //XMLSAct->setShortcuts(Qt::CTRL + Qt::Key_S + Qt::Key_X); 00197 XMLSAct->setStatusTip(tr("Save attributes in XML format")); 00198 connect(XMLSAct, SIGNAL(triggered()), this, SLOT(SerializeInXml())); 00199 00200 BinSAct = new QAction(tr("&Bin"), this); 00201 //BinSAct->setShortcuts(Qt::CTRL + Qt::Key_S + Qt::Key_B); 00202 BinSAct->setStatusTip(tr("Save attributes in Binary format")); 00203 connect(BinSAct, SIGNAL(triggered()), this, SLOT(SerializeInBin())); 00204 00205 } 00206 00207 00208 void MainWindow::createMenus() 00209 { 00210 00211 fileMenu = menuBar()->addMenu(tr("&File")); 00212 fileMenu->addAction(exitAct); 00213 menuBar()->addSeparator(); 00214 00215 fileMenu = menuBar()->addMenu(tr("&Load")); 00216 fileMenu->addAction(XMLLAct); 00217 fileMenu->addAction(BinLAct); 00218 menuBar()->addSeparator(); 00219 00220 fileMenu = menuBar()->addMenu(tr("&Save")); 00221 fileMenu->addAction(XMLSAct); 00222 fileMenu->addAction(BinSAct); 00223 menuBar()->addSeparator(); 00224 00225 } 00226 00227 void MainWindow::createStatusBar() 00228 { 00229 statusBar()->showMessage(tr("Ready")); 00230 } 00231 00232 void MainWindow::makeFigures() 00233 { 00234 00235 Material1.SetRef(Vector3D(1.0f, 1.0f, 1.0f)); 00236 Material1.SetCol(Vector3D(0.9f, 0.0f, 0.0f)); 00237 Material2.SetSpe(Vector3D(0.0f, 0.0f, 0.0f)); 00238 00239 Material2.SetRef(Vector3D(0.3f, 0.3f, 0.3f)); 00240 Material2.SetCol(Vector3D(0.0f, 0.2f, 0.7f)); 00241 Material2.SetSpe(Vector3D(0.0f, 0.0f, 0.0f)); 00242 00243 Material3.SetRef(Vector3D(1.0f, 1.0f, 1.0f)); 00244 Material3.SetCol(Vector3D(0.0f, 1.0f, 0.0f)); 00245 Material3.SetSpe(Vector3D(0.0f, 0.9f, 0.0f)); 00246 00247 00248 00249 Sphere1.SetPos(Vector3D(3,0,3)); 00250 Sphere1.SetRad(1.0f); 00251 Sphere1.SetMater(Material1); 00252 00253 Sphere2.SetPos(Vector3D(0,0,3)); 00254 Sphere2.SetRad(2.0f); 00255 Sphere2.SetMater(Material2); 00256 00257 00258 Thor1.SetPosCen(Vector3D(-2,1, 1)); 00259 Thor1.SetRad(1.0f); 00260 Thor1.SetWid(0.4f); 00261 Thor1.SetMater(Material3); 00262 00263 Thor2.SetPosCen(Vector3D(4,2, 3)); 00264 Thor2.SetRad(0.8f); 00265 Thor2.SetWid(0.2f); 00266 Thor2.SetMater(Material2); 00267 00268 Thor3.SetPosCen(Vector3D(4,-2, 3)); 00269 Thor3.SetRad(0.4f); 00270 Thor3.SetWid(0.1f); 00271 Thor3.SetMater(Material1); 00272 00273 00274 } 00275 00276 void MainWindow::makeLights() 00277 { 00278 00279 00280 Light1.SetPos(Vector3D(4,0,2)); 00281 Light1.SetColor(Vector3D(0.1f, 0.4f, 0.9f)); 00282 Light1.SetConst(0.0f); 00283 Light1.SetLinear(0.05f); 00284 Light1.SetQuadric(0.05f); 00285 00286 Light2.SetPos(Vector3D(-4,0,2)); 00287 Light2.SetColor(Vector3D(0.9f, 0.4f, 0.1f)); 00288 Light2.SetConst(0.0f); 00289 Light2.SetLinear(0.1f); 00290 Light2.SetQuadric(0.05f); 00291 00292 } 00293 00294 00295 void MainWindow::keyPressEvent(QKeyEvent* pe) 00296 { 00297 switch (pe->key()) 00298 { 00299 00300 case Qt::Key_Q: 00301 AntiAliasing(); // AA 00302 AntiAl = TRUE; 00303 return; 00304 case Qt::Key_Z: 00305 CamPos.Z -= 0.1; // приблизить сцену 00306 break; 00307 00308 case Qt::Key_X: 00309 CamPos.Z += 0.1;// удалиться от сцены 00310 break; 00311 00312 case Qt::Key_S: 00313 CamPos.Y += 0.1; // транслировать сцену вниз 00314 break; 00315 00316 case Qt::Key_W: 00317 CamPos.Y -= 0.1; // транслировать сцену вверх 00318 break; 00319 00320 case Qt::Key_A: 00321 CamPos.X -= 0.1; // транслировать сцену влево 00322 break; 00323 00324 case Qt::Key_D: 00325 CamPos.X += 0.1; // транслировать сцену вправо 00326 break; 00327 00328 case Qt::Key_Escape: // клавиша "эскейп" 00329 this->close(); // завершает приложение 00330 break; 00331 } 00332 00333 Paint(); 00334 AntiAl = false; 00335 repaint(); // обновление изображения 00336 statusBar()->showMessage(tr("Made"), 2000); 00337 00338 } 00339 00340 void MainWindow::wheelEvent(QWheelEvent* pe) 00341 { 00342 if ((pe->delta())>0) CamPos.Z -= 0.1; else if ((pe->delta())<0) CamPos.Z += 0.1; 00343 00344 Paint(); 00345 AntiAl = false; 00346 repaint(); // обновление изображения 00347 statusBar()->showMessage(tr("Zoomed"), 2000); 00348 } 00349 00350 void MainWindow::mousePressEvent(QMouseEvent* pe) // нажатие клавиши мыши 00351 { 00352 ptrMousePosition = pe->pos(); 00353 00354 } 00355 00356 // изменение положения стрелки мыши 00357 void MainWindow::mouseMoveEvent(QMouseEvent* pe) 00358 { 00359 // поворот 00360 CamPos.Y += (float)(pe->y()-ptrMousePosition.y())/3 /Hey; 00361 CamPos.X += (float)(pe->x()-ptrMousePosition.x())/3 /Wid; 00362 00363 } 00364 00365 void MainWindow::mouseReleaseEvent (QMouseEvent * pe) 00366 { 00367 00368 if (ptrMousePosition != pe->pos()) 00369 { 00370 Paint(); 00371 AntiAl = false; 00372 repaint(); // обновление изображения 00373 statusBar()->showMessage(tr("Translated"), 2000); 00374 } 00375 ptrMousePosition = pe->pos(); 00376 00377 } 00378 00379 float MainWindow::countMinDist(Vector3D temp, int *numObj, bool b1, bool b2, bool b3, bool b4, bool b5) 00380 { 00381 float len, t12 = 1000000, t22 = 1000000, t32 = 1000000, t42 = 1000000, t52 = 1000000; 00382 00383 if (b1) t12 = (Sphere1.GetPos() - temp).Length() - Sphere1.GetRad(); 00384 00385 if (b2) t22 = (Sphere2.GetPos() - temp).Length() - Sphere2.GetRad(); 00386 00387 if (b3) 00388 { 00389 len = sqrt((temp.X - Thor1.GetPosCen().X) * (temp.X - Thor1.GetPosCen().X) 00390 + (temp.Y - Thor1.GetPosCen().Y) * (temp.Y - Thor1.GetPosCen().Y)); 00391 len -= Thor1.GetRad(); 00392 t32 = sqrt(len * len + (temp.Z - Thor1.GetPosCen().Z) * (temp.Z - Thor1.GetPosCen().Z)) - Thor1.GetWid(); 00393 } 00394 00395 if (b4) 00396 { 00397 len = sqrt((temp.X - Thor2.GetPosCen().X) * (temp.X - Thor2.GetPosCen().X) 00398 + (temp.Y - Thor2.GetPosCen().Y) * (temp.Y - Thor2.GetPosCen().Y)); 00399 len -= Thor2.GetRad(); 00400 t42 = sqrt(sqrt(sqrt(pow(len, 8) + pow(temp.Z - Thor2.GetPosCen().Z, 8)))) - Thor2.GetWid(); 00401 } 00402 00403 if (b5) 00404 { 00405 len = sqrt(sqrt(sqrt( pow((temp.X - Thor3.GetPosCen().X), 8) 00406 + pow((temp.Y - Thor3.GetPosCen().Y) , 8)))); 00407 len -= Thor3.GetRad(); 00408 t52 = sqrt(sqrt(sqrt(pow(len, 8) + pow((temp.Z - Thor3.GetPosCen().Z), 8)))) - Thor3.GetWid(); 00409 } 00410 00411 len = t12; 00412 *numObj = 1; 00413 if (len > t22) 00414 { 00415 len = t22; 00416 *numObj = 2; 00417 } 00418 if (len > t32) 00419 { 00420 len = t32; 00421 *numObj = 3; 00422 } 00423 if (len > t42) 00424 { 00425 len = t42; 00426 *numObj = 4; 00427 } 00428 if (len > t52) 00429 { 00430 len = t52; 00431 *numObj = 5; 00432 } 00433 00434 return len; 00435 } 00436 00437 Vector3D MainWindow::countLites(Vector3D Dist, Vector3D Color, Vector3D SpeColor, Light Light0) 00438 { 00439 float t , p; 00440 Vector3D Col(Color); 00441 //do 00442 //{ 00443 //minDist1 = countMinDist(temp1, &numObj, true, true, true, true, true); 00444 //temp1 += (- Light0.GetPos() + Dist).NormVect() * minDist1; 00445 //minDist2 = countMinDist(temp2, &numObj, true, true, true, true, true); 00446 //temp2 += (-Light0.GetPos() - Dist).NormVect() * minDist2; 00447 //} 00448 //while ((minDist1 >= ((float)1/ Wid)) || (minDist2 >= ((float)1/ Wid))); 00449 //if (minDist1 >= minDist2) temp = temp2; 00450 //else temp = temp1; 00451 00452 t = ( Dist - Light0.GetPos()).Length(); 00453 p = (float)1 / (Light0.GetConst() + t * Light0.GetLinear() + t * t * Light0.GetQuadric()); 00454 Col.X *= p * Light0.GetColor().X * (1 + SpeColor.X); 00455 Col.Y *= p * Light0.GetColor().Y * (1 + SpeColor.Y); 00456 Col.Z *= p * Light0.GetColor().Z * (1 + SpeColor.Z); 00457 if (Col.X > 255) 00458 { 00459 Col.X = 255; 00460 } 00461 if (Col.Y > 255) 00462 { 00463 Col.Y = 255; 00464 } 00465 if (Col.Z > 255) 00466 { 00467 Col.Z = 255; 00468 } 00469 00470 return Col; 00471 } 00472 00473 void MainWindow::Paint() 00474 { 00475 RGBCol = new Vector3D*[Wid]; 00476 for (int i = 0; i < Wid; i++) 00477 RGBCol[i] = new Vector3D[Hey]; 00478 00479 float W1 = (float)1 / Wid; 00480 for(int i = 0;i < Wid; i++) 00481 for(int j = 0;j < Hey; j++) 00482 { 00483 float len; 00484 Vector3D PixOnScreen((float)(i - Wid / 2) / Wid * 4,(float)(j - Hey / 2) / Hey * 3, 0); 00485 Vector3D RayCol(1.0f, 1.0f, 1.0f); 00486 Ray Rayij(PixOnScreen, CamPos); 00487 Vector3D temp0(Rayij.GetDir()); 00488 temp0 = temp0 * ((float)W1 * 4); 00489 Vector3D temp(CamPos); 00490 bool b1 =true, b2=true, b3 =true, b4=true, b5 =true; 00491 int cola = 0; 00492 do 00493 { 00494 int numObj; 00495 00496 len = countMinDist(temp, &numObj, b1, b2, b3, b4, b5); 00497 temp += Rayij.GetDir() * len; 00498 00499 if (len <= W1) 00500 { 00501 cola++; 00502 Vector3D Colour , Col, SpeCol, Dist; 00503 Dist = temp - CamPos + PixOnScreen; 00504 00505 switch (numObj) 00506 { 00507 case 1: 00508 { 00509 Col.X = Sphere1.GetMater().GetCol().X * RayCol.X * 255; 00510 Col.Y = Sphere1.GetMater().GetCol().Y * RayCol.Y * 255; 00511 Col.Z = Sphere1.GetMater().GetCol().Z * RayCol.Z * 255; 00512 SpeCol = Sphere1.GetMater().GetSpe(); 00513 break; 00514 } 00515 00516 00517 case 2: 00518 { 00519 Col.X = Sphere2.GetMater().GetCol().X * RayCol.X * 255; 00520 Col.Y = Sphere2.GetMater().GetCol().Y * RayCol.Y * 255; 00521 Col.Z = Sphere2.GetMater().GetCol().Z * RayCol.Z * 255; 00522 SpeCol = Sphere2.GetMater().GetSpe(); 00523 break; 00524 } 00525 00526 00527 case 3: 00528 { 00529 Col.X = Thor1.GetMater().GetCol().X * RayCol.X * 255; 00530 Col.Y = Thor1.GetMater().GetCol().Y * RayCol.Y * 255; 00531 Col.Z = Thor1.GetMater().GetCol().Z * RayCol.Z * 255; 00532 SpeCol = Thor1.GetMater().GetSpe(); 00533 break; 00534 } 00535 00536 00537 00538 case 4: 00539 { 00540 Col.X = Thor2.GetMater().GetCol().X * RayCol.X * 255; 00541 Col.Y = Thor2.GetMater().GetCol().Y * RayCol.Y * 255; 00542 Col.Z = Thor2.GetMater().GetCol().Z * RayCol.Z * 255; 00543 SpeCol = Thor2.GetMater().GetSpe(); 00544 break; 00545 } 00546 00547 00548 00549 case 5: 00550 { 00551 Col.X = Thor3.GetMater().GetCol().X * RayCol.X * 255; 00552 Col.Y = Thor3.GetMater().GetCol().Y * RayCol.Y * 255; 00553 Col.Z = Thor3.GetMater().GetCol().Z * RayCol.Z * 255; 00554 SpeCol = Thor3.GetMater().GetSpe(); 00555 break; 00556 } 00557 00558 00559 } 00560 00561 Colour += countLites(Dist, Col, SpeCol, Light1); 00562 Colour += countLites(Dist, Col, SpeCol, Light2); 00563 if (Colour.X > 255) Colour.X = 255; 00564 if (Colour.Y > 255) Colour.Y = 255; 00565 if (Colour.Z > 255) Colour.Z = 255; 00566 RGBCol[i][j] += Colour; 00567 switch (numObj) 00568 { 00569 case 1: 00570 { 00571 RayCol = Vector3D((1.0f - Sphere1.GetMater().GetRef().X) * RayCol.X, 00572 (1.0f - Sphere1.GetMater().GetRef().Y )* RayCol.Y, 00573 (1.0f - Sphere1.GetMater().GetRef().Z )* RayCol.Z); 00574 b1 =false; 00575 break; 00576 } 00577 00578 00579 case 2: 00580 { 00581 RayCol = Vector3D((1.0f - Sphere2.GetMater().GetRef().X) * RayCol.X, 00582 (1.0f - Sphere2.GetMater().GetRef().Y )* RayCol.Y, 00583 (1.0f - Sphere2.GetMater().GetRef().Z )* RayCol.Z); 00584 b2 =false; 00585 break; 00586 } 00587 00588 00589 case 3: 00590 { 00591 RayCol = Vector3D((1.0f - Thor1.GetMater().GetRef().X) * RayCol.X, 00592 (1.0f - Thor1.GetMater().GetRef().Y )* RayCol.Y, 00593 (1.0f - Thor1.GetMater().GetRef().Z )* RayCol.Z); 00594 b3 =false; 00595 break; 00596 } 00597 00598 00599 case 4: 00600 { 00601 RayCol = Vector3D((1.0f - Thor2.GetMater().GetRef().X) * RayCol.X, 00602 (1.0f - Thor2.GetMater().GetRef().Y )* RayCol.Y, 00603 (1.0f - Thor2.GetMater().GetRef().Z )* RayCol.Z); 00604 b4 =false; 00605 break; 00606 } 00607 00608 00609 00610 case 5: 00611 { 00612 RayCol = Vector3D((1.0f - Thor3.GetMater().GetRef().X) * RayCol.X, 00613 (1.0f - Thor3.GetMater().GetRef().Y )* RayCol.Y, 00614 (1.0f - Thor3.GetMater().GetRef().Z )* RayCol.Z); 00615 b5 =false; 00616 break; 00617 } 00618 } 00619 00620 00621 } 00622 } 00623 while ((temp.Length() < 30) && ((RayCol.X != 0) || (RayCol.Y != 0) || (RayCol.Z != 0)) && (cola < 5)); 00624 00625 } 00626 00627 00628 00629 for(int i = 0;i < Wid; i++) 00630 for(int j = 0;j < Hey; j++) 00631 { 00632 if (RGBCol [i][j].X > 255) RGBCol [i][j].X = 255; 00633 if (RGBCol [i][j].Y > 255) RGBCol [i][j].Y = 255; 00634 if (RGBCol [i][j].Z > 255) RGBCol [i][j].Z = 255; 00635 curImage->setPixel(i, j, qRgb( RGBCol[i][j].X,RGBCol[i][j].Y, RGBCol[i][j].Z)); 00636 } 00637 image->convertFromImage(*curImage); 00638 00639 for (int i = 0; i < Wid; i++) 00640 delete[] RGBCol[i]; 00641 delete[] RGBCol; 00642 00643 } 00644 00645 void MainWindow::AntiAliasing()//сепарабельное размытие 00646 { 00647 if (!AntiAl) 00648 { 00649 double sigma = 1.0; 00650 int N = 1 + (float)(3 * sigma), i; 00651 double tem; 00652 double wind[(2 * N) + 1]; 00653 QImage *Temp = new QImage(curImage->width(),curImage->height(),QImage::Format_RGB32); 00654 for (i = (2 * N); i >= 0; i--) 00655 { 00656 if (i >= N) 00657 { 00658 tem = (float)(N - i) * (i - N) / (2 * sigma * sigma); 00659 if (tem >= 0) 00660 wind[i]= exp(tem); 00661 else 00662 wind[i]= 1 / exp(-tem); 00663 } 00664 else wind[i] = wind[2 * N - i] ; 00665 } 00666 wash(Temp, curImage->height(), curImage->width(), N, wind, true); 00667 wash(Temp, curImage->width(), curImage->height(), N, wind , false); 00668 image->convertFromImage(*curImage); 00669 delete Temp; 00670 statusBar()->showMessage(tr("AntiAliasing Made"), 2000); 00671 repaint(); 00672 } 00673 00674 } 00675 00676 void MainWindow::wash(QImage *Temp,int koef1, int koef2, int N, double* wind, bool a)//размытие 00677 { 00678 int i , j , k; 00679 double red, green, blue; 00680 double sum; 00681 for (i = 0; i < koef1; i++) 00682 for (j = 0; j < koef2; j++) 00683 { 00684 sum = 0; 00685 red = 0; 00686 green = 0; 00687 blue = 0; 00688 for (k = (-N) ; k <= N ; k++) 00689 if (( (j + k) >= 0) && ( (j + k) < koef2)) 00690 { 00691 if (a) 00692 { 00693 red += qRed(curImage->pixel(j + k, i)) * wind [k + N] ; 00694 green += qGreen(curImage->pixel(j + k, i)) * wind [k + N] ; 00695 blue += qBlue(curImage->pixel(j + k, i)) * wind [k + N] ; 00696 } 00697 else 00698 { 00699 red += qRed(curImage->pixel(i, j + k)) * wind [k + N] ; 00700 green += qGreen(curImage->pixel(i, j + k)) * wind [k + N] ; 00701 blue += qBlue(curImage->pixel(i, j + k)) * wind [k + N] ; 00702 } 00703 } 00704 for (k = (-N) ; k <= N ; k++) if (( (j + k) >= 0) && ( (j + k) < koef2)) 00705 sum += wind[k + N]; 00706 if (a) 00707 Temp->setPixel(j , i , qRgb(red / sum, green / sum, blue / sum)); 00708 else 00709 Temp->setPixel(i , j , qRgb(red / sum, green / sum, blue / sum)); 00710 } 00711 *curImage = *Temp; 00712 } 00713