和绘图效率的一个重要相关因素是绘图引擎。Windows环境下二维绘图引擎有多种选择:GDI、GDI+、DirectDraw、QT、Agg、Cairo、skia、Direct2D、Direct3D、OpenGL等

使用 CDC 绘图

添加一个 Picture Control 设置 Notify 属性为 True

class My_Draw : public CStatic 
{

}

使用自定义控件

创建一个自定义控件,然后绑定一个 Wnd 子类,在子类里面绘图

填充背景

RECT rcClient;
GetClientRect(&rcClient);
// 填充客户区颜色
dc.FillSolidRect(&rcClient, RGB(0x99,0x99,0x99));

绘制矩形

矩形框,内部不填充

m_memDC.FrameRect(&m_rc_measure, m_spBrushWhite.get());

绘制多个点连线

if (FALSE == m_memDC.PolylineTo(&it.pt[0], it.pt.size()))
{
ASSERT(FALSE);
}

脏矩形

就是每次画面的刷新只更新需要更新的那一块区域

实际上,在OnDraw(CDC *pDC)中绘制的图并不是所有都显示了的,例如:你 在OnDraw中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很有可能只有一个显示了,这是因为MFC本身为了提高重绘的效率设置了裁剪区。裁剪区的作用就是:只有在这个区内的绘图过程才会真正有效,在区外的是无效的,即使在区外执行了绘图函数也是不会显示的。因为多数情况下窗口重绘的产生大多是因为窗口部分被遮挡或者窗口有滚动发生,改变的区域并不是整个图形而只有一小部分,这一部分需要改变的就是pDC中的裁剪区了。因为显示(往内存或者显存都叫显示)比绘图过程的计算要费时得多,有了裁剪区后显示的就只是应该显示的部分,大大提高了显示效率。但是这个裁剪区是MFC设置的,它已经为我们提高了显示效率,在进行复杂图形的绘制时如何进一步提高效率呢?那就只有去掉在裁剪区外的绘图过程了。可以先用pDC->GetClipBox()得到裁剪区,然后在绘图时判断你的图形是否在这个区内,如果在就画,不在就不画。 如果你的绘图过程不复杂,这样做可能对你的绘图效率不会有提高。

invalidaterect()
想产生“区域无效”的系统消息的话,可以用GDI的,InvalidateRect或者ValidateRgn

闪烁问题

当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint进行重绘,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。

当窗口中有控件时,需要把窗口对话框属性Clip Children设置为True,这样在重绘父窗口时就不会刷新子控件的背景,否则界面重绘时控件由于重绘还是会发生闪烁。

然后重载窗口的OnEraseBkgnd()函数,使背景刷变成透明的,实现代码如下:

BOOL OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}

设置颜色

// 设置文字背景色
SetBkColor(hdc, RGB(0,0,0));
// 设置文字颜色
SetTextColor(hdc, RGB(255,255,255));

文本背景透明

SetBkMode(m_memDC, TRANSPARENT);

输出文本

// 居中显示
pDC->SetTextAlign( TA_BASELINE | TA_CENTER );
pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() );

获取坐标值

POINT point;
// 获取鼠标指针位置(屏幕坐标)
GetCursorPos(&point);
// 将鼠标指针位置转换为窗口坐标
this->ScreenToClient(&point);

判断点是否在矩形内

if (PtInRect(&rc, itData.pt[i]));
{
//测试框内的数据

}

和绘图效率的一个重要相关因素是绘图引擎。Windows环境下二维绘图引擎有多种选择:GDI、GDI+、DirectDraw、QT、Agg、Cairo、skia、Direct2D、Direct3D、OpenGL等

使用 CDC 绘图

添加一个 Picture Control 设置 Notify 属性为 True

class My_Draw : public CStatic 
{

}

使用自定义控件

创建一个自定义控件,然后绑定一个 Wnd 子类,在子类里面绘图

填充背景

RECT rcClient;
GetClientRect(&rcClient);
// 填充客户区颜色
dc.FillSolidRect(&rcClient, RGB(0x99,0x99,0x99));

绘制矩形

矩形框,内部不填充

m_memDC.FrameRect(&m_rc_measure, m_spBrushWhite.get());

绘制多个点连线

if (FALSE == m_memDC.PolylineTo(&it.pt[0], it.pt.size()))
{
ASSERT(FALSE);
}

脏矩形

就是每次画面的刷新只更新需要更新的那一块区域

实际上,在OnDraw(CDC *pDC)中绘制的图并不是所有都显示了的,例如:你 在OnDraw中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很有可能只有一个显示了,这是因为MFC本身为了提高重绘的效率设置了裁剪区。裁剪区的作用就是:只有在这个区内的绘图过程才会真正有效,在区外的是无效的,即使在区外执行了绘图函数也是不会显示的。因为多数情况下窗口重绘的产生大多是因为窗口部分被遮挡或者窗口有滚动发生,改变的区域并不是整个图形而只有一小部分,这一部分需要改变的就是pDC中的裁剪区了。因为显示(往内存或者显存都叫显示)比绘图过程的计算要费时得多,有了裁剪区后显示的就只是应该显示的部分,大大提高了显示效率。但是这个裁剪区是MFC设置的,它已经为我们提高了显示效率,在进行复杂图形的绘制时如何进一步提高效率呢?那就只有去掉在裁剪区外的绘图过程了。可以先用pDC->GetClipBox()得到裁剪区,然后在绘图时判断你的图形是否在这个区内,如果在就画,不在就不画。 如果你的绘图过程不复杂,这样做可能对你的绘图效率不会有提高。

invalidaterect()
想产生“区域无效”的系统消息的话,可以用GDI的,InvalidateRect或者ValidateRgn

闪烁问题

