算法
计数质数
统计所有小于非负整数 n 的质数的数量。
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
var countPrimes = function(n) {
if(n<=2) return 0
if(n<=3) return 1
var count = 1
var arr = new Array(n)
for(var i = 3; i < n; i+=2) {
if(arr[i]) continue
count++
for(var j = i; j < n; j = j + i) {
arr[j] = true
}
}
return count
};
3的幂
给定一个整数,写一个函数来判断它是否是 3 的幂次方。
var isPowerOfThree = function(n) {
let str = n.toString(3);
if (str[0] === '1' && str.slice(1) == false) return true
else return false
};
canvas 属性
宽高
width、height:默认宽带是 300,高度是 150。
getContext
var context = canvas.getContext(contextType, contextAttributes);
contextType
-
'2d':会创建并返回一个CanvasRenderingContext2D对象,主要用来进行2d绘制,也就是二维绘制,平面绘制。 -
'webgl'或'experimental-webgl':此参数可以返回一个WebGLRenderingContext(WebGL渲染上下文)对象,WebGL(全写Web Graphics Library)是一种3D绘图协议,可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统显卡来在浏览器里更流畅地展示3D场景和模型,无需安装任何其他插件。此参数对应的WebGL版本1(OpenGL ES 2.0)。 -
'webgl2':此参数可以返回一个WebGL2RenderingContext对象,可以用来绘制三维3D效果。此参数对应的WebGL版本2(OpenGL ES 3.0)。不过目前这个还处于试验阶段,我们实际Kaufman都是使用’webgl’这个参数。 -
'bitmaprenderer':创建一个ImageBitmapRenderingContext(位图渲染上下文),可以借助给定的ImageBitmap替换Canavs的内容。
contextAttributes
contextType参数值是’2d’,则contextAttributes支持的标准属性值为:
alpha Boolean:表示Canavs是否包含alpha透明通道,如果设置为false,则表示Canvas不支持全透明或者半透明,在绘制带有透明效果的图形或者图像时候速度会更快一些。
contextType参数值是’webgl’,则contextAttributes支持的标准属性值为:
alphaBoolean:表示Canavs是否包含透明缓冲区。antialiasBoolean:表示是否需要抗边缘锯齿。如果设置为true,图像呈现质量会好一些,但是速度会拖慢。depthBoolean:表示绘制缓冲区的缓冲深度至少16位。failIfMajorPerformanceCaveatBoolean:表示如果用户的系统性能比较差,是否继续常见绘制上下文。powerPreferenceString:高速用户使用的客户端(如浏览器)我们现在这个WebGL上下文最合适的GPU配置是什么。支持下面关键字值:'default':让用户的客户端设备自己觉得那个GPU配置是最合适的。这个是此参数的默认值。'high-performance':渲染性能优先,通常更耗掉(如手机,平板等移动设备)。'low-power':省电优先,渲染性能权重可以低一些。
premultipliedAlphaBoolean:表示页面合成器将假定绘图缓冲区包含具有alpha预乘(pre-multiplied alpha)颜色。preserveDrawingBufferBoolean:如果值为true,则不会清除缓冲区并保留其值,直到作者清除或覆盖。stencilBoolean:表示绘图缓冲区具有至少8位的模板缓冲区。
toBlob
toBlob()方法可以Canvas图像对应的Blob对象(binary large object)。此方法可以把Canvas图像缓存在磁盘上,或者存储在内存中,这个往往由浏览器决定。
void canvas.toBlob(callback, mimeType, quality);
callbackFunction:toBlob()方法执行成功后的回调方法,支持一个参数,表示当前转换的Blob对象。mimeType(可选)String:mimeType表示需要转换的图像的mimeType类型。默认值是image/png,还可以是image/jpeg,甚至image/webp(前提浏览器支持)等。quality(可选)Number:quality表示转换的图片质量。范围是0到1。由于Canvas的toBlob()方法转PNG是无损的,因此,此参数默认是没有效的,除非,指定图片mimeType是image/jpeg或者image/webp,此时默认压缩值是0.92。
toDataURL
Canvas本质上就是一个位图图像,因此,浏览器提供了若干API可以将Canvas图像转换成可以作为IMG呈现的数据,其中最老牌的方法就是HTMLCanvasElement.toDataURL(),此方法可以返回Canvas图像对应的data URI,也就是平常我们所说的base64地址。
canvas.toDataURL(mimeType, quality);
mimeType(可选)String:mimeType表示需要转换的图像的mimeType类型。默认值是image/png,还可以是image/jpeg,甚至image/webp(前提浏览器支持)等。quality(可选)Number:quality表示转换的图片质量。范围是0到1。此参数要想有效,图片的mimeType需要是image/jpeg或者image/webp,其他mimeType值无效。默认压缩质量是0.92。 根据自己的肉眼分辨,如果使用toDataURL()的quality参数对图片进行压缩,同样的压缩百分比呈现效果要比Adobe Photoshop差一些。
CanvasRenderingContext2D 属性
canvas
获取当前 canvas 的引用
fillStyle
color:直接填充颜色gradient:水平渐变、径向渐变都可以- createLinearGradient:创建水平渐变
- createRadialGradient:创建径向渐变
pattern:- createPattern:传入图片对象生成背景
font
用于 canvas 文本绘制时候的字号字体控制。默认是 10px sans-serif
context.font = '24px SimSun, Songti SC';
// 检测字体加载完毕
// 随便设置个不认识的字体
context.font = '20px UNKNOW';
context.fillText('以梦为马,不负韶华', 10, 50);
// 弄到数据信息
var dataDefault = context.getImageData(10, 10, 50, 50).data;
// 画布擦干净
context.clearRect(0, 0, 300, 80);
// 开始进行像素检测
var detect = function () {
context.font = '20px SYSTC';
context.fillText('以梦为马,不负韶华', 10, 50);
// 如果前后数据一致,说明SYSTC字体还没加载成功,继续检测
var dataNow = context.getImageData(10, 10, 50, 50).data;
if ([].slice.call(dataNow).join('') == [].slice.call(dataDefault).join('')) {
context.clearRect(0, 0, 300, 80);
requestAnimationFrame(detect);
}
};
detect();
globalAlpha
全局的透明度,范围是 0 到 1;
context.globalAlpha = 0.5;
globalCompositeOperation
可以用来设置 canvass 图形的混合模式,可以衍生很多其他效果,例如遮罩,裁剪,以及改变绘制图形的上下层叠关系。效果
lineCap
butt:默认值,线的端点就像是个断头台,例如一条横线,终点x坐标是100,则这条线的最右侧边缘就是100这个位置,没有超出。round:线的端点多出一个圆弧。square: 线的端点多出一个方框,框框的宽度和线一样宽,高度是线厚度的一半。
lineDashOffset
用来制定虚线绘制的偏移距离
context.lineDashOffset = value;
lineJoin
miter:默认值,转角是尖头。如果折线角度比较小,则尖头会非常长,因此需要miterLimit进行限制。round:转角是圆头。bevel:转角是平头。
miterLimit
当lineJoin类型是miter时候,miter效果生效的限制值。
lineWidth
线的宽度
context.lineWidth = value;
shadowBlur
模糊程度
context.shadowBlur = value;
shadowColor
阴影的颜色
context.shadowColor = color;
shadowOffsetX
阴影水平偏移大小
context.shadowOffsetX = offset;
shadowOffsetY
阴影垂直偏移大小
context.shadowOffsetY = offset;
strokeStyle
描边的样式
context.strokeStyle = color;
context.strokeStyle = gradient;
context.strokeStyle = pattern;
color:描边设置为颜色。gradient:描边设置为渐变。pattern:描边设置为图案。
textAlign
文字水平对齐方式
left:文本左对齐。也就是最终绘制的文本内容最左侧位置就是设定的x坐标值。right:文本右对齐。也就是最终绘制的文本内容最右侧位置就是设定的x坐标值。center:文本居中对齐。也就是最终绘制的文本内容的水平中心位置就是设定的x坐标值。start:文本起始方位对齐。如果文本是从左往右排列的,则表示左对齐;如果文本是从右往左排列的(例如设置context.direction为rtl),则表示右对齐。end:文本结束方位对齐。如果文本是从左往右排列的,则表示右对齐;如果文本是从右往左排列的(例如设置context.direction为rtl),则表示左对齐。
textBaseline
文字对齐的基线
top:设定的垂直y坐标作为文本em区域(em区域可以看成中文字符占据的区域)的顶部。hanging:hanging主要在藏文和其他印度文字中使用,我们了解即可。middle:设定的垂直y坐标作为文本em区域的垂直中心位置。alphabetic:默认值。表示的是正常文本的基线,可以看成是字母x的下边缘。也就是设定的垂直y坐标就是字母x的下边缘。ideographic:ideographic主要在汉语、日语和韩语中使用。字面直译是表意基线。含义为:如果字符的主体突出在字母基线之下,则这是字符主体的底部。例如汉字“中”比字母x位置更低,因此,底部是汉字主体的底部。bottom:设定的垂直y坐标作为文本em区域的底部。