円が変形する原因がわかりました。
以前stroke-width
は円の「太さ」「キャップ」を設定していたのですが、大きくなるほど変形していきます。
少なくとも、これらは私の観察です。技術的には、他の何かが原因である可能性もあります。
とにかく、適切なドーナツを得るために、私はこの方法で終わりました:
/**
* Donut circle drawing
*
* @param integer start Percentage to start with
* @param float diameter
* @param float fat How fat should the circle bar be
* @return object
*/
var fatDonutArc = function (start, diameter, fat)
{
var center = diameter / 2;
var outerRadius = center;
var innerRadius = center - fat; // subtract fat
var alpha = 360 / 100 * start;
var a = (90 - alpha) * Math.PI / -180; // -180 starts to draw from 12 o'clock
// calculate outer ring point coordinates
var outerX = center + outerRadius * Math.cos(a);
var outerY = center + outerRadius * Math.sin(a);
// calculate inner ring point coordinates
var innerX = center + innerRadius * Math.cos(a);
var innerY = center + innerRadius * Math.sin(a);
// path cache
var path;
if (start !== 100)
{
path = [
// move to start point of inner ring
[
"M",
center,
center - innerRadius
],
// draw a line to outer ring
[
"L",
center,
center - outerRadius
],
// arc to outer ring end
[
"A",
outerRadius,
outerRadius,
0,
+(alpha > 180),
1,
outerX,
outerY
],
// move to inner ring end
[
"L",
innerX,
innerY
],
// arc to inner ring start
[
"A",
innerRadius,
innerRadius,
0,
+(alpha > 180),
0,
center,
center - innerRadius
]
];
}
else
{
path = [
// move to outer ring start
[
"M",
center,
center - outerRadius
],
// arc around the clock
[
"A",
outerRadius,
outerRadius,
0,
+(alpha > 180),
1,
outerX - .1, // subtract, otherwise the path becomes "reset"
outerY
],
// connect
[
"z"
],
// move to inner circle start
[
"M",
innerX,
innerY
],
// arc around the clock
[
"A",
innerRadius,
innerRadius,
0,
+(alpha > 180),
0,
innerX + .1, // subtract, otherwise the path becomes "reset"
innerY
],
// and connect
[
"z"
]
];
}
return {
path : path
};
};
これは次のマッシュアップです: raphael.js - 円グラフをドーナツ グラフに変換+ http://raphaeljs.com/polar-clock.html
ここでは、実際に動作する例を設定しました: http://jsbin.com/erusos/1
まだ答えの出ていない質問が 1 つあります。Chromeで円を完全に丸めないのは CSS レンダラーですか、それとも SVG ですか?
楽しみ!