深入學習D3JS d3 path

2021-09-17 02:12:32 字數 1939 閱讀 2423

function drawcircle(context, radius)
使用canvas畫圖你需要上面的**,d3.path可以讓你在svg上使用類似**畫圖。

var context = d3.path();

drawcircle(context, 40);

pathelement.setattribute("d", context.tostring());

原始碼如下,講svg的操作轉化為類似canvas,主要是用到一些向量運算。

var pi = math.pi,

tau = 2 * pi,

epsilon = 1e-6,

tauepsilon = tau - epsilon;

function path()

function path()

path.prototype = path.prototype = ,

closepath: function()

},lineto: function(x, y) ,

quadraticcurveto: function(x1, y1, x, y) ,

beziercurveto: function(x1, y1, x2, y2, x, y) ,

arcto: function(x1, y1, x2, y2, r)

// or, is (x1,y1) coincident with (x0,y0)? do nothing.

else if (!(l01_2 > epsilon));

// or, are (x0,y0), (x1,y1) and (x2,y2) collinear?

// equivalently, is (x1,y1) coincident with (x2,y2)?

// or, is the radius zero? line to (x1,y1).

//判斷兩個向量是否共線?

else if (!(math.abs(y01 * x21 - y21 * x01) > epsilon) || !r)

// otherwise, draw an arc!

else

this._ += "a" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);}},

arc: function(x, y, r, a0, a1, ccw)

// or, is (x0,y0) not coincident with the previous point? line to (x0,y0).

else if (math.abs(this._x1 - x0) > epsilon || math.abs(this._y1 - y0) > epsilon)

// is this arc empty? we』re done.

if (!r) return;

// does the angle go the wrong way? flip the direction.

if (da < 0) da = da % tau + tau;

// is this a complete circle? draw two arcs to complete the circle.

if (da > tauepsilon)

// is this arc non-empty? draw an arc!

else if (da > epsilon)

},rect: function(x, y, w, h) ,

tostring: function()

};export default path;

深入學習D3JS Stacks

stack用來生成多型別可重疊的資料的二維陣列。適用於如下圖表型別 stack生成器不會直接產生形狀,它可以產生位置資訊,然後傳入area生成器或者直接使用。根據輸入的資料生成乙個stack,返回乙個表示每乙個系列的陣列,引數傳播到訪問器。用法如下 var data var stack d3.sta...

FlashCS3值得深入學習

接觸flashcs3是很偶然的事情,為了幫同事製作乙個漂亮的課件,使用了flash動畫技術。簡單的動畫技術,能夠實現的東西還是太過於簡單,很多的內容向乎是ppt的翻版,只不過實現的方法變了,動畫的元素多了,介面和控制都稍好了一點。要想製作好的作品,還是需要更深入的技術。乙個同事要我幫忙製作乙個動態顯...

深入學習STL系列(3) list

list list是一種雙向鍊錶,不同於vector的連續記憶體儲存,它在記憶體中以節點的形式存在,每個節點都存著指向上下節點的指標。下面我們將以儲存int型元素的list為例,仔細講解如何使用list。建立list list int il 方式1,構建乙個空的容器物件 list int ivl 2...