Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool MainWindow::counterLine(QPoint *tri, float Z, QPointF blockSize, QLineF &line)
- {
- int cnt = 0;
- for (int i = 0; i < 3; i++)
- {
- int j = i + 1; if (j == 3) j = 0;
- float z1 = matrix[tri[i].y()][tri[i].x()],
- z2 = matrix[tri[j].y()][tri[j].x()];
- float x1 = tri[i].x() * blockSize.x(), y1 = tri[i].y() * blockSize.y(),
- x2 = tri[j].x() * blockSize.x(), y2 = tri[j].y() * blockSize.y();
- if (std::min(z1, z2) <= Z && Z <= std::max(z1, z2) && fabs(Z - z2) > 1e-5)
- {
- cnt++;
- float k = (z1 - Z) / (Z - z2);
- float X = (x1 + k * x2) / (1 + k),
- Y = (y1 + k * y2) / (1 + k);
- if (cnt == 1) line.setP1(QPointF(X, Y));
- else line.setP2(QPointF(X, Y));
- }
- }
- if (cnt != 2)
- return false;
- return true;
- }
- /*
- tri - точки(индексы в матрице : i == y, j == x) треугольника, в котором нужно провести изолинию
- Z - значение z у изолинии
- line - результат(отрезок по которому будет рисоваться изолиния)
- matrix - значения z из нашей таблицы
- */
Advertisement
Add Comment
Please, Sign In to add comment