使 SVG 路径像一条平滑的线而不是参差不齐
Making a SVG path like a smooth line instead of being ragged
在我的项目中,我从 路径 创建了 河流线 。由于我的 大笔画宽度 它非常 参差不齐 :
我已经搜索过了。但我唯一找到的是 stroke-linejoin: round;
。正如你在这里看到的:
好多了,但我还是不满意。
有什么办法可以得到真正流畅的线条。或者假设也有一个偶数 "rounder" linejoin?
如果您不满意stroke-linejoin:round
您可以考虑创建 path outline ,
但如果您尝试使用 cubic beziers 来平滑您的路径,也许会更容易。
如果你对它的外观不满意,那么在我看来问题是你的河流定义的点太少了。
您用来平滑路径的任何技术(例如曲线拟合算法)都可能导致您的河流表示比您现在拥有的更不准确。
一个有趣的方向是利用 d3.svg.line 从您的 geoJSON 功能的坐标生成路径,此时您将能够使用 D3 的插值方法。
参见 D3js-Topojson : how to move from pixelized to Bézier curves? and Geodata to d3.svg.line interpolation by E. Meeks, and 。
编辑:有一个minimal stand alone case study for line smoothing that you can fork via its associated gist's git repository. The idea of d3.svg.line together with interpolations of y
coordinates for lines smoothing is from E.Meeks. E. Meeks explains his approach here。
Edit2 & solution: Í突然想起topojson是在哪里动态转换成geojson的。执行以下操作,您可以使用 topojson 文件并最终获得贝塞尔曲线,并使用您选择的外推法。以下将起作用:
d3.json("./world-110m.json", function(data){
console.log(data)
var geojson = topojson.feature(data, data.objects.countries);
var newJson = newgeoson(geojson);
console.log(JSON.stringify(newJson))
d3.select("body").append("svg").attr("id","world")
.selectAll("path")
.data(newJson)
.enter()
.append("path")
.style("stroke-width", 1)
.style("stroke", "black")
.style("fill-opacity", .5)
.attr("d", d3.svg.line()
.x(function(d){ return d[0] })
.y(function(d){ return d[1] }).interpolate("cardinal"))
.style("fill", "#7fc97f");
})
现场演示:Minimal d3js line smoothing, topojson version
在我的项目中,我从 路径 创建了 河流线 。由于我的 大笔画宽度 它非常 参差不齐 :
我已经搜索过了。但我唯一找到的是 stroke-linejoin: round;
。正如你在这里看到的:
好多了,但我还是不满意。
有什么办法可以得到真正流畅的线条。或者假设也有一个偶数 "rounder" linejoin?
如果您不满意stroke-linejoin:round
您可以考虑创建 path outline ,
但如果您尝试使用 cubic beziers 来平滑您的路径,也许会更容易。
如果你对它的外观不满意,那么在我看来问题是你的河流定义的点太少了。
您用来平滑路径的任何技术(例如曲线拟合算法)都可能导致您的河流表示比您现在拥有的更不准确。
一个有趣的方向是利用 d3.svg.line 从您的 geoJSON 功能的坐标生成路径,此时您将能够使用 D3 的插值方法。
参见 D3js-Topojson : how to move from pixelized to Bézier curves? and Geodata to d3.svg.line interpolation by E. Meeks, and
编辑:有一个minimal stand alone case study for line smoothing that you can fork via its associated gist's git repository. The idea of d3.svg.line together with interpolations of y
coordinates for lines smoothing is from E.Meeks. E. Meeks explains his approach here。
Edit2 & solution: Í突然想起topojson是在哪里动态转换成geojson的。执行以下操作,您可以使用 topojson 文件并最终获得贝塞尔曲线,并使用您选择的外推法。以下将起作用:
d3.json("./world-110m.json", function(data){
console.log(data)
var geojson = topojson.feature(data, data.objects.countries);
var newJson = newgeoson(geojson);
console.log(JSON.stringify(newJson))
d3.select("body").append("svg").attr("id","world")
.selectAll("path")
.data(newJson)
.enter()
.append("path")
.style("stroke-width", 1)
.style("stroke", "black")
.style("fill-opacity", .5)
.attr("d", d3.svg.line()
.x(function(d){ return d[0] })
.y(function(d){ return d[1] }).interpolate("cardinal"))
.style("fill", "#7fc97f");
})
现场演示:Minimal d3js line smoothing, topojson version