当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint进行重绘,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。

当窗口中有控件时,需要把窗口对话框属性Clip Children设置为True,这样在重绘父窗口时就不会刷新子控件的背景,否则界面重绘时控件由于重绘还是会发生闪烁。

然后重载窗口的OnEraseBkgnd()函数,使背景刷变成透明的,实现代码如下:

BOOL OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}

设置颜色

// 设置文字背景色
SetBkColor(hdc, RGB(0,0,0));
// 设置文字颜色
SetTextColor(hdc, RGB(255,255,255));

文本背景透明

SetBkMode(m_memDC, TRANSPARENT);

输出文本

// 居中显示
pDC->SetTextAlign( TA_BASELINE | TA_CENTER );
pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() );

获取坐标值

POINT point;
// 获取鼠标指针位置(屏幕坐标)
GetCursorPos(&point);
// 将鼠标指针位置转换为窗口坐标
this->ScreenToClient(&point);

判断点是否在矩形内

if (PtInRect(&rc, itData.pt[i]));
{
//测试框内的数据

}

pyinstaller

doc

pip install pyinstaller
pyinstaller yourprogram.py
Pyinstaller.exe –F -i path/youricon.ico path/yourscript.py
-i 参数指定exe图标,-F参数将脚本打包成单一的exe文件
-n 为生成的exe起个名字

需要 upx 在目录下面,就能生成一个独立的 exe 了
Pyinstaller.exe –F path/yourscript.py

nuitka

website

python 3.5之后,PEP485提案中给出了解决方案。
math.isclose(val, rval, rel_tol=1e-10)

numpy是C实现的

blas+lapack、intel MKL、OpenBlas、ATLAS

numpy底层使用BLAS做向量,矩阵运算

NumPy doesn’t depend on any other Python packages, however, it does depend on an accelerated linear algebra library - typically Intel MKL or OpenBLAS.

blas vs openblas

下面安装的是 openblas,这个大小要比 blas 小很多。不过速度可能会慢些

conda install -c conda-forge numpy
阅读全文 »

归一化和标准化的本质都是缩放和平移,他们的区别直观的说就是归一化的缩放是 “拍扁” 统一到区间(0-1),而标准化的缩放是更加 “弹性” 和 “动态” 的,和整体样本的分布有很大的关系。
从输出范围角度来看, 归一化的输出结果必须在 0-1 间。而标准化的输出范围不受限制,通常情况下比归一化更广。

20200302_094105.png

线性函数归一化(Min-Max scaling)

线性函数将原始数据线性化的方法转换到[0 1]的范围,归一化公式如下:

20200302_093804.png

该方法实现对原始数据的等比例缩放,其中Xnorm为归一化后的数据,X为原始数据,Xmax、Xmin分别为原始数据集的最大值和最小值。

归一化

from sklearn import preprocessing
from sklearn.preprocessing import MinMaxScaler

scaler_mm = MinMaxScaler(feature_range=(0, 1)) # 自动将dtype转换成float64

# 需要二维数组,不改变数值
angle_standard = angle_standard.reshape(-1, 1)
value_standard = value_standard.reshape(-1, 1)

angle_standard_scale = scaler_mm.fit_transform(angle_standard)
value_standard_scale = scaler_mm.fit_transform(value_standard)

0均值标准化(Z-score standardization)

叫 z-score 标准化(也就是统计学中的标准分,或者叫Z分)
0均值归一化方法将原始数据集归一化为均值为0、方差1的数据集,归一化公式如下:
(输入数据-均值)/标准差

20200302_093837.png

其中,μ、σ分别为原始数据集的均值和方法。该种归一化方式要求原始数据的分布可以近似为高斯分布,否则归一化的效果会变得很糟糕。

  1. 标准化是通过特征的平均值和标准差,将特征缩放成一个标准的正态分布,缩放后均值为0,方差为1。但即使数据不服从正态分布,也可以用此法。特别适用于数据的最大值和最小值未知,或存在孤立点。
  2. 标准化是为了方便数据的下一步处理,而进行的数据缩放等变换,不同于归一化,并不是为了方便与其他数据一同处理或比较。

方法的选择

  1. 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。
  2. 在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。
  3. 如果对输出结果范围有要求,用归一化。
  4. 如果数据较为稳定,不存在极端的最大最小值,用归一化。
  5. 如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。
  6. 符合正态分布的使用标准化

总结来说,在算法、后续计算中涉及距离度量(聚类分析)或者协方差分析(PCA、LDA等)的,同时数据分布可以近似为正态分布,应当使用0均值的归一化方法。其他应用中更具需要选用合适的归一化方法。

应用资源

配置文件里面设置 server.context-path=/crud 时使用 th:href 会自动添加前缀

<link rel="stylesheet" th:href="@{/webjars/font-awesome/4.7.0/css/font-awesome.min.css}">
<script th:src="@{/webjars/jquery/3.4.1/jquery.min.js}" src="webjars/jquery/3.4.1/jquery.min.js"></script>

模态对话框

使用 bootstrap 实现

<a href="#" class="nav-link" id="_m_logout" data-toggle="modal" data-target="#sign-out"><i class="fa fa-sign-out text-danger fa-lg"></i> </a>

<!-- modal -->
<div class="modal" id="sign-out">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Sign out</h4>
<button type="button" class="close" data-dismiss="modal">
&times;
</button>
</div>
<div class="modal-body">
Press the button
</div>
<div class="modal-footer">
<button type="button" class="btn btn-success" data-dismiss="modal">Leave</button>
<button type="button" class="btn btn-danger" data-dismiss="modal">Cancel</button>
</div>
</div>
</div>
</div>
<!-- end of modal -->

反函数库

website

inv_fun_standard = inversefunc(fun_standard)