简体   繁体   English

用fabric.js绘制具有二次曲线的双线

[英]Draw double line with quadratic curve with fabric.js

I'm trying to find out if is possibile to draw a double line (like the attached image) with the quadratic curve function included into fabric.js ( http://fabricjs.com/quadratic-curve ). 我试图找出是否有可能用fabric.js( http://fabricjs.com/quadratic-curve )中包含的二次曲线函数绘制一条双线(如所附图像)。 Anybody know if this is possible or already did it? 有人知道这是否可能吗? Thanks 谢谢

Here is the example image: 这是示例图像: 在此处输入图片说明

If you are interested in a visual effect only, check this double render solution. 如果仅对视觉效果感兴趣,请检查此双重渲染解决方案。

 var canvas = this.__canvas = new fabric.Canvas('c'); fabric.Object.prototype.originX = fabric.Object.prototype.originY = 'center'; canvas.on({ 'object:selected': onObjectSelected, 'object:moving': onObjectMoving, 'before:selection:cleared': onBeforeSelectionCleared, 'after:render': rerender }); (function drawQuadratic() { var line = new fabric.Path('M 65 0 Q 100, 100, 200, 0', { fill: '', stroke: 'black', strokeWidth: 6 }); line.path[0][1] = 100; line.path[0][2] = 100; line.path[1][1] = 200; line.path[1][2] = 200; line.path[1][3] = 300; line.path[1][4] = 100; line.selectable = false; canvas.add(line); var p1 = makeCurvePoint(200, 200, null, line, null) p1.name = "p1"; canvas.add(p1); var p0 = makeCurveCircle(100, 100, line, p1, null); p0.name = "p0"; canvas.add(p0); var p2 = makeCurveCircle(300, 100, null, p1, line); p2.name = "p2"; canvas.add(p2); })(); function makeCurveCircle(left, top, line1, line2, line3) { var c = new fabric.Circle({ left: left, top: top, strokeWidth: 5, radius: 12, fill: '#fff', stroke: '#666' }); c.hasBorders = c.hasControls = false; c.line1 = line1; c.line2 = line2; c.line3 = line3; return c; } function makeCurvePoint(left, top, line1, line2, line3) { var c = new fabric.Circle({ left: left, top: top, strokeWidth: 8, radius: 14, fill: '#fff', stroke: '#666' }); c.hasBorders = c.hasControls = false; c.line1 = line1; c.line2 = line2; c.line3 = line3; return c; } function onObjectSelected(e) { var activeObject = e.target; if (activeObject.name == "p0" || activeObject.name == "p2") { activeObject.line2.animate('opacity', '1', { duration: 200, onChange: canvas.renderAll.bind(canvas), }); activeObject.line2.selectable = true; } } function onBeforeSelectionCleared(e) { var activeObject = e.target; if (activeObject.name == "p0" || activeObject.name == "p2") { activeObject.line2.animate('opacity', '0', { duration: 200, onChange: canvas.renderAll.bind(canvas), }); activeObject.line2.selectable = false; } else if (activeObject.name == "p1") { activeObject.animate('opacity', '0', { duration: 200, onChange: canvas.renderAll.bind(canvas), }); activeObject.selectable = false; } } function rerender() { var line = canvas.getObjects()[0]; line.stroke = 'white'; line.strokeWidth = 4; line.render(canvas.contextContainer); line.stroke = 'black'; line.strokeWidth = 6; } function onObjectMoving(e) { if (e.target.name == "p0" || e.target.name == "p2") { var p = e.target; if (p.line1) { p.line1.path[0][1] = p.left; p.line1.path[0][2] = p.top; } else if (p.line3) { p.line3.path[1][3] = p.left; p.line3.path[1][4] = p.top; } } else if (e.target.name == "p1") { var p = e.target; if (p.line2) { p.line2.path[1][1] = p.left; p.line2.path[1][2] = p.top; } } else if (e.target.name == "p0" || e.target.name == "p2") { var p = e.target; p.line1 && p.line1.set({ 'x2': p.left, 'y2': p.top }); p.line2 && p.line2.set({ 'x1': p.left, 'y1': p.top }); p.line3 && p.line3.set({ 'x1': p.left, 'y1': p.top }); p.line4 && p.line4.set({ 'x1': p.left, 'y1': p.top }); } } 
 <script src="https://rawgithub.com/kangax/fabric.js/master/dist/fabric.js"></script> <canvas id='c' width='500' height='500' ></canvas> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM