2

円グラフのスライスを作成するために使用する2次曲線があります。スライスはxとyの軸にあり、中心点は(0,0)です。半径はradiusXとradiusYで可変です。このスライスは90度移動します。

このスライスを3つの別々のスライス(それぞれ30度の角度)に分割し、親スライスの曲線と一致させる必要があります。

次の画像は、スライスの可能な例を示しています。黒丸はスライスのサイズ/形状を調整します:

ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください

これが私が作った関数ですが、正しく機能していません:

//globalPosX and globalPosY equal whatever position each of the two large black circles have repectively.
    var canvas = document.getElementById('CV_slices');
    var context = canvas.getContext('2d');
    var cenX = canvas.width/2;
    var cenY = canvas.height/2;
    var blackDotX = globalPosX - cenX;
    var blackDotY = cenY - globalPosY;
    var endX;
    var endY;
    var controlX;
    var controlY;
//set first slice
    var startCoOrds = {
        x: cenX  ,
        y: globalPosY  
    };                  

    for (i=1; i < 4; i++) {
//make end(x,y) of previous slice the start(x,y) for the next slice.
    endX = startCoOrds.x - (blackDotX*Math.sin(30));
    endY = startCoOrds.y + (blackDotY*Math.cos(30));
//set position of control point using position of start/end positions (at the moment only adjustibng using +10 -10 at end)
    controlX = ((endX - startCoOrds.x) /2) + (startCoOrds.x) + 10;
    controlY = ((endY - startCoOrds.y) / 2) + (startCoOrds.y) - 10;

// draw slice
    context.save();
    context.beginPath();
    context.moveTo(cenX, cenY);
    context.lineTo(startCoOrds.x, startCoOrds.y);
    context.quadraticCurveTo(controlX, controlY, endX, endY);
    context.lineTo(cenX, cenY);
//make end(x,y) of previous slice the start(x,y) for the next slice
    startCoOrds.x = endX;
    startCoOrds.y = endY;

    context.closePath();
    context.globalAlpha = 0.1;
    context.fillStyle = "#333333";
    context.fill();
    context.lineWidth = 2;
    context.strokeStyle = "#ffffff";
    context.stroke(); 
    context.restore();
    }
4

1 に答える 1

0

最も近い「blackDot」を円の半径として使用し、円を使用して象限を3つに分割し(wikiを参照)、0,0と「blackDot」の間の距離の比率でポイントをスケーリングします

事実上、円弧は x 軸または y 軸でスケーリングされた円の象限です。

于 2012-02-04T21:03:17.477 に答える