ScottPlot的介绍可以看这篇博客:https://www.cnblogs.com/myshowtime/p/15606399.html
我对代码的理解是这样的:
图像的呈现是靠bitmap,每进行拖动图像,放大缩小,等等操作,都会新创建一张图片,并把这张图片作为最新的展示在界面上。
为了保证图片内存的回收效率,还专门创建了一个队列,这个队列会把旧图片在新图片创建时入队,当对当前图形有改变时并且当队列里的图片个数大于3时,才会出队释放图片内存。
在【Settings】这个类里,主要是存储图像的配置和数据的,比如x y轴, 长宽 ,轴的长度限制,以及一个非常核心的观察模式的集合对象:
ObservableCollection<IPlottable> Plottables
图片所包括的所有显示需要渲染到图片上的对象都实现了IPlottable接口,比如坐标 刻度 插图 x轴y轴线,里面的代码如下:
public interface IPlottable
{
bool IsVisible { get; set; }
void Render(PlotDimensions dims, System.Drawing.Bitmap bmp, bool lowQuality = false); int XAxisIndex { get; set; }
int YAxisIndex { get; set; } /// <summary>
/// Returns items to show in the legend. Most plottables return a single item. in this array will appear in the legend.
/// Plottables which never appear in the legend can return null.
/// </summary>
LegendItem[] GetLegendItems(); /// <summary>
/// Return min and max of the horizontal and vertical data contained in this plottable.
/// Double.NaN is used for axes not containing data.
/// </summary>
/// <returns></returns>
AxisLimits GetAxisLimits(); /// <summary>
/// Throw InvalidOperationException if ciritical variables are null or have incorrect sizes.
/// Deep validation is slower but also checks every value for NaN and Infinity.
/// </summary>
void ValidateData(bool deep = false);
}
其中核心的就是Render方法了,这个在底层调用 bmp参数的gdi,这个bmp参数就是最终显示给用户的图像。所有在 Plottables 里的对象都会渲染到这张图片上面去。【PlotDimensions】 这个对象表示该元素的长宽 位置等信息。
暴露给用户使用的类是【Plot】类,里面有不同样式的 x y 数据类型,有单一的接受y轴数据,而x轴就平均分取。比如:
public SignalPlot AddSignal(double[] ys, double sampleRate = 1, Color? color = null, string label = null)
{
SignalPlot signal = new SignalPlot()
{
Ys = ys,
SampleRate = sampleRate,
Color = color ?? settings.GetNextColor(),
Label = label, // TODO: FIX THIS!!!
MinRenderIndex = 0,
MaxRenderIndex = ys.Length - 1,
};
Add(signal);
return signal;
}

最后在返回之前 ,这个Add(signal)会把这个对象加入到Plottables 集合中去 我们还可以添加很多元素,比如:

// plot the data
formsPlot1.Plot.AddScatter(xs, sin);
formsPlot1.Plot.AddScatter(xs, cos); // customize the axis labels
formsPlot1.Plot.Title("ScottPlot Quickstart");
formsPlot1.Plot.XLabel("Horizontal Axis");
formsPlot1.Plot.YLabel("Vertical Axis");

最后渲染的时候就用这个:formsPlot1.Refresh(); 它会调用Plot的 Render方法,这个方法会去遍历Plottables 这个集合,然后挨个用gdi画到bitmap上面去。 在formsPlot1控件里,有一个非常重要的类:【ControlBackEnd】,这里面有关于对图像 放大 缩小 移动 ,点击 的基本操作方法。 我们自己还可以注册这些事件写额外的代码 也不会影响。

