(已编辑:我之前忘记包含full_triangle() 的代码)。
假设您有一个画线的算法,例如 Bresenham's Algorithm,并假设它可以推广到 N-dim 情况。
幸运的是,raster-geometry 包有这样一个 Bresenham 算法的 N-dim 实现。
(免责声明:我是该包的主要作者。)
设A、B、C为三角形ABC的顶点坐标。
如果你只需要绘制外形,你可以使用算法使用各种点的组合来形成线条:AB、BC、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。
例如,您所追求的 3D 三角形可以通过以下方式生成:
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)