Guest User

Untitled

a guest
May 20th, 2013
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.26 KB | None | 0 0
  1. bool MainWindow::counterLine(QPoint *tri, float Z, QPointF blockSize, QLineF &line)
  2. {
  3.     int cnt = 0;
  4.  
  5.     for (int i = 0; i < 3; i++)
  6.     {
  7.         int j = i + 1;  if (j == 3) j = 0;
  8.         float z1 = matrix[tri[i].y()][tri[i].x()],
  9.               z2 = matrix[tri[j].y()][tri[j].x()];
  10.  
  11.         float x1 = tri[i].x() * blockSize.x(), y1 = tri[i].y() * blockSize.y(),
  12.               x2 = tri[j].x() * blockSize.x(), y2 = tri[j].y() * blockSize.y();
  13.  
  14.         if (std::min(z1, z2) <= Z && Z <= std::max(z1, z2) && fabs(Z - z2) > 1e-5)
  15.         {
  16.             cnt++;
  17.             float k = (z1 - Z) / (Z - z2);
  18.             float X = (x1 + k * x2) / (1 + k),
  19.                   Y = (y1 + k * y2) / (1 + k);
  20.             if (cnt == 1) line.setP1(QPointF(X, Y));
  21.             else          line.setP2(QPointF(X, Y));
  22.         }
  23.     }
  24.  
  25.     if (cnt != 2)
  26.         return false;
  27.     return true;
  28. }
  29.  
  30. /*
  31. tri - точки(индексы в матрице : i == y, j == x) треугольника, в котором нужно провести изолинию
  32. Z - значение z у изолинии
  33. line - результат(отрезок по которому будет рисоваться изолиния)
  34. matrix - значения z из нашей таблицы
  35. */
Advertisement
Add Comment
Please, Sign In to add comment