Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张小浪
vue项目使用D3js实现3D饼图
提交
e8f06c67
V
vue项目使用D3js实现3D饼图
项目概览
张小浪
/
vue项目使用D3js实现3D饼图
与 Fork 源项目一致
Fork自
inscode / VueJS
通知
2
Star
8
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vue项目使用D3js实现3D饼图
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
e8f06c67
编写于
5月 08, 2023
作者:
6
64584ef1ecd7b40dc29f18f5
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Mon May 8 04:04:00 UTC 2023 inscode
上级
a08fec8c
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
157 addition
and
1 deletion
+157
-1
src/components/Pie3D.vue
src/components/Pie3D.vue
+1
-1
src/utils/pie.js
src/utils/pie.js
+49
-0
src/utils/renderUtils.js
src/utils/renderUtils.js
+107
-0
未找到文件。
src/components/Pie3D.vue
浏览文件 @
e8f06c67
...
@@ -10,7 +10,7 @@ import pie from '../utils/pie'
...
@@ -10,7 +10,7 @@ import pie from '../utils/pie'
import
{
onMounted
,
reactive
}
from
'
vue
'
;
import
{
onMounted
,
reactive
}
from
'
vue
'
;
let
config
=
reactive
({
let
config
=
reactive
({
color
:[
"
#0f7eee
"
,
"
#24Daff
"
,
"
#FFFF80
"
,
"
#caf982
"
,
"
#80DCff
"
]
})
})
//基础数据
//基础数据
const
salesData
=
[
const
salesData
=
[
...
...
src/utils/pie.js
浏览文件 @
e8f06c67
import
*
as
d3
from
'
d3
'
;
import
*
as
d3
from
'
d3
'
;
import
{
pieInner
,
pieTop
,
pieOuter
}
from
'
../utils/renderUtils
'
/**
/**
* 生成3d饼图
* 生成3d饼图
* @param {*} id :id唯一标识
* @param {*} id :id唯一标识
...
@@ -28,5 +29,53 @@ export default function pie(id, width, height, data, x, y, rx, ry, h, config,ir=
...
@@ -28,5 +29,53 @@ export default function pie(id, width, height, data, x, y, rx, ry, h, config,ir=
.
value
((
d
)
=>
{
.
value
((
d
)
=>
{
return
d
.
value
return
d
.
value
})(
data
);
})(
data
);
// 获取上面插入的g
const
slices
=
d3
.
select
(
'
#pie_chart
'
)
.
append
(
'
g
'
)
.
attr
(
'
transform
'
,
'
translate(350,200)
'
)
.
attr
(
'
class
'
,
'
slices
'
)
.
style
(
'
cursor
'
,
'
pointer
'
);
//生成环形内曲面
slices
.
selectAll
(
'
.innerSlice
'
)
.
data
(
dataset
)
.
enter
()
.
append
(
'
path
'
)
.
attr
(
'
class
'
,
'
innerSlice
'
)
.
style
(
'
fill
'
,(
d
,
index
)
=>
{
let
colorIndex
=
index
%
config
.
color
.
length
return
d3
.
hsl
(
config
.
color
[
colorIndex
]).
darker
(
0.7
)
})
.
attr
(
'
d
'
,
d
=>
{
return
pieInner
(
d
,
rx
+
0.5
,
ry
+
0.5
,
h
,
ir
)
});
//上层2D平面
slices
.
selectAll
(
'
.topSlice
'
)
.
data
(
dataset
)
.
enter
()
.
append
(
'
path
'
)
.
transition
()
.
delay
(
0
)
.
duration
(
500
)
.
attrTween
(
'
d
'
,(
d
)
=>
{
//动画效果
let
interpolate
=
d3
.
interpolate
(
d
.
startAngle
,
d
.
endAngle
);
return
function
(
t
){
d
.
endAngle
=
interpolate
(
t
);
return
pieTop
(
d
,
rx
,
ry
,
ir
)
}
})
.
attr
(
'
class
'
,
'
topSlice
'
)
.
style
(
'
fill
'
,(
d
,
index
)
=>
{
let
colorIndex
=
index
%
config
.
color
.
length
return
config
.
color
[
colorIndex
]
})
.
style
(
'
stroke
'
,(
d
,
index
)
=>
{
let
colorIndex
=
index
%
config
.
color
.
length
console
.
log
(
config
.
color
[
colorIndex
],
'
==config.color[colorIndex]
'
)
return
config
.
color
[
colorIndex
]
})
}
}
\ No newline at end of file
src/utils/renderUtils.js
0 → 100644
浏览文件 @
e8f06c67
//生成内曲面
export
function
pieInner
(
d
,
rx
,
ry
,
h
,
ir
){
const
startAngle
=
d
.
startAngle
<
Math
.
PI
?
Math
.
PI
:
d
.
startAngle
;
const
endAngle
=
d
.
endAngle
<
Math
.
PI
?
Math
.
PI
:
d
.
endAngle
;
const
sx
=
ir
*
rx
*
Math
.
cos
(
startAngle
);
const
sy
=
ir
*
ry
*
Math
.
sin
(
startAngle
);
const
ex
=
ir
*
rx
*
Math
.
cos
(
endAngle
);
const
ey
=
ir
*
ry
*
Math
.
sin
(
endAngle
);
const
ret
=
[];
ret
.
push
(
'
M
'
,
sx
,
sy
,
'
A
'
,
ir
*
rx
,
ir
*
ry
,
'
0 0 1
'
,
ex
,
ey
,
'
L
'
,
ex
,
h
+
ey
,
'
A
'
,
ir
*
rx
,
ir
*
ry
,
'
0 0 0
'
,
sx
,
h
+
sy
,
'
z
'
);
return
ret
.
join
(
'
'
);
}
// 生成饼图的顶部
export
function
pieTop
(
d
,
rx
,
ry
,
ir
)
{
if
(
d
.
endAngle
-
d
.
startAngle
===
0
)
{
return
'
M 0 0
'
;
}
const
sx
=
rx
*
Math
.
cos
(
d
.
startAngle
);
const
sy
=
ry
*
Math
.
sin
(
d
.
startAngle
);
const
ex
=
rx
*
Math
.
cos
(
d
.
endAngle
);
const
ey
=
ry
*
Math
.
sin
(
d
.
endAngle
);
const
ret
=
[];
ret
.
push
(
'
M
'
,
sx
,
sy
,
'
A
'
,
rx
,
ry
,
'
0
'
,
d
.
endAngle
-
d
.
startAngle
>
Math
.
PI
?
1
:
0
,
'
1
'
,
ex
,
ey
,
'
L
'
,
ir
*
ex
,
ir
*
ey
);
ret
.
push
(
'
A
'
,
ir
*
rx
,
ir
*
ry
,
'
0
'
,
d
.
endAngle
-
d
.
startAngle
>
Math
.
PI
?
1
:
0
,
'
0
'
,
ir
*
sx
,
ir
*
sy
,
'
z
'
);
return
ret
.
join
(
'
'
);
}
// 外曲面算法
export
function
pieOuter
(
d
,
rx
,
ry
,
h
)
{
const
startAngle
=
d
.
startAngle
>
Math
.
PI
?
Math
.
PI
:
d
.
startAngle
;
const
endAngle
=
d
.
endAngle
>
Math
.
PI
?
Math
.
PI
:
d
.
endAngle
;
const
sx
=
rx
*
Math
.
cos
(
startAngle
);
const
sy
=
ry
*
Math
.
sin
(
startAngle
);
const
ex
=
rx
*
Math
.
cos
(
endAngle
);
const
ey
=
ry
*
Math
.
sin
(
endAngle
);
const
ret
=
[];
ret
.
push
(
'
M
'
,
sx
,
h
+
sy
,
'
A
'
,
rx
,
ry
,
'
0 0 1
'
,
ex
,
h
+
ey
,
'
L
'
,
ex
,
ey
,
'
A
'
,
rx
,
ry
,
'
0 0 0
'
,
sx
,
sy
,
'
z
'
);
return
ret
.
join
(
'
'
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录