如何绘制具有正确衔接效果的多颜色线段?
不同颜色线段衔接处的绘制问题
我用以下代码绘制多条线段:
using (var path = new GraphicsPath()) { foreach (var linesByColor in lines.GroupByAdjacent(x => x.Color)) { path.Reset(); foreach (var lines in linesByColor) { path.AddLine(...); } using (var pen = new Pen(linesByColor.Key)) { g.DrawPath(pen, path); } } }
当前绘制结果(忽略黑色边框):
问题出在红色与绿色路径的衔接处,这是因为它们属于不同路径导致的。我期望的效果是:
有没有简便的实现方法?我想到一种思路是不绘制线段而是绘制形状并处理衔接,但这可能并不容易。
解决方案
方法1:调整Pen的端点样式
在创建Pen时,设置StartCap和EndCap为LineCap.Square(或根据需求选择LineCap.Round),这样线段的端点会延伸至实际端点外半个线宽的位置,不同颜色路径的衔接处会自然重叠,消除间隙:
using (var path = new GraphicsPath()) { foreach (var linesByColor in lines.GroupByAdjacent(x => x.Color)) { path.Reset(); foreach (var line in linesByColor) { path.AddLine(line.StartPoint, line.EndPoint); } using (var pen = new Pen(linesByColor.Key)) { // 设置端点样式,消除衔接间隙 pen.StartCap = LineCap.Square; pen.EndCap = LineCap.Square; g.DrawPath(pen, path); } } }
方法2:使用DrawLines绘制同颜色线段组
对于每组同颜色的线段,提取所有连续的点数组,用DrawLines绘制,它会自动处理同组内线段的衔接,同时配合端点样式设置,确保不同颜色组之间无缝衔接:
foreach (var linesByColor in lines.GroupByAdjacent(x => x.Color)) { // 将同颜色的线段转换为连续点数组 List<PointF> points = new List<PointF>(); points.Add(linesByColor.First().StartPoint); foreach (var line in linesByColor) { points.Add(line.EndPoint); } using (var pen = new Pen(linesByColor.Key)) { pen.StartCap = LineCap.Square; pen.EndCap = LineCap.Square; g.DrawLines(pen, points.ToArray()); } }
补充说明
如果衔接处仍有问题,需要确认相邻颜色的线段组的连接点坐标完全一致(无精度误差)。若存在浮点精度问题,可以对连接点做微小的偏移调整,或者使用Point代替PointF(如果不需要浮点精度)。
内容的提问来源于stack exchange,提问作者tigrou
相关产品推荐
相关产品推荐

