作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何以矢量形式绘制如下粗线的轮廓?我所说的矢量形式是指一些不是 Raster 或 Image 的 Graphics 基元集合。
Graphics[{AbsoluteThickness[100], JoinForm["Round"], CapForm["Round"],
Line[{{0, 0}, {0, 1}, {1, 1}}]}, ImageSize -> 200]
Line
轮廓的方法。对象
ImportString[ExportString[Style["M8", FontFamily -> "Times", FontSize -> 72],"PDF"], "TextMode" -> "Outlines"]
Rasterize
在线对象上并从 alpha channel 中减去一个稍小的版本。这会产生光栅化伪影,并且对于
ImageSize->500
来说每个形状 5 秒太慢了。
MorphologicalPerimeter
获得的点拟合样条曲线.
ListCurvePathPlot
理论上是这样,但它打破了像素“楼梯”模式。为了平滑楼梯,需要找到曲线周围点的顺序。
FindCurvePath
看起来很有希望,但返回了 splinter 曲线的列表。
FindShortestTour
理论上也可以这样做,但它在 20x20 像素图像中的轮廓上花了一秒钟。
ConvexHull
在圆形零件上做得很好,但切断了非凸面部分。
FindEulerianCycle
找到形状周围像素的顺序,然后使用
MovingAverage
平滑楼梯,然后是
ListCurvePathPlot
创建样条对象。它并不完美,因为仍然存在“楼梯”模式的残余,而平均太多会平滑重要的角落。更好的方法可能是将形状分解为多个凸形,使用
ConvexHull
,然后重新组合。同时,这是我正在使用的
getSplineOutline[pp_, smoothLen_: 2, interOrder_: 3] := (
(* need to negate before finding perimeter to avoid border *)
perim = MorphologicalPerimeter@ColorNegate@pp;
points =
Cases[ArrayRules@SparseArray@ImageData[perim],
HoldPattern[{a_Integer, b_Integer} -> _] :> {a, b}];
(* raster coordinate system is upside down, flip the points *)
points = {1, -1} (# - {0, m}) & /@ points;
(* make nearest neighbor graph *)
makeEdges[point_] := {Sort[{point, #}]} & /@
Nearest[DeleteCases[points, point], point];
edges = Union[Flatten[makeEdges /@ points, 2]];
graph = Graph[UndirectedEdge @@@ edges];
tour = FindEulerianCycle[graph] // First;
smoothed = MovingAverage[tour[[All, 1]], smoothLen];
g = ListCurvePathPlot[smoothed, InterpolationOrder -> interOrder];
Cases[g, BSplineCurve[___], Infinity] // First
);
scale = 200;
pp = Graphics[{AbsoluteThickness[scale/2], JoinForm["Round"],
CapForm["Round"], Line[{{0, 0}, {0, 1}, {1, 1}}]},
ImageSize -> scale];
Graphics[getSplineOutline[pp, 3, 3]]
最佳答案
很遗憾EdgeForm[]
(如文档中所述)不适用于 Line
对象。所以我们能做的最好的事情就是不使用 Line[]
或使用某种黑客。我能想到的最简单的是
Graphics[{AbsoluteThickness[100], JoinForm["Round"], CapForm["Round"],
Line[{{0, 0}, {0, 1}, {1, 1}}], AbsoluteThickness[99], White,
Line[{{0, 0}, {0, 1}, {1, 1}}]}, ImageSize -> 200]
关于wolfram-mathematica - 提取粗线轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4425582/
在这个 jsfiddle 中有一行的 lineWidth 为 1。 http://jsfiddle.net/mailrox/9bMPD/350/ 例如: ctx.lineWidth = 1; 但是画在
我是一名优秀的程序员,十分优秀!