用顶点之间的渐变填充 matplotlib 多边形

nic*_*ash 6 python gradient mesh matplotlib

我正在使用 matplotlib 的 Poly3DCollection 绘制一组多边形(三角形)。三角形位于顶点之间,具有与之关联的颜色。我目前正在用通过平均三个顶点的颜色确定的纯色填充每个三角形。绘制三角形以形成 3D 表面网格。

我想用所有三个顶点之间的渐变填充三角形。理想情况下,给定点的像素颜色只是基于到三个点的距离进行线性插值。例如,如果顶点是蓝色、绿色和红色,则生成的三角形应如下所示:
在此处输入图片说明

我认为这应该可以使用 matplotlib,但我不知道该怎么做。如果不可能,您能否建议我可以使用的另一个库或方法?谢谢你的帮助。

编辑:其他细节

它应该适用于任意数量的三角形,但可能小于 2000。颜色是任意的,尽管每个顶点只有一种颜色与之关联。多边形集合是从顶点列表创建的[x_1, y_1, z_1, x_2, y_2, z_2...]。我可以根据需要轻松更改此格式。与每个顶点关联的颜色都在一个单独的列表中,这也可以轻松更改。

ted*_*511 1

这个问题五年前就被问过,我认为我们应该用代码来回答它。@ImportanceOfBeingErnest 的评论是最有帮助的,现在我将每个成分总结为以下代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch

pts = np.array([(0, 0), (1, 0), (0.78, 1)])
p0 = pts.mean(axis=0)
x0, y0 = p0
L = np.maximum(pts[:, 0].ptp(), pts[:, 0].ptp())
delta = 0.01
x = np.arange(x0 -L, x0 + L, delta)
y = np.arange(y0 -L, y0 + L, delta)

X, Y = np.meshgrid(x, y)
d1 = np.sqrt((X-pts[0][0])**2 + (Y-pts[0][1])**2)
d2 = np.sqrt((X-pts[1][0])**2 + (Y-pts[1][1])**2)
d3 = np.sqrt((X-pts[2][0])**2 + (Y-pts[2][1])**2)
eps = 1e-9
d1  = 1/(d1 + eps)
d2  = 1/(d2 + eps)
d3  = 1/(d3 + eps)

d = np.dstack([d1, d2, d3])
d = d/(d.sum(axis=2)[:, :, np.newaxis])

# plot triangle
path = Path(pts)
patch = PathPatch(path, facecolor='none')

fig, ax = plt.subplots(1, 1, figsize=(7.2, 7.2))
ax.add_patch(patch)
im = ax.imshow(d, origin='lower', clip_path=patch, clip_on=True, extent=[x0-L, x0+L, y0-L, y0+L],)
im.set_clip_path(patch)

# plot trinagle points
ax.scatter(pts[:, 0], pts[:, 1], color='k', s=50)
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述