( EDITED : ранее я забыл включить код для full_triangle()
).
Предположим, у вас есть алгоритм, который dr aws строк, как Алгоритм Брезенхема и предположим, что его можно обобщить на случай N-dim.
К счастью, пакет raster-geometry
имеет такую реализацию N-dim алгоритма Брезенхама.
(Отказ от ответственности: я являюсь основным автором пакета.)
Пусть A, B, C - координата вершин треугольника AB C.
Если вам нужно нарисовать только внешнюю фигуру, вы можете просто использовать алгоритм, используя различные комбинации точек для формирования линий: AB, B C, CA.
В коде , это будет просто:
import numpy as np
import raster_geometry as rg
a, b, c = (1, 1), (3, 7), (6, 4)
coords = set(rg.bresenham_lines((a, b, c), closed=True))
print(coords)
# {(1, 2), (6, 4), (3, 2), (4, 6), (5, 5), (2, 2), (2, 3), (3, 6), (2, 4), (4, 3), (3, 7), (2, 5), (1, 1), (5, 3)}
arr = rg.render_at((10, 10), coords)
print(arr.astype(int))
# [[0 0 0 0 0 0 0 0 0 0]
# [0 1 1 0 0 0 0 0 0 0]
# [0 0 1 1 1 1 0 0 0 0]
# [0 0 1 0 0 0 1 1 0 0]
# [0 0 0 1 0 0 1 0 0 0]
# [0 0 0 1 0 1 0 0 0 0]
# [0 0 0 0 1 0 0 0 0 0]
# [0 0 0 0 0 0 0 0 0 0]
# [0 0 0 0 0 0 0 0 0 0]
# [0 0 0 0 0 0 0 0 0 0]]
Если вам нужно нарисовать полный треугольник, вы можете сделать следующее:
- нарисовать линию от точки A до точки B
- Нарисуйте линию от C до точки на линии AB, для каждой точки на линии.
Хотя это может быть и не Наиболее эффективный подход, он будет работать достаточно хорошо. Возможно, что некоторые точки около вершин могут быть пропущены. В этом случае достаточно повторить одну и ту же процедуру, повторяя все три вершины.
В коде это может выглядеть следующим образом:
import numpy as np
import raster_geometry as rg
def full_triangle(a, b, c):
ab = rg.bresenham_line(a, b, endpoint=True)
for x in set(ab):
yield from rg.bresenham_line(c, x, endpoint=True)
a, b, c = (1, 1), (3, 7), (6, 4)
coords = set(full_triangle(a, b, c))
print(coords)
# {(1, 2), (6, 4), (5, 4), (3, 2), (3, 3), (5, 5), (4, 6), (4, 5), (4, 4), (1, 1), (2, 3), (4, 3), (2, 2), (3, 6), (3, 7), (2, 5), (5, 3), (3, 4), (2, 4), (3, 5)}
arr = rg.render_at((10, 10), coords)
print(arr.astype(int))
# [[0 0 0 0 0 0 0 0 0 0]
# [0 1 1 0 0 0 0 0 0 0]
# [0 0 1 1 1 1 0 0 0 0]
# [0 0 1 1 1 1 1 1 0 0]
# [0 0 0 1 1 1 1 0 0 0]
# [0 0 0 1 1 1 0 0 0 0]
# [0 0 0 0 1 0 0 0 0 0]
# [0 0 0 0 0 0 0 0 0 0]
# [0 0 0 0 0 0 0 0 0 0]
# [0 0 0 0 0 0 0 0 0 0]]
Обратите внимание, что хотя примеры находятся в 2D, они работают на N-dim. Например, трехмерный треугольник, который вам нужен, может быть сгенерирован с помощью:
x1 = (10, 20, 30)
x2 = (21, 15, 34)
x3 = (33, 1, 62)
coords = set(full_triangle(x1, x2, x3))
arr = rg.render_at((48, 32, 64), coords)