相邻的svg:多边形边不相交

时间:2013-07-24 05:09:22

标签: svg rendering shape-rendering

我正在使用彼此相邻的多边形绘制条形图,如下所示:

如果仔细观察,每个多边形之间会有空白区域(缩放):

我试图阻止这种情况发生。我找到了SVG shape-rendering属性并将其设置为geometricPrecision。这解决了问题,但给了我非常清晰的边缘:

我也不想要那样。我为shape-rendering尝试了其他可能的值,但没有一个效果很好。 (我在WebKit上试过这些。)我正在寻找解决方案。

对于那些感兴趣的人,jsFiddle图表here

2 个答案:

答案 0 :(得分:7)

真正的问题是你应该将图形渲染为单个多边形而不是每个条形的一个多边形,但我假设你有这样做的原因。

一种可能的解决方案是设置笔触属性,以便绘制多边形的轮廓,使它们略微重叠。您可以在group元素上设置这些属性,以将它们应用于所有封闭的多边形。

<g stroke-width="0.5" stroke="black" stroke-linejoin="round">

Updated jsFiddle link

请注意,这会使图表看起来比应有的大,但我不认为这是一个重大问题。

至于它发生的原因,那是因为多边形的偏移在像素边界上并不完全对齐(至少在大多数情况下)。如果你将svg宽度固定在300px的倍数(从而对齐像素边界上的所有内容),那么间隙就会消失。

考虑一个4x4像素区域,在这里您尝试从(0,0)到(2.5,2.5)渲染一个正方形,如下所示:

enter image description here

你可以用纯黑色绘制从(0,0)到(1,1)的像素,但是你如何处理边缘 - 它们既不是完全黑色也不是完全白色。抗锯齿解决方案是使用与覆盖多少像素成比例的灰色阴影。

enter image description here

但是当你尝试在第一个旁边渲染另一个多边形时(即从2.5的偏移开始),你将会遇到左手边缘抗锯齿的相同问题。由于背景为灰色而不是白色,因此这次只会稍微变暗。

enter image description here

如您所见,您可以通过设置不同的 shape-rendering 选项来禁用此效果,但是您会失去斜线上消除锯齿的好处,使这些边看起来呈锯齿状。

答案 1 :(得分:0)

我找到了解决此问题的明确而优雅的解决方案。 将多个多边形转换为具有多个线段的路径:

<script src="http://d3js.org/d3.v3.min.js"></script>
<svg width="100%" height="30%" viewBox="0 0 100 100" preserveAspectRatio="none">
        <path d="M0,100 0,70 3.3333333333333335,66 3.3333333333333335,100 M3.3333333333333335,100 3.3333333333333335,66 6.666666666666667,66 6.666666666666667,100 M6.666666666666667,100 6.666666666666667,66 10,62 10,100 M10,100 10,62 13.333333333333334,57.99999999999999 13.333333333333334,100 M13.333333333333334,100 13.333333333333334,57.99999999999999 16.666666666666664,56 16.666666666666664,100 M16.666666666666664,100 16.666666666666664,56 20,54 20,100 M20,100 20,54 23.333333333333332,40 23.333333333333332,100 M23.333333333333332,100 23.333333333333332,40 26.666666666666668,24 26.666666666666668,100 M26.666666666666668,100 26.666666666666668,24 30,15.999999999999998 30,100 M30,100 30,15.999999999999998 33.33333333333333,13.999999999999996 33.33333333333333,100 M33.33333333333333,100 33.33333333333333,13.999999999999996 36.666666666666664,11.999999999999996 36.666666666666664,100 M36.666666666666664,100 36.666666666666664,11.999999999999996 40,10.000000000000004 40,100 M40,100 40,10.000000000000004 43.333333333333336,10.000000000000004 43.333333333333336,100 M43.333333333333336,100 43.333333333333336,10.000000000000004 46.666666666666664,8.000000000000004 46.666666666666664,100 M46.666666666666664,100 46.666666666666664,8.000000000000004 50,8.000000000000004 50,100 M50,100 50,8.000000000000004 53.333333333333336,6.000000000000002 53.333333333333336,100 M53.333333333333336,100 53.333333333333336,6.000000000000002 56.666666666666664,6.000000000000002 56.666666666666664,100 M56.666666666666664,100 56.666666666666664,6.000000000000002 60,8.000000000000004 60,100 M60,100 60,8.000000000000004 63.33333333333333,10.000000000000004 63.33333333333333,100 M63.33333333333333,100 63.33333333333333,10.000000000000004 66.66666666666666,8.000000000000004 66.66666666666666,100 M66.66666666666666,100 66.66666666666666,8.000000000000004 70,11.999999999999996 70,100 M70,100 70,11.999999999999996 73.33333333333333,13.999999999999996 73.33333333333333,100 M73.33333333333333,100 73.33333333333333,13.999999999999996 76.66666666666667,11.999999999999996 76.66666666666667,100 M76.66666666666667,100 76.66666666666667,11.999999999999996 80,10.000000000000004 80,100 M80,100 80,10.000000000000004 83.33333333333334,11.999999999999996 83.33333333333334,100 M83.33333333333334,100 83.33333333333334,11.999999999999996 86.66666666666667,13.999999999999996 86.66666666666667,100 M86.66666666666667,100 86.66666666666667,13.999999999999996 90,11.999999999999996 90,100 M90,100 90,11.999999999999996 93.33333333333333,4.000000000000002 93.33333333333333,100 M93.33333333333333,100 93.33333333333333,4.000000000000002 96.66666666666667,0 96.66666666666667,100 M96.66666666666667,100 96.66666666666667,0 100,0 100,100 M100,100 100,0 100,0 100,100"/>
</svg>

http://jsfiddle.net/313xc6bg/

但是,如果您想对每个细分应用不同的效果,它将无法正常工作。在这种情况下,我认为解决方法是添加足够宽的笔划以覆盖白色空间,同时保持AA。

另外,对于不同多边形中的点的顺序,我仍然遇到Safari(仅限)的问题。改变顺序(即顺时针到逆时针)修复了问题。