您的图片可以分成 4 个相等的部分,它们是点对称的,除了交换黑白图块。例如,要计算下象限,您遍历从左下角(x1, y1) 开始的所有行并朝右边缘(x2, y2) 进行遍历,然后遍历可以从左上角@ 开始的所有行987654325@ 朝向底部边缘(x4, y4),计算交点并将其保存在矩阵Px 和Py 中。我懒得做数学,所以我只输入了line intersections 的公式。最后,如果索引ix 和iy 的和为奇数,则遍历矩阵并在相邻点之间绘制一个补丁。
使用 Python/matplotlib 的示例:
from __future__ import division
import matplotlib.pyplot as plt
import numpy as np
def intersect(x1, y1, x2, y2, x3, y3, x4, y4):
det = (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4)
px = ((x1*y2-y1*x2)*(x3-x4) - (x1-x2)*(x3*y4-y3*x4)) / det
py = ((x1*y2-y1*x2)*(y3-y4) - (y1-y2)*(x3*y4-y3*x4)) / det
return px, py
n = 10
Px = np.zeros((n+1, n+1))
Py = np.zeros((n+1, n+1))
x1, y1 = 0, 0
x2 = 1
x3, y3 = 0, 1
y4 = 0
for ix in range(n+1): # index left to right along bottom
x4 = ix / n
for iy in range(n+1): # index bottom to top along right side
y2 = iy / n
px, py = intersect(x1, y1, x2, y2, x3, y3, x4, y4)
plt.plot([x1,x2], [y1,y2], 'k')
plt.plot([x3,x4], [y3,y4], 'k')
plt.plot(px, py, '.r', markersize=10, zorder=3)
Px[ix, iy] = px
Py[ix, iy] = py
for ix in range(n):
for iy in range(n):
if (ix + iy) % 2: # only plot if sum is odd
xy = [[Px[ix, iy], Py[ix, iy]], # rectangle of neighboring points
[Px[ix, iy+1], Py[ix, iy+1]],
[Px[ix+1, iy+1], Py[ix+1, iy+1]],
[Px[ix+1, iy], Py[ix+1, iy]]]
poly = plt.Polygon(xy,facecolor='gray',edgecolor='none')
plt.gca().add_patch(poly)
plt.show()
这段代码可能会再优化一点,但像这样应该相当清楚它的作用。
结果:
将此扩展到所有 4 个象限并将其编写为 SVG 文件作为练习留给读者:)。