如何计算迭代中线段起止点实现形状镂空 复刻Sol Lewitt340号墙绘
基础坐标体系设定
先建立全局平面直角坐标系,以绘制区域左下角为原点(0, 0),向右为x轴正方向,向上为y轴正方向,提前确定3个基础常量:
- 绘制区域总宽度
W、总高度H - 水平线固定行间距
gap,可根据你需要的疏密程度自定义
单条水平线迭代与截断逻辑
- 迭代生成所有水平线的y坐标:从
gap/2开始,每次递增gap,直到数值小于H即可,保证上下边缘的线和边界间距均匀。 - 单条水平线默认起止点为
(0, y)到(W, y),后续用6个镂空形状的范围对线段做截断:计算当前水平线和每个镂空形状的左右交点,删除落在形状内部的线段,剩下的分段就是最终需要绘制的实线。如果某条水平线完全落在任意一个镂空形状内部,直接跳过不绘制。
6个镂空形状的交点计算规则
先统一设定6个形状的布局中心为绘制区域中心(Cx, Cy),其中Cx = W/2、Cy = H/2,自定义每个形状的尺寸参数,保证各形状外接矩形互不重叠即可,不同形状的交点计算逻辑如下:
- 正方形:设边长为
a,边界范围为x ∈ [Cx - a/2, Cx + a/2]、y ∈ [Cy - a/2, Cy + a/2]。当水平线y值落在上述y区间内时,左右交点x坐标为Cx - a/2和Cx + a/2,删除两个交点之间的线段即可。 - 矩形:设宽度为
b、高度为c,边界范围为x ∈ [Cx - b/2, Cx + b/2]、y ∈ [Cy - c/2, Cy + c/2],交点计算逻辑和正方形完全一致,替换对应尺寸参数即可。 - 圆形:设半径为
r,圆心为(Cx, Cy)。当水平线y值满足|y - Cy| < r时,通过圆的方程推导交点x坐标:dx = √(r² - (y - Cy)²),左右交点为(Cx - dx, y)和(Cx + dx, y),删除两个交点之间的线段即可。 - 等腰三角形:设底边长为
d、高为e,三个顶点为(Cx, Cy + e/2)、(Cx + d/2, Cy - e/2)、(Cx - d/2, Cy - e/2)。当水平线y值落在[Cy - e/2, Cy + e/2]区间内时,先计算当前y对应的半宽度:half_w = (d / (2 * e)) * (Cy + e/2 - y),左右交点为(Cx - half_w, y)和(Cx + half_w, y),删除中间线段即可。 - 等腰梯形:设上底长为
f、下底长为g、高为h_t,四个顶点为(Cx - f/2, Cy + h_t/2)、(Cx + f/2, Cy + h_t/2)、(Cx + g/2, Cy - h_t/2)、(Cx - g/2, Cy - h_t/2)。当水平线y值落在[Cy - h_t/2, Cy + h_t/2]区间内时,计算当前y对应的半宽度:half_w = f/2 + ((g - f) / (2 * h_t)) * (Cy + h_t/2 - y),左右交点为(Cx - half_w, y)和(Cx + half_w, y),删除中间线段即可。 - 平行四边形:设水平边长为
i、垂直高度为j、上下边水平偏移量为k,四个顶点为(Cx - i/2, Cy + j/2)、(Cx + i/2, Cy + j/2)、(Cx + i/2 + k, Cy - j/2)、(Cx - i/2 + k, Cy - j/2)。当水平线y值落在[Cy - j/2, Cy + j/2]区间内时,计算当前y对应的水平偏移增量:offset = k * (Cy + j/2 - y) / j,左右交点为(Cx - i/2 + offset, y)和(Cx + i/2 + offset, y),删除中间线段即可。
镂空形状边界竖线计算逻辑
如果需要额外绘制镂空形状的垂直轮廓线,仅正方形和矩形存在垂直边界:
- 正方形左竖线起止点:
(Cx - a/2, Cy - a/2)到(Cx - a/2, Cy + a/2),右竖线起止点:(Cx + a/2, Cy - a/2)到(Cx + a/2, Cy + a/2) - 矩形左竖线起止点:
(Cx - b/2, Cy - c/2)到(Cx - b/2, Cy + c/2),右竖线起止点:(Cx + b/2, Cy - c/2)到(Cx + b/2, Cy + c/2)
其余4个形状无垂直边界,无需绘制竖线,仅靠水平线的截断即可呈现完整轮廓;如果需要绘制斜向轮廓,直接连接对应顶点即可,所有顶点坐标均可通过上述参数推导得到。
内容的提问来源于stack exchange,提问作者KodyJH
相关产品推荐
相关产品推荐

