c# 实例——绘制波浪线(附源码)
- 作者: 人生就俩字丶卧槽
- 来源: 51数据库
- 2021-08-19
效果图

界面绘制操作
private point? _startpoint = null;
private void containercanvas_onpreviewmouseleftbuttondown(object sender, mousebuttoneventargs e)
{
var position = e.getposition(containercanvas);
if (_startpoint == null)
{
_startpoint = position;
}
else
{
//删除预览
if (_previewlineelement != null)
{
containercanvas.children.remove(_previewlineelement);
_previewlineelement = null;
_lastmovedpoint = null;
}
//确定结束点,绘制波浪线
var mylineelement = new mylineelement();
mylineelement.drawline((point)_startpoint, position);
containercanvas.children.add(mylineelement);
_startpoint = null;
}
}
private mylineelement _previewlineelement = null;
private point? _lastmovedpoint = null;
/// <summary>
/// 波浪线绘制预览
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void containercanvas_onmousemove(object sender, mouseeventargs e)
{
var position = e.getposition(containercanvas);
if (_startpoint != null && (_lastmovedpoint == null || _lastmovedpoint != null & (position - (point)_lastmovedpoint).length >= 2))
{
_lastmovedpoint = position;
if (_previewlineelement != null)
{
containercanvas.children.remove(_previewlineelement);
}
var mylineelement = new mylineelement();
mylineelement.drawline((point)_startpoint, position);
containercanvas.children.add(mylineelement);
_previewlineelement = mylineelement;
}
}
波浪线控件及绘制
class mylineelement : frameworkelement
{
public mylineelement()
{
_visualshape = new visualcollection(this);
}
internal void drawline(point startpoint, point endpoint)
{
list<point> points = forgepoints(startpoint, endpoint);
drawline(points);
}
private const int separatorpiexl = 4;
private const int abundancepiexl = 3;
private list<point> forgepoints(point startpoint, point endpoint)
{
var points = new list<point>();
var linevector = endpoint - startpoint;
var linedistance = linevector.length;
var lineangle = math.atan2(-(endpoint.y - startpoint.y), endpoint.x - startpoint.x);
points.add(startpoint);
int index = 0;
bool isabundanceupward = true;
while (index * separatorpiexl < linedistance)
{
index++;
//计算出间隔长度(模拟点到起始点)
var separatordistance = index * separatorpiexl;
var abundancepiexl = abundancepiexl;
var distancetostartpoint = math.sqrt(math.pow(separatordistance, 2) + math.pow(abundancepiexl, 2));
//计算出模拟点、起始点,与直线的角度
var separatorangle = math.atan2(abundancepiexl, separatordistance);
separatorangle = isabundanceupward ? separatorangle : -separatorangle;
isabundanceupward = !isabundanceupward;
//得到模拟点的水平角度
var mockpointangle = lineangle + separatorangle;
//计算出模拟点坐标
var verticaldistance = distancetostartpoint * math.sin(mockpointangle);
var horizontaldistance = distancetostartpoint * math.cos(mockpointangle);
var mockpoint = new point(startpoint.x + horizontaldistance, startpoint.y - verticaldistance);
points.add(mockpoint);
}
points.add(endpoint);
return points;
}
private void drawline(list<point> points)
{
_visualshape.clear();
var geometrytest = new streamgeometry();
using (var ctx = geometrytest.open())
{
ctx.beginfigure(points[0], true, false);
if (points.count % 2 == 0)
{
//绘制二阶贝塞尔函数,需要保证为偶数点
ctx.polyquadraticbezierto(points, true, true);
}
else
{
//绘制二阶贝塞尔函数,需要保证为偶数点
points.insert(0, points[0]);
ctx.polyquadraticbezierto(points, true, true);
}
ctx.close();
}
var visual = new drawingvisual();
using (var context = visual.renderopen())
{
context.drawgeometry(fillbrush, strokepen, geometrytest);
}
_visualshape.add(visual);
}
#region 内部方法
[obsolete]
protected override void onrender(drawingcontext drawingcontext)
{
//弃用,改为_visualshape填充实现
//drawingcontext.drawgeometry(fillbrush, strokepen, basegeometry);
}
protected override int visualchildrencount => _visualshape.count;
protected override visual getvisualchild(int index)
{
if (index < 0 || index >= _visualshape.count)
{
throw new argumentoutofrangeexception();
}
return _visualshape[index];
}
#endregion
#region 曲线属性
private readonly visualcollection _visualshape;
protected brush fillbrush { get; set; } = brushes.transparent;
public brush linebrush { get; set; } = brushes.darkseagreen;
protected double borderthickness { get; set; } = 1.0;
private pen _defaultpen = null;
protected pen strokepen
{
get
{
if (_defaultpen == null)
{
_defaultpen = new pen(linebrush, borderthickness);
}
return _defaultpen;
}
set => _defaultpen = value;
}
#endregion
}
github地址:https://github.com/kybs0/wavelinetextdemo
以上就是c# 实例——绘制波浪线(附源码)的详细内容,更多关于c# 绘制波浪线的资料请关注其它相关文章!
推荐阅读
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
热点文章
团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
0
使用 MSBuild.exe 在发布模式下构建 C# 解决方案
0
当我发布 Web 应用程序时,AfterPublish 脚本不运行
0
构建时 T4 转换的产品仅在下一个构建中使用
0
ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
0
新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
0
如何将条件编译符号(DefineConstants)传递给 msbuild
0
MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
0
NuGet 包还原找不到包,没有源
0
使用 C# 6.0 功能运行 TFS 构建
0