C# ScottPlot 绘图控件 源码阅读心得体会的更多相关文章

  1. 很不错的安卓FadingActionBar控件源码

    这个我刚刚从一个github下载过来的,自己测试一下运行了,感觉还不错的,安卓FadingActionBar控件源码,现在就给大家分享一下,源码我已经上传到源码天堂那里了,想下载的朋友可以去那里下载吧 ...

  2. Android控件源码分析--AndroidResideMenu菜单

    说明 早上看到一篇文章介绍了ResideMenu得使用,这是一个类似SlidingMenu的控件,感觉有点高尚大,反正我之前没见过,本着凑热闹的好奇心,立马clone把玩下,项目地址奉上: https ...

  3. ThinkPhp 源码阅读心得

    php 中header 函数 我可能见多了,只要用来跳转.今天在阅读TP源码的时候发现,header函数有第三个参数.有些困惑所以找到手册查阅下,发现 void header ( string $st ...

  4. breeze源码阅读心得

            在阅读Spark ML源码的过程中,发现很多机器学习中的优化问题,都是直接调用breeze库解决的,因此拿来breeze源码想一探究竟.整体来看,breeze是一个用scala实现的基 ...

  5. mybatis源码阅读心得

    第一天阅读源码及创建时序图.(第一次用prosson画时序图,挺丑..) 1.  调用 SqlSessionFactoryBuilder 对象的 build(inputStream) 方法: 2.   ...

  6. Delphi IP 控件源码

    interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ComCtrls, Co ...

  7. commons-io源码阅读心得

    FileCleanTracker: 开启一个守护线程在后台默默的删除文件. /* * Licensed to the Apache Software Foundation (ASF) under on ...

  8. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  9. 【原】AFNetworking源码阅读(一)

    [原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...

  10. PaintView 绘图控件解析

    博客地址:博客园,版权所有,转载须联系作者. GitHub地址:JustWeTools 最近做了个绘图的控件,实现了一些有趣的功能. 先上效果图: PaintView画图工具: 1.可直接使用设定按钮 ...

随机推荐

  1. 难道AI不知道tnsnames.ora的instance_name配置吗?

    事情是这样,给某客户培训构建hands-on实验环境时,因测试环境有限,在同一环境做了一套ADG环境: 数据库是单实例,版本19.21,使用了多租户选件: 其中一个测试的PDB,名为demo1,其中建 ...

  2. 实例讲解昇腾 CANN YOLOV8 和 YOLOV9 适配

    本文分享自华为云社区<昇腾 CANN YOLOV8 和 YOLOV9 适配>,作者:jackwangcumt. 1 概述 华为昇腾 CANN YOLOV8 推理示例 C++样例 , 是基于 ...

  3. c# webapi 自定义返回数据

    前言 webapi呢,我们创建的时候我给我们5个方法:get get(data)put post delete. 很明显,get,get(data)是用来获取,post用来修改数据的,put,dele ...

  4. windows下redis主从配置

    1,复制两个redis文件夹,粘贴在同级目录下 2,分别修改6380和6381文件夹中的redis.window.conf文件 port:分别改为6380.6381 均增加:slaveof 127.0 ...

  5. Node中的EventEmitter? 如何实现一个EventEmitter?

    一.是什么 我们了解到,Node采用了事件驱动机制,而EventEmitter就是Node实现事件驱动的基础 在EventEmitter的基础上,Node几乎所有的模块都继承了这个类,这些模块拥有了自 ...

  6. 一文详解 Nacos 高可用特性

    简介: 我今天介绍的 Nacos 高可用,是 Nacos 为了提升系统稳定性而采取的一系列手段.Nacos 的高可用不仅仅存在于服务端,同时也存在于客户端,以及一些与可用性相关的功能特性中,这些点组装 ...

  7. 与容器服务 ACK 发行版的深度对话第二弹:如何借助 hybridnet 构建混合云统一网络平面

    简介:本次采访我将继续为大家详细讲解我的好伙伴:阿里巴巴的开源 Kubernetes 容器网络解决方案 hybridnet,以及我是如何借助它来构建混合云统一网络平面. 作者:若禾.昱晟.瑜佳 记者: ...

  8. Serverless 可观测性的过去、现在与未来

    简介: 函数计算可观测性经历了 1.0 -> 2.0 的发展,从闭门造车的可观测发展成开源的可观测,从平台的可观测发展为开发者的可观测,从FaaS Only 的可观测演进成了云原生的可观测. 作 ...

  9. 业内首款云原生技术中台产品云原生 Stack 来了!

    简介: 云原生 Stack 满足了各种典型场景下客户对于线下高集成平台的诉求,让企业数字话转型不受技术约束,专注业务本身,加速企业数字化迭代. 今天,企业数字化转型依然面临很大的挑战,虽然有很多新技术 ...

  10. WPF 通过 GetMessageExtraInfo 方法获取当前收到的鼠标消息是否由触摸转换过来

    本文将告诉大家如何在 WPF 或者其他 Win32 应用里面,在收到鼠标消息时,通过 GetMessageExtraInfo 方法获取当前收到的鼠标消息是否由触摸消息提升而来 大家都知道,在不开启 W ...