|
| 1 | +#include "triangle.h" |
| 2 | + |
| 3 | +double_t IsoscelesTriangleGrid::LineFunction_ab(double_t x, double_t step) |
| 4 | +{ |
| 5 | + double_t y = 2 * (x - step); |
| 6 | + |
| 7 | + return y; |
| 8 | +} |
| 9 | + |
| 10 | +double_t IsoscelesTriangleGrid::LineFunction_bc(double_t x) |
| 11 | +{ |
| 12 | + /* x = 1 означает вертикальную грань прямоугольного треугольника |
| 13 | + * /| |
| 14 | + * / | |
| 15 | + * /__| |
| 16 | + * |
| 17 | + */ |
| 18 | + x = 1; |
| 19 | + |
| 20 | + return x; |
| 21 | +} |
| 22 | + |
| 23 | +uint_fast32_t IsoscelesTriangleGrid::GetGreed(boolean debug) |
| 24 | +{ |
| 25 | + /* |
| 26 | + * Массив координат треугольников |
| 27 | + * TODO изменить фиксированную размерность. Заранее вычислять число треугольников. |
| 28 | + */ |
| 29 | + |
| 30 | + /* Координаты узлов сетки */ |
| 31 | + double_t x = m_a.x; |
| 32 | + double_t y = 0; |
| 33 | + |
| 34 | + /* |
| 35 | + * t1 - разница между координатой y правой точки маленького треугольника и правой границей |
| 36 | + * основного треугольника. Если разница меньше eps, считаем что мы дошли до границы. |
| 37 | + * t2 - то же самое, для перевернутых маленьких треугольников. |
| 38 | + * Если выполнены условия для t1 и t2, значит этот уровень триангулирован и надо идти вверх по оси y |
| 39 | + * на следующий уровень. |
| 40 | + */ |
| 41 | + double_t eps = EPS_T; |
| 42 | + double_t t1 = 0; |
| 43 | + double_t t2 = 0; |
| 44 | + |
| 45 | + /* |
| 46 | + * Счетчики |
| 47 | + * i - счетчик прямых, параллельных левой грани треугольника (идет через два шага, одинаково на всех уровнях) |
| 48 | + * обнуляется в конце уровня |
| 49 | + * j - счетчик треугольников в массиве треугольников |
| 50 | + * ii - счетчик сдвига по x при переходе на ряд выше ( счетчик иксов на уровне) |
| 51 | + * l - счетчик рядов по высоте (он идет до середины треугольника) |
| 52 | + * k - нумератор узлов |
| 53 | + * n - число узлов на уровне (на сколько узлов делится горизонтальная сторона треугольника) |
| 54 | + * length - длина уровня |
| 55 | + */ |
| 56 | + uint_fast32_t i = 0; |
| 57 | + uint_fast32_t j = 0; |
| 58 | + uint_fast32_t ii = 0; |
| 59 | + uint_fast32_t l = 0; |
| 60 | + |
| 61 | + uint_fast32_t k = 0; |
| 62 | + uint_fast32_t n = 0; |
| 63 | + // m_b.x -1 потому что тут бага в координатах (см файл constants). |
| 64 | + double_t length = LineFunction_bc(m_b.x - 1) + STEP_X; |
| 65 | + |
| 66 | + /* Переход с ряда на ряд (вверх), пока не дойдем до середины треугольника */ |
| 67 | + while (y < TRIANGLE_HEIGHT) { |
| 68 | + length -= STEP_X; |
| 69 | + n += (length / m_hx) + 1; |
| 70 | + /* Цикл по горизонтальному ряду */ |
| 71 | + for (;;) { |
| 72 | + x = ii * m_hx; |
| 73 | + y = LineFunction_ab(x, i * m_hx); |
| 74 | + |
| 75 | + triangle.first_point = { x, y, k }; |
| 76 | + |
| 77 | + x = (ii + 1) * m_hx; |
| 78 | + y = LineFunction_ab(x, (i + 1) * m_hx); |
| 79 | + |
| 80 | + triangle.second_point = { x, y, k + 1 }; |
| 81 | + |
| 82 | + t1 = abs(x - LineFunction_bc(x)); |
| 83 | + |
| 84 | + x = (ii + 1) * m_hx; |
| 85 | + y = LineFunction_ab(x, i * m_hx); |
| 86 | + |
| 87 | + triangle.third_point = { x, y, k + ((uint_fast32_t)(length / m_hx) + 1) }; |
| 88 | + |
| 89 | + triangles_array.push_back(triangle); |
| 90 | + |
| 91 | + if (debug == true) { |
| 92 | + LOG(INFO) << "First point of triange " << j << ": "; |
| 93 | + LOG(INFO) << "x: " << triangles_array.at(j).first_point.x; |
| 94 | + LOG(INFO) << "y: " << triangles_array.at(j).first_point.y; |
| 95 | + LOG(INFO) << "k: " << triangles_array.at(j).first_point.point_num; |
| 96 | + LOG(INFO) << "Second point of triange " << j << ": "; |
| 97 | + LOG(INFO) << "x: " << triangles_array.at(j).second_point.x; |
| 98 | + LOG(INFO) << "y: " << triangles_array.at(j).second_point.y; |
| 99 | + LOG(INFO) << "k: " << triangles_array.at(j).second_point.point_num; |
| 100 | + LOG(INFO) << "Third point of triange " << j << ": "; |
| 101 | + LOG(INFO) << "x: " << triangles_array.at(j).third_point.x; |
| 102 | + LOG(INFO) << "y: " << triangles_array.at(j).third_point.y; |
| 103 | + LOG(INFO) << "k: " << triangles_array.at(j).third_point.point_num; |
| 104 | + } |
| 105 | + |
| 106 | + t2 = abs(x - LineFunction_bc(x)); |
| 107 | + |
| 108 | + if ((t2 < EPS_T) && (t1 < EPS_T)) { |
| 109 | + ii = l + 1; |
| 110 | + i = 0; |
| 111 | + j++; |
| 112 | + k = n; |
| 113 | + if (debug == true) { |
| 114 | + LOG(INFO) << "BREAK CONDITION."; |
| 115 | + LOG(INFO) << "n = " << n; |
| 116 | + LOG(INFO) << "k = " << k; |
| 117 | + } |
| 118 | + break; |
| 119 | + } |
| 120 | + |
| 121 | + triangle.first_point.x = triangles_array.back().third_point.x; |
| 122 | + triangle.first_point.y = triangles_array.back().third_point.y; |
| 123 | + triangle.first_point.point_num = triangles_array.back().third_point.point_num; |
| 124 | + triangle.second_point.x = triangles_array.back().second_point.x; |
| 125 | + triangle.second_point.y = triangles_array.back().second_point.y; |
| 126 | + triangle.second_point.point_num = triangles_array.back().second_point.point_num; |
| 127 | + |
| 128 | + x = (ii + 2) * m_hx; |
| 129 | + y = LineFunction_ab(x, (i + 1) * m_hx); |
| 130 | + |
| 131 | + triangle.third_point = { x, y, k + 1 + ((uint_fast32_t)(length / m_hx) + 1) }; |
| 132 | + triangles_array.push_back(triangle); |
| 133 | + |
| 134 | + if (debug == true) { |
| 135 | + LOG(INFO) << "Second point of triange " << j + 1 << ": "; |
| 136 | + LOG(INFO) << "x: " << triangles_array.at(j + 1).first_point.x; |
| 137 | + LOG(INFO) << "y: " << triangles_array.at(j + 1).first_point.y; |
| 138 | + LOG(INFO) << "k: " << triangles_array.at(j + 1).first_point.point_num; |
| 139 | + LOG(INFO) << "Second point of triange " << j + 1 << ": "; |
| 140 | + LOG(INFO) << "x: " << triangles_array.at(j + 1).second_point.x; |
| 141 | + LOG(INFO) << "y: " << triangles_array.at(j + 1).second_point.y; |
| 142 | + LOG(INFO) << "k: " << triangles_array.at(j + 1).second_point.point_num; |
| 143 | + LOG(INFO) << "Third point of triange " << j + 1 << ": "; |
| 144 | + LOG(INFO) << "x: " << triangles_array.at(j + 1).third_point.x; |
| 145 | + LOG(INFO) << "y: " << triangles_array.at(j + 1).third_point.y; |
| 146 | + LOG(INFO) << "k: " << triangles_array.at(j + 1).third_point.point_num; |
| 147 | + } |
| 148 | + i = i + 1; |
| 149 | + ii = ii + 1; |
| 150 | + j = j + 2; |
| 151 | + k++; |
| 152 | + } |
| 153 | + l++; |
| 154 | + if (debug == true) { |
| 155 | + LOG(INFO) << "New level l = " << l; |
| 156 | + } |
| 157 | + } |
| 158 | + return triangles_array.back().third_point.point_num; |
| 159 | +} |
0 commit comments