これは使用されたラスタライズ戦略の結果であり、簡単な修正はありません。
1つの修正は、三角形をストロークすることですが、非常に細いストロークで行います。たとえば、ストロークが0.2pxの場合は次のようになります。
または、グラフィックを2倍にして、実際のコンテンツの下にストロークバージョンをレンダリングすることもできます。
<g id="underlay">
<polygon class="t1" points="10,10 10,390 390,390 10,10" />
<polygon class="t2" points="10,10 390,390 390,10 10,10" />
</g><g id="content">
<polygon class="t1" points="10,10 10,390 390,390 10,10" />
<polygon class="t2" points="10,10 390,390 390,10 10,10" />
</g>
.t1 { fill:rgb(140,90,90); stroke:rgb(140,90,90) }
.t2 { fill:rgb(90,140,90); stroke:rgb(90,140,90) }
#underlay polygon { stroke-width:1px }
#content polygon { stroke:none }
(これは、利用可能なWebブラウザーなどのユーザーエージェントで実行している場合は、JSを介して自動的に実行できます。)
このデモは、問題を非常に明確に示しています。
<svg xmlns="http://www.w3.org/2000/svg">
<g id="aligned">
<polygon class="a" points="10,10 10,100 100,100, 100,10" />
<polygon class="b" points="100,10 100,100 200,100, 200,10" />
</g>
<g id="shifted" transform="translate(0.5,110)">
<polygon class="a" points="10,10 10,100 100,100, 100,10" />
<polygon class="b" points="100,10 100,100 200,100, 200,10" />
</g>
</svg>
ここでは、2つの垂直エッジが正確に重なり合っています。最初のケースでは、それらはピクセルグリッド上に正確に配置されます。左の形状は左のすべてのピクセルを正確に塗りつぶし、右の形状は右のすべてのピクセルを正確に塗りつぶし、どちらもギャップを越えて塗りつぶしません。
ただし、2番目のケースでは、両方の形状がピクセル境界の間にあります。形状がこれらのピクセルと50%重なっているため、この場合、アンチエイリアシングにより、正確に50%の不透明度で重なっているピクセルを塗りつぶす必要があることがわかります。したがって、左側の形状はこの共有列のピクセルを50%不透明で塗りつぶし、右側の形状は共有列をさらに50%不透明なピクセルで塗りつぶします。
残念ながら、不透明度は加算ではなく乗算によって構築されます。rgba(0,0,0,0.5)
のオーバートップのピクセルは、ではなく、をrgba(0,0,0,0.5)
生成rgba(0,0,0,0.75)
しrgba(0,0,0,1)
ます。
これが問題の核心であり、SVGに固有のものではありません。たとえば、次を参照してください。
無限精度のベクター画像を有限ピクセルグリッドにサンプリングすると、情報が失われます。あなたはそれを回避するためにハックする必要があります。