h5c3-day08

js 的Math库,自带了许多常见函数方法,其中关于 三角函数的求解还是很齐全的,于是想到,利用canvas 绘制一个比较准确的 sin、cos、tan、sinh、cosh、tanh图像。

canvas绘制坐标轴

坐标轴由两条直线构成,直接将坐标定在中心点就好,这样容易绘制。同时为坐标的箭头定义边长。

绘制坐标轴上的尺度和文字

思路:将坐标轴线的长度平均分割,分别定义好x轴和y轴每个尺度的对应值。 
这其中,sin,cos和tan的图一般都是以π作为单位,且π/2也做标注,故画需要对每个单元格进行更细小的划分,按更小的单位进行循环绘制。类似直尺上的毫米,一毫米一毫米绘制,每十毫米满一个单元时,其标尺标记更长一些,以示区分。

为灵活展示每个单元的更细小划分情况,应允许传入一个单元的拆分数,用来展示更小单位下的尺度。如一厘米=10毫米,即拆分为10份。

对sin、cos、tan 来说,需要展示标注文字和标尺:1π/2,3π/2,则每个单元应拆分为2份。 
但对sinh、cosh、tanh 来说,x、y轴上都不需要展示1/2,1/3的标注文字,也不需要展示特别细小的尺寸。份数可设置为1。

其实,这只是因为过小的尺寸不好标注文字。限制每多少个小单位标注文字即可。

当线宽为奇数,绘制坐标是整数时,那么无论如何,线条的矩形区域都坐标都多出0.5像素,于是补满,整体多出了1像素。
当线宽为偶数,绘制坐标是整数时,那么无论如何,画笔中线总是对齐坐标的,线条宽度不会产生偏差。
当线宽有小数,绘制坐标是整数时,那么无论如何,线条的矩形区域都坐标都存在小数,于是补满。整体也会多出1像素。
如: 
当画笔线宽为1px,那么绘制直线L:(0,0),(100,0)时,画笔对齐 y 坐标 = 0。由于线宽的存在,实际绘制线条有一半线宽在y的负半轴。导致不可见。 
那么线条矩形区域为:

Rect(left:0,top:-0.5,right:100;bottom:0.5)

0.5像素不可见,加满1像素,实际线条区域变为:

Rect(left:0,top:-1,right:100;bottom:1)

就变2px那么大了。

解决这个问题,我们只需要将线条的y坐标偏移0.5就行: 
L:(0,0.5),(100,0.5) 
当画笔中线对齐y坐标=0.5,时,线条矩形区域没有多余小数:

Rect(left:0,top:0,right:100,1)

这样,自然就是真的1px线条了。

综上,线宽为偶数不会产生误差,而线宽为小数,本来就无法准确绘制,不用处理了。

所以绘制时,我们只需要修正线宽为奇数的情况就行。甚至,只修复线宽1px的情况就可以,因为当线宽很大时,肉眼感知不到啊。

var fix1px = (cxt.lineWidth % 2 === 0) ?0: 0.5;

纵向线条,x坐标偏移: 
x = x+fix1px ;

横向线条,y坐标偏移: 
y = y+fix1px ;】

    描边的颜色默认为黑色
    描边的宽度大小:默认1px
    产生的原因:对齐的点是线的中心位置,浏览器会把线分成上下两个0.5px,但是浏览器又不会解析0.5px,所以就默认的显示1px,最终给用户看到的线2px,所以颜色显示的也是不饱和的。
    解决方案:向上,或者向下平移0.5px

     非0环绕:
      1.在区域中添加一条射线
      2. 看这条射线和轨迹的交点  规定顺时针为+1,逆时针为-1 ,算出交点的和
      3. 如果交点结果=0,表明这个区域在里面,不填充颜色
            交点结果不为0,在外边,填充颜色

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值