日期:2014-05-16 浏览次数:20388 次
很早之前写的一个绘图类,那时候VML和SVG的图库还不是十分流行,最初的灵感以及图形算法来自一个叫w_jsGraphics.js的类库。
用一个点来绘制出世界。甚以此纪念那段充满激情的岁月。
?
/** *JS 绘图类 Graphics- 0.02 *@author <a href="mailto: redrainyi@gmail.com">yyl</a> *@param canvas 画布(画布可以是 DIV(IE) 或 Layer(Netscape) *参考资料《w_jsGraphics.js绘图类》《DHTML手册》《BISOFT JS》《Computer Graphics》 *CopyLeft 2007 在引用或转载时请保持文件代码的完整性 */ function Graphics(canvas) { /*获得画板以后的绘图都是在画板上实现*/ this.canvas = typeof(canvas)=="string"?document.getElementById(canvas):canvas; /*默认颜色 #000000黑色*/ this.color = '#000000'; /*设置线默认象素为 1px*/ this.setStroke(1); /*文本默认字体*/ this.setFont('verdana,geneva,helvetica,sans-serif', 20, "PLAIN"); /*创建一个Div元素作为根结点 所有绘图的根结点*/ this.documentRoot = document.createElement("div"); } Graphics.prototype = { canvas : window, color : '#000000', stroke : 1, documentRoot : null, /*设置颜色 格式"#RRGGBB" 颜色会保留到下一次再重新设置为止*/ setColor : function(c) { this.color = c; }, /*绘制点DIV*/ drawDiv : function(x, y, w, h) { var elem = document.createElement("div");/*创建一个Div元素*/ elem.style.position = 'absolute'; elem.style.overflow = 'hidden'; elem.style.left = x; elem.style.top = y; elem.style.width = w; elem.style.height = h ; elem.style.backgroundColor = this.color; this.documentRoot.appendChild(elem); }, /*绘制组件 (绘图)*/ paint : function() { this.canvas.appendChild(this.documentRoot);/*将根结点添加到画布上*/ }, /*清空画板*/ clear : function() { if (this.canvas) this.canvas.innerHTML = ''; }, /*设置画笔 参数代表点(象素)大小 默认是 1px (设置为-1时候代表 虚点线)*/ setStroke : function(x) { this.stroke = x; if (!(x+1)) /*javaScript中 0为假 */ { /*设置画法为虚点*/ this.drawLine = this.drawLineDott; this.drawOval = this.drawOvalDott; this.drawRect = this.drawRectangleDott; } else if (x > 1) { /*实线*/ this.drawLine = this.drawLine2D; this.drawOval = this.drawOval2D; this.drawRect = this.drawRectangle; } else { /*/象素大小(厚度)为1px的线*/ this.drawLine = this.drawLine1D; this.drawOval = this.drawOval1D; this.drawRect = this.drawRectangle; } }, /*画虚线*/ drawLineDott : function(x1, y1, x2, y2) { if (x1 > x2) { var _x2 = x2; var _y2 = y2; x2 = x1; y2 = y1; x1 = _x2; y1 = _y2; } var dx = x2-x1, dy = Math.abs(y2-y1), x = x1, y = y1, yIncr = (y1 > y2)? -1 : 1, drw = true; if (dx >= dy) { var pr = dy<<1, pru = pr - (dx<<1), p = pr-dx; while ((dx--) > 0) { if (drw) this.drawDiv(x, y, 1, 1); drw = !drw; if (p > 0) { y += yIncr; p += pru; } else p += pr; ++x; } if (drw) this.drawDiv(x, y, 1, 1); } else { var pr = dx<<1, pru = pr - (dy<<1), p = pr-dy; while ((dy--) > 0) { if (drw) this.drawDiv(x, y, 1, 1); drw = !drw; y += yIncr; if (p > 0) { ++x; p += pru; } else p += pr; } if (drw) this.drawDiv(x, y, 1, 1); } }, /*画线(经过优化的绘线方法)*/ drawLine2D : function(x1, y1, x2, y2) { if (x1 > x2) { var _x2 = x2; var _y2 = y2; x2 = x1; y2 = y1; x1 = _x2; y1 = _y2; } var dx = x2-x1, dy = Math.abs(y2-y1), x = x1, y = y1, yIncr = (y1 > y2)? -1 : 1; var s = this.stroke; if (dx >= dy) { if (dx > 0 && s-3 > 0) { var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx; _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1; } else var _s = s; var ad = Math.ceil(s/2); var pr = dy<<1, pru = pr - (dx<<1), p = pr-dx, ox = x; while ((dx--) > 0) { ++x; if (p > 0) { this.drawDiv(ox, y, x-ox+ad, _s); y += yIncr; p += pru; ox = x; } else p += pr; } this.