Canvas 矩形内斜线网格绘制

 

上为效果图👆

※ 如图,绘制网格有两种情况,分别为宽大于高,和宽小于高的两种情况

下 为 代 码👇

this.ctx.beginPath()
this.ctx.moveTo(x1, y1)
this.ctx.lineTo(x2, y1)
this.ctx.lineTo(x2, y2)
this.ctx.lineTo(x1, y2)
this.ctx.closePath()
this.ctx.stroke()
let sWidth = 23
if (x2 - x1 < y2 - y1) {
    // 宽 < 高
    let rowNeedLength = Math.floor((x2 - x1) / sWidth)
    let colNeedLength = Math.floor((y2 - y1 - rowNeedLength * sWidth) / sWidth)
    let colExcessive = (rowNeedLength + 1) * sWidth - (x2 - x1)
    let rowExcessive = ((rowNeedLength + colNeedLength) * sWidth) - (y2 - y1)
    for (let i = 0; i < rowNeedLength; i++) {
        //  /
        this.ctx.beginPath()
        this.ctx.moveTo(x1 + (i + 1) * sWidth, y1)
        this.ctx.lineTo(x1, y1 + (i + 1) * sWidth)
        this.ctx.stroke()
        this.ctx.beginPath()
        this.ctx.moveTo(x1 + (i + 1) * sWidth + rowExcessive, y2)
        this.ctx.lineTo(x2, y1 + (colNeedLength * sWidth) + colExcessive + (i * sWidth))
        this.ctx.stroke()

        // \
        this.ctx.beginPath()
        this.ctx.moveTo(x2 - (i + 1) * sWidth, y1)
        this.ctx.lineTo(x2, y1 + (i + 1) * sWidth)
        this.ctx.stroke()
        this.ctx.beginPath()
        this.ctx.moveTo(x2 - (i + 1) * sWidth - rowExcessive, y2)
        this.ctx.lineTo(x1, y1 + (colNeedLength * sWidth) + colExcessive + (i * sWidth))
        this.ctx.stroke()
    }
    for (let i = 0; i < colNeedLength; i++) {
        //  /
        this.ctx.beginPath()
        this.ctx.moveTo(x1, y1 + (i + 1) * sWidth + (rowNeedLength * sWidth))
        this.ctx.lineTo(x2, y1 + (i) * sWidth + colExcessive)
        this.ctx.stroke()
        // \
        this.ctx.beginPath()
        this.ctx.moveTo(x2, y1 + (i + 1) * sWidth + (rowNeedLength * sWidth))
        this.ctx.lineTo(x1, y1 + (i) * sWidth + colExcessive)
        this.ctx.stroke()

    }
} else {
    //宽 > 高
    let colNeedLength = Math.floor((y2 - y1) / sWidth)
    let rowNeedLength = Math.floor((x2 - x1 - colNeedLength * sWidth) / sWidth)
    let colExcessive = (colNeedLength + 1) * sWidth - (y2 - y1)
    let rowExcessive = ((colNeedLength + rowNeedLength) * sWidth) - (x2 - x1)
    for (let i = 0; i < colNeedLength; i++) {
        // /
        this.ctx.beginPath()
        this.ctx.moveTo(x1 + (i + 1) * sWidth, y1)
        this.ctx.lineTo(x1, y1 + (i + 1) * sWidth)
        this.ctx.stroke()
        this.ctx.beginPath()
        this.ctx.moveTo(x2, y1 + (i + 1) * sWidth + rowExcessive)
        this.ctx.lineTo(x1 + (rowNeedLength * sWidth) + colExcessive + (i * sWidth), y2)
        this.ctx.stroke()
        // \
        this.ctx.beginPath()
        this.ctx.moveTo(x2 - (i + 1) * sWidth, y1)
        this.ctx.lineTo(x2, y1 + (i + 1) * sWidth)
        this.ctx.stroke()
        this.ctx.beginPath()
        this.ctx.moveTo(x1, y1 + (i + 1) * sWidth + rowExcessive)
        this.ctx.lineTo(x2 - (rowNeedLength * sWidth) - colExcessive - (i * sWidth), y2)
        this.ctx.stroke()
    }
    for (let i = 0; i < rowNeedLength; i++) {
        // /
        this.ctx.beginPath()
        this.ctx.moveTo(x1 + (i + 1) * sWidth + colNeedLength * sWidth, y1)
        this.ctx.lineTo(x1 + (i) * sWidth + colExcessive, y2)
        this.ctx.stroke()
        // \
        this.ctx.beginPath()
        this.ctx.moveTo(x2 - (i + 1) * sWidth - colNeedLength * sWidth, y1)
        this.ctx.lineTo(x2 - (i) * sWidth - colExcessive, y2)
        this.ctx.stroke()
    }
}

(※ 未封装处理,便于梳理理解)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值