gpt4 book ai didi

javascript - 如何正确地将颜色渐变应用于圆弧?

转载 作者:行者123 更新时间:2023-11-29 23:16:08 25 4
gpt4 key购买 nike

我正在构建一个看起来像这样的视觉效果:enter image description here .

到目前为止,我已经设法创建了这个:enter image description here

我的想法是将一个值映射到一个 Angular ,以便我知道将箭头指向何处,然后我将箭头着色为与其指向的圆弧上的点相同的颜色。

我基本上有两个问题:

首先,我该怎么做才能使颜色排列得更好。我使用了这样的线性渐变:

 let defs = this.gaugeEl
.append("defs")
.classed("definitions",true);
let gradient = defs
.append("linearGradient")
.classed("linearGradient",true);

gradient
.attr({
id: 'gradient',
x1: '0%',
y1: '0%',
x2: '100%',
y2: '100%',
spreadMethod: "pad"
});

gradient
.append("stop")
.classed('start',true)
.attr({
offset: '0%',
'stop-color': 'lawngreen',
'stop-opacity': 1
});

gradient.append("stop")
.classed('end',true)
.attr({
offset: '100%',
'stop-color': 'red',
'stop-opacity': 1
});

效果不是我想要的,怎么办?

下一个关于渐变如何工作的问题,我需要能够将 Angular 与颜色相关联,以便我可以正确地为箭头和刻度线着色,但在我当前的设置中我不知道该怎么做.有可能吗?

最佳答案

我不知道这对您有多大用处。但是我遵循了下面的实现

  1. 将圆弧分割成小圆弧
  2. 使用 scaleLinear 关联颜色和 Angular ,并将圆弧分成四段

忽略糟糕的数学和代码!

<!DOCTYPE html>
<meta charset="utf-8">
<style>

#chart {
width: 960px;
height: 350px;
}

</style>

<body>

<svg id="chart">
</svg>



<script src="http://d3js.org/d3.v5.min.js"></script>

<script>
var vis = d3.select("#chart").append("g")
var pi = Math.PI;

var line = d3.line()
.x(function (d) { return d.x; })
.y(function (d) { return d.y; });

var lines = []



var breakPoints = 100;
var angleArr = [];
var arcArr = [];

//angleArr[0] = -pi/2;

var colorScale = d3.scaleLinear()
.domain([-pi/2, -pi/3,30*pi/180,pi/2])
.range(['lightgreen', 'lightgreen', 'yellow','red']);


var angleScale = d3.scaleLinear()
.range([-pi/2,pi/2])
.domain([0,breakPoints - 1]);


var prevAngle = -pi/2;
for(var i = 0; i < breakPoints; i++) {
angleArr[i] = angleScale(i);
var singleArrow = [{"x":(150*Math.sin(angleArr[i])), "y":-(150*Math.cos(angleArr[i]))},{ "y":-(170*Math.cos(angleArr[i])), "x":(170*Math.sin(angleArr[i]))}];
//var subArc = {"start": prev, "end":0};
var subArc = {};
lines.push(singleArrow);
subArc["start"] = prevAngle;
subArc["end"] = angleArr[i];
prevAngle = angleArr[i];
arcArr.push(subArc);
}


var arc = d3.arc()
.innerRadius(160)
.outerRadius(170)
.startAngle(-(pi/2)) //converting from degs to radians
.endAngle(pi/2) //just radians

vis.attr("width", "400").attr("height", "400") // Added height and width so arc is visible
.append("g")
.attr("transform", "translate(200,200)");

vis.selectAll("line")
.data(lines)
.enter()
.append("path").attr("class","arrow").attr("d", line).attr("stroke",function(d,i) {
return colorScale(angleArr[i])}).attr("transform", "translate(200,200)");

vis.selectAll("arcs")
.data(arcArr)
.enter()
.append("path").attr("class","arc").attr("d", function(d,i) {
return d3.arc()
.innerRadius(160)
.outerRadius(170)
.startAngle(d.end)
.endAngle(d.start)()}).attr("fill",function(d,i) {
return colorScale(angleArr[i])}).attr("transform", "translate(200,200)");

</script>

</body>

关于javascript - 如何正确地将颜色渐变应用于圆弧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52722200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com