有一个任意坐标的等边三角形。
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400">
<polygon fill="none" stroke-width="4" stroke="red" points="200 35.45517328095667,10 364.54482671904333,390 364.54482671904333"></polygon>
</svg>
https://jsfiddle.net/6sybjthL/1/
由于 svg 的特殊性,当改变描边的粗细(stroke-width)时,它同时向内和向外扩展。据我所知,svg 1.1 版没有任何属性可以改变这一点,只有几何和数学会有所帮助。
因此有2个问题:
将笔画粗细改为任意值时,应该使用什么公式重新计算三角形的坐标,以使三角形保持等边,并且在视觉上不会向外扩展(即填充三角形的背景)?
如何计算由于只有内部这样的笔划而完全填充三角形的最大笔划大小?
UPD
下面是我尝试为新的 stroke-width=40 值重新计算坐标的示例。(目标是确保绿色三角形不超过红色三角形)
SVG + 蒙版解决方案
这个想法是这样的:
要在放大时切断字符串的外半部分并且不干扰字符串内半部分的生长
stroke-width,请使用蒙版 SVG形状(任意)被添加到样式被分配给这个形状部分中
defs的蒙版,这将制作一个蒙版,最初将显示具有恒定线宽的原始形状的模板。字符串外半部的多余部分在放大时 会被遮罩的第二个元素截断, 内半部将不受限制地增长。
pathfill="white"stroke="white"stroke-width<rect>面具
第二个图,将使用
stroke-width与图中完全相同的路径进行修改,mask放置在图主体的下方,并对其应用蒙版mask="url(#msk)"。stroke-widthstroke-widthstroke-width为了表明这种修剪字符串外部的技术是通用的,我将添加一个更复杂的元素
在缩放时,还有另一种方法可以避免由于线粗的外半部分增加而导致图形整体尺寸的额外增加
scale(X,Y)SVG 有一个字符串属性vector-effect1="non-scaling-stroke"
此属性可防止 SVG 元素放大或缩小时线宽增加。
换句话说,无论您如何使用
scale()或调整形状的大小viewBox,线条都不会改变其宽度。#一。没有的例子
vector-effect1="non-scaling-stroke"随着图形大小的增加,笔画的粗细也会增加。
单击画布后动画将开始:
#2。使用 vector-effect1="non-scaling-stroke" 的示例
请注意,与第一个示例相比,该图在最终位置中所占的位置略小,因为线条粗细没有增加