在拉斐尔绘制一个填充180度弧线

时间:2012-10-10 21:11:39

标签: svg raphael

我刚刚开始玩SVG和Raphael.js,我正在尝试绘制一个完整的弧线,但不知道如何开始。我正在尝试绘制一个基本的挂锁,并使主体和螺栓的两个部分适合顶部的弧形。它基本上是一个180度弧,10像素宽。我猜我需要使用.path()但不确定语法或者我是否想要使用“curveTo”或“arc” - 努力找到任何好的SVG或Raphael教程网站,说实话。

var padlockBody = paper.rect(100, 100, 100, 100, 5);
padlockBody.attr("fill", "#000000");

var leftBoltPart = paper.rect(120, 70, 10, 30);
leftBoltPart.attr("fill", "#000000");

var rightBoltPart = paper.rect(170, 70, 10, 30);
rightBoltPart.attr("fill", "#000000");

// TODO: filled arc to fit on top of left/right bolt parts

1 个答案:

答案 0 :(得分:4)

手工编写电弧是众所周知的挑战(在纯SVG或拉斐尔,它是相同的)。

我通常会使用这些方法扩展Raphael(积分属于the55

// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands
Raphael.fn.arc = function(startX, startY, endX, endY, radius1, radius2, angle) {
  var arcSVG = [radius1, radius2, angle, 0, 1, endX, endY].join(' ');
  return this.path('M'+startX+' '+startY + " a " + arcSVG);
};

Raphael.fn.circularArc = function(centerX, centerY, radius, startAngle, endAngle) {
  var startX = centerX+radius*Math.cos(startAngle*Math.PI/180); 
  var startY = centerY+radius*Math.sin(startAngle*Math.PI/180);
  var endX = centerX+radius*Math.cos(endAngle*Math.PI/180); 
  var endY = centerY+radius*Math.sin(endAngle*Math.PI/180);
  return this.arc(startX, startY, endX-startX, endY-startY, radius, radius, 0);
};

您可以在此处找到演示:http://jsfiddle.net/cahT9/