当前在做的毕业设计涉及到一些曲线图形的绘制问题,苦于System.Drawing不能使用(平台不支持,这个问题我没有解决掉,这里说的平台可能是UWP平台而不是dotnetcore平台,如果有dalao清楚的话还希望能指点一下)只得换用Win2d.uwp
win2d提供了三种画布:canvasControl,CanvasAnimatedControl,CanvasVirtualControl;这三种当中,CanvasAnimatedControl适合需要频繁触发绘制的操作;有很大的图,一次性加载的话有很多资源会浪费在看不见的部分的情况下,适合使用CanvasVirtualControl;
目前我在做的毕业设计关于列车运行,如果以1m为分辨率,以太原到北京为例,距离长达600km,要绘制的点将达到6*10^5个;
设置断点观察,默认窗口大小下画布的尺寸为644*323,全屏情况下尺寸为1086*355;以默认尺寸计算,如果以一个显示单位为1m,要显示6*10^5个单位,需要至少931页;将近1000页的容量明显会对使用软件造成极大的影响,并且在一页上显示一个闭塞分区也有一定的难度;
这种情况下如果就按一个显示单位1m的话使用CanvasVirtualControl是最理想的,因为在显示一页的时候调用资源把其他999页绘制出来明显是不合理的;但是如果按一个显示单位1m,软件的显示效果就不那么理想,整个软件的显示重点应当是放在列车制动部分上,而列车的紧急制动大致需要两个分区;以目前的固定1500m为一个分区计算,大致需要在644个显示单位上显示3000米的信息,也就是以五米为间隔进行显示,每次显示3220m,这样计算的话,需要大致200页,就能完成太原到北京的线路的模拟,1/200的显示比例仍旧比较高,选择使用CanvasVirtualControl;
目前已经能同过一个函数,将整个输入线路的目标—距离模式曲线存储到一个三维数组中(分辨率1m);数组的第二个值(【】【这个】【】)就是在当前区间内的位置,通过存取数组中的信息构成一个(仅包含位置和速度的)临时temp数组;
绘制思路:
注意:这一条涉及到两个分辨率:计算距离分辨率(计算分辨率)和显示距离分辨率(显示分辨率);前者与显示器没有任何关联,仅仅是用于操作曲线计算的一个参数,用于确定曲线中间隔最小两个点的距离;
1.确定勾选了使用crh3模板,按照crh3模板设定数值依据用户自定义的轨道参数进行距离——模式曲线的计算(注意:这里仅仅是计算,仅仅是计算,并没有在这一步将距离模式曲线的图形绘制出来!!!!)
2.确定显示分辨率:这一步应当添加一个控件供用户选择显示分辨率;
3.按照显示分辨率把曲线绘制出来;绘制步骤:通过
canvasPathBuilder.BeginFigure(x0,y0);
canvasPathBuilder.AddLine(x1,y1);
canvasPathBuilder.EndFigure(CanvasFigureLoop.Open);循环绘制
每次绘制在区间距离上-5;直到区间区里小于等于0,停止绘制
4.图形的显示:CanvasVirtualControl经常和ScrollViewor连用,这样就可以确定显示的部分;关于显示策略,我个人倾向于做成翻页形式的而不是平滑滚动,原因有三,一是做成平滑滚动可能对帧数要求较高,频繁调用绘制方法可能并达不到这个帧数要求;二是平滑滚动对数据变化的观察造成了影响,对用户造成了不必要的负担;三是翻页模式笔记平滑滚动模式实现也更为方便,重新绘制的部分较少,不用擦除已经绘制的部分;
,