MFC CRectTracker 类用法详解

      CRectTracker 类并非 Microsoft Foundation Class (MFC) 库中应用很广泛的一个类,一般教科书中很少有提到。在编程中如果需编写选择框绘制以及选择框大小调整、移动等程序时,用CRectTracker 类就会做到事半而功倍。下面详细介绍MFC CRectTracker 类。

MFC CRectTracker 类详解

        CRectTracker 类的构造函数

        CRectTracker 类的构造函数的原型如下:

CRectTracker();

CRectTracker(

LPCRECT lpSrcRect,

UINT nStyle);

参数:

       lpSrcRect 矩形对象的指针

       nStyle CRectTracker 对象的样式, 有一下几种样式:

CRectTracker::solidLine 对矩形边框使用实线。

 CRectTracker::dottedLine 对矩形边框使用虚线。

 CRectTracker::hatchedBorder 对矩形边框使用带阴影的图案。

 CRectTracker::resizeInside 调整位于矩形内的图柄的大小。

 CRectTracker::resizeOutside 调整位于矩形外的图柄的大小。

 CRectTracker::hatchInside 带阴影的图案覆盖整个矩形。

默认构造函数使用来自 lpSrcRect CRectTracker 的值初始化 对象,并将其他大小初始化为

系统默认值。 如果创建对象时没有参数,那么  m_rect 和  m_nStyle 数据成员就不会被初

始化。

        CRectTracker 类的公共方法(公有成员函数)

       CRectTracker 类的公共方法如下:

下面逐一介绍CRectTracker 类的公共方法。

        CRectTracker::AdjustRect

        CRectTracker::AdjustRect是一个虚函数,使用调整大小图柄调整跟踪矩形的大小时由框架调用。其原型如下:

virtual void AdjustRect(

int nHandle,

LPRECT lpRect);

参数:

 nHandl 所用图柄的索引

 lpRect 指向矩形当前大小的指针。(矩形的大小由其高度和宽度决定。)

CRectTracker::Draw

调用此函数以绘制矩形的外部线和内部区域。其原型如下:

void Draw(CDC* pDC) const;

参数: pDC 指向要进行绘制的设备上下文的指针。

       CRectTracker::DrawTrackerRect

      CRectTracker::DrawTrackerRect是一个虚函数,每当跟踪器的位Track 或TrackRubberBand 成员函数内部发生变化时由框架调用。其原型如下:

virtual void DrawTrackerRect(

LPCRECT lpRect,

CWnd* pWndClipTo,

CDC* pDC,

CWnd* pWnd);

       参数:

              lpRect 指向包含要绘制的矩形RECT的指针。

              pWndClipTo 指向用于剪切矩形的窗口的指针。

              pDC 指向要进行绘制的设备上下文的指针。

              pWnd 指向要在其中进行绘制的窗口的指针。

注解:默认实现调用  CDC::DrawFocusRect ,这将绘制一个虚线矩形。重写此函数以在跟踪操作期间提供不同的反馈。

        CRectTracker::GetHandleMask

       CRectTracker::GetHandleMask是一个虚函数,框架调用此成员函数来检索矩形调整大小图柄的掩码。其原型如下:

virtual UINT GetHandleMask() const;

返回值:CRectTracker 项的调整大小图柄的掩码。

一个矩形有 8 个调整大小图柄,编号为 0-7。 每个调整大小图柄由掩码中的一个位表

示;该位的值为 2^ n,其中 n 是调整大小图柄的编号。

重写此成员函数以隐藏或显示指示的调整大小图柄。

        CRectTracker::GetTrueRect

        调用此函数以检索矩形的坐标。其原型如下:

void GetTrueRect(LPRECT lpTrueRect) const;

参数:lpTrueRect 指向将包含CRectTracker 对象的设备坐标的RECT结构的指针。

CRectTracker::HitTest

调用此函数以了解用户是否已抓取一个调整大小图柄。其原型如下:

int HitTest(CPoint point) const;

参数:point 要测试的点,以设备坐标表示。

返回值:返回的值基于枚举类型  CRectTracker::TrackerHit ,可以具有以下值之一:

       CRectTracker::hitNothing -1

       CRectTracker::hitTopLeft 0

       CRectTracker::hitBottomRight 2

       CRectTracker::hitBottomLeft 3

       CRectTracker::hitTop 4

       CRectTracker::hitRight 5

       CRectTracker::hitBottom 6

       CRectTracker::hitLeft 7

       CRectTracker::hitMiddle 8

        CRectTracker::NormalizeHit

        调用此函数以转换可能反转的图柄。其原型如下:

int NormalizeHit(int nHandle) const;

参数:nHandle 用户选择的图柄。

返回值:规范化图柄的索引。

       CRectTracker::OnChangedRect

CRectTracker::OnChangedRect是一个虚函数,每当在调用Track期间跟踪器矩形发生变化时由框架调用。其原型如下:

virtual void OnChangedRect(const CRect& rectOld);

参数: rectOld 包含  CRectTracker 对象的旧设备坐标。

        CRectTracker::SetCursor

        当光标在CRectTracker 对象的区域上时,调用此函数来改变光标的形状。从处理 WM_SETCURSOR 消息(通常为  OnSetCursor )的窗口的函数内部调用此函数。其原型如下:

BOOL SetCursor(CWnd* pWnd,UINT nHitTest) const;

参数:

pWnd 指向当前包含光标的窗口。

       nHitTest 上一命中测试的结果,来自WM_SETCURSOR消息。

返回值:如果上一命中是在跟踪器矩形上,则为非零值;否则为 0。

        CRectTracker::Track

        调用此函数以显示矩形大小的用户界面。其原型如下:

BOOL Track(

CWnd* pWnd,

CPoint point,

BOOL bAllowInvert = FALSE,

CWnd* pWndClipTo = NULL);

参数:

pWnd 包含矩形的窗口对象。

Point 相对于工作区的当前鼠标位置的设备坐标。

bAllowInvert 如果为 TRUE,则可以沿 x 轴或 y 轴反转矩形;否则为 FALSE。

pWndClipTo 绘制操作将剪切到的窗口。 如果为 NULL,pWnd 将用作剪切矩形。

返回值:如果按下 ESC 键,跟踪过程会停止,跟踪器中存储的矩形不会改变,并且返回 0。 如果更改已提交,通过移动鼠标并释放鼠标左键后,会在跟踪器的矩形中记录新的位置和/或大小,并返回非零值。

        CRectTracker::TrackRubberBand

        调用此函数以执行橡皮筋选择。该函数的原型如下:

BOOL TrackRubberBand(

CWnd* pWnd,

CPoint point,

BOOL bAllowInvert = TRUE);

参数:

       pWnd 包含矩形的窗口对象。

       point  相对于工作区的当前鼠标位置的设备坐标。

       bAllowInvert 如果为 TRUE,则可以沿 x 轴或 y 轴反转矩形;否则为 FALSE。

       返回值:如果鼠标已移动且矩形不为空,则为非零值;否则为 0。

        CRectTracker 类的公共数据成员(成员变量)

        CRectTracker 类的公共数据成员(成员变量)如下:

        上面已经详细介绍了CRectTracker类,下面用一个对话框程序来演示CRectTracker类的用法。

CRectTracker类应用示例

        新建一个对话框Project来演示,CRectTracker类的用法。对话框界面如下:

为简化图像处理程序,这里会用到OpenCV,OpenCV的配置如下(这里使用的4.90,用其他低一些的版本也快):

       由于用OpenCV显示图像,显示窗口难以嵌入MFC对话框。 为便于图像显示许为对话框程序添加Mat对象转Cimage对象程序及图像显示程序。

Mat对象转Cimage对象程序的代码如下:

void CRectTrackerTestDlg::MatToCImage(Mat& src, CImage& dst)
{
	if (src.empty() || (src.type() != CV_8UC3 && src.type() != CV_8UC1)) {
		return;
	}
	// 如果CImage对象有附加图像就分离并销毁图像
	if (!dst.IsNull())
		dst.Destroy();

	//创建CImage对象附加图像,需与源图像大小类型一致
	dst.Create(src.cols, src.rows, 8 * src.channels());

	if (src.channels() == 1)
	{
		//将源位图转成八位灰度图时,CImage对象需用到颜色表,需定义一个RGBQUAD数组,并填充该数组
		RGBQUAD* colorTable = new RGBQUAD[256];
		for (int i = 0; i < 256; i++)
		{
			colorTable[i].rgbRed = i;
			colorTable[i].rgbGreen = i;
			colorTable[i].rgbBlue = i;
		}

		//设置颜色表RGB分量值
		dst.SetColorTable(0, 255, colorTable);
	}


	int rows = src.rows;
	int cols = src.cols;
	uchar channels = src.channels();
	//内存中的数据传送,注意这里是逐行传送。
	for (int i = 0; i < rows; i++)
	{
		memcpy(dst.GetPixelAddress(0, i), src.ptr<uchar>(i), cols * channels);
	}
}

图像显示程序的代码如下:

if (mImage.IsNull())
	MessageBox(L"No Image to Display!", L"系统提示", MB_ICONWARNING | MB_OK);
else
{
	CClientDC dc(this);
	mImage.BitBlt(dc.GetSafeHdc(), 0, 0, SRCCOPY);
}

         下面再为对话框按钮添加事件处理程序代码,”打开图像“按钮的事件处理程序的代码如下:

void CRectTrackerTestDlg::OnBnClickedOpen()
{
	mString = "正在进行打开图像操作...";
	mInformation.SetWindowTextW(mString);
	CFileDialog fdlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("All files(*.*)|*.*||"));
	if (fdlg.DoModal() == IDOK)
	{
		m_Path = fdlg.GetPathName();
		m_strEx = fdlg.GetFileExt();
		m_strName = fdlg.GetFileName();

		m_Path.ReleaseBuffer();
		m_strEx.ReleaseBuffer();
		m_strName.ReleaseBuffer();


		m_str = CT2A(m_Path);
		src = imread(m_str);
		dst = src;
		if (src.empty())
		{
			mString.Format(L"打开图像文件%s失败,文件格式不正确或文件已损坏!", m_strName);
			mInformation.SetWindowTextW(mString);
		}
		else
		{

			MatToCImage(dst, mImage);	//send Mat object data to CImage objiect
			//DispalyImage(mImage);		//dispaly image
			Invalidate();
			mString.Format(L"已打开:%s ", m_Path);
			mInformation.SetWindowTextW(mString);
		}
	}
	else
	{

		mString = "已取消打开图像!";
		mInformation.SetWindowTextW(mString);
	}
}

由于打开图像的代码中DisplayImage(mImage)已被屏蔽掉,需在Opaint中添加图像显示代码,如下:

        “缩放图像”按钮的事件处理程序的代码如下:

void CRectTrackerTestDlg::OnBnClickedScaleImage()
{
	UpdateData(1);
	int nWidth, nHeight;
	nWidth = (int)(fscale * dst.cols) / 4 * 4; //fscale为按钮旁边编辑框绑定变量用以设定缩放系数
	nHeight = fscale * dst.rows;
	resize(dst, dst, Size(nWidth, nHeight));
	
	MatToCImage(dst, mImage);	//send Mat object data to CImage objiect
	Invalidate();

	mString.Format(L"缩放操作已完成,现在图像大小是缩放前的 %f 倍", fscale);
	mInformation.SetWindowTextW(mString);
}

        为“选择ROI区域”按钮添加事件处理程序,“选择ROI区域”按钮的事件处理程序代码如下:

void CRectTrackerTestDlg::OnBnClickedSelectRoiArea()
{
	if (bPikFrameEanble)
	{
		bPikFrameEanble = false;
		pickRect = CRect(0, 0, 0, 0);
		pickFrame.m_rect = pickRect;
		Invalidate();
	}
	bDrawPickFrame = true;
}

仅有上面这个事件处理程序,是没法实现选择ROI区域的,首先需声明CRectTracker变量,变量还需初始化,然后在鼠标消息处理程序中添加:选择框绘制、大小调整、移动等相关代码。这里声明的CRectTracker变量及其相关变量如下:

CRectTracker变量初始化的代码如下:

        在OnLButtonDown(UINT nFlags, CPoint point)函数中加入如下代码:

void CRectTrackerTestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	CDC* pDC = GetDC();
	if (bDrawPickFrame)
	{
		bStartDraw = true;
		bDrawPickFrame = false;
	}
	else
	{
		if (bPikFrameEanble)
		{
			pickFrame.Track(this, point);
			//pickFrame.Draw(pDC);
			pickFrame.GetTrueRect(&pickRect);
			Invalidate();
		}
	}
	ReleaseDC(pDC);
	CDialogEx::OnLButtonDown(nFlags, point);
}

      再在OnLButtonUp(UINT nFlags, CPoint point)中加入代码:代码如下:

void CRectTrackerTestDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	CDC* pDC = GetDC();
	if (bStartDraw)
	{
		bStartDraw = false;
		bPikFrameEanble = true;
		pickFrame.TrackRubberBand(this, point);
		pickFrame.Draw(pDC);
		pickFrame.GetTrueRect(&pickRect);
	}
	ReleaseDC(pDC);
	CDialogEx::OnLButtonUp(nFlags, point);
}

到此可以实现选择ROI区域了,试运行程序,结果如下:

点击打开图像按钮,选择图像文件,如下:

点击打开,结果如下:

点击“选取ROI区域”按钮,将鼠标指针移动到图像适当位置,点击鼠标左键(只能一次),然后拖动鼠标,可以看到随着鼠标指针移动有一个变化的矩形,在适当位置再次点击鼠标左键,即绘制出了一个选择框,如下:

将鼠标指针移动到选择矿内,按下鼠标左键(不松),拖动鼠标,即可移动选择框。将鼠标指针移动到选择框的图柄上,按下鼠标左键(不松),拖动鼠标,即可改变选择框的大小。但是目前鼠标的指针不会随着不同的操作变化。

        现在来改善这一不足,添加OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)函数,在OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)函数中加入如下代码:

BOOL CRectTrackerTestDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	if (pWnd == this && pickFrame.SetCursor(this, nHitTest))
	{
		// 如果SetCursor成功设置了光标形状,则返回TRUE  
		return TRUE;
	}
	return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
}

再次试运行,点击“选取ROI区域”按钮,绘制选取框,这时可以看到当鼠标指针移动到选取框内时,鼠标指针变成了4箭头(移动)图标,指针移动到不同的图柄上时,指针图标也会发生改变。

   添加"截取ROI区域"按钮的事件处理程序代码,代码如下:

void CRectTrackerTestDlg::OnBnClickedKeepRoiArea()
{
	dst = dst(Rect(pickRect.left, pickRect.top, pickRect.Width(), pickRect.Height()));
	MatToCImage(dst, mImage);
	bPikFrameEanble = false;
	pickRect = CRect(0, 0, 0, 0);
	pickFrame.m_rect = pickRect;
	mString = "截取ROI区域操作已完成";
	mInformation.SetWindowTextW(mString);
	Invalidate();
}

  添加"保存图像"按钮的事件处理程序代码,代码如下:

void CRectTrackerTestDlg::OnBnClickedSaveImage()
{
	mString = "正在进行图像存储操作...";
	mInformation.SetWindowTextW(mString);
	CString mfilter = _T("图片文件(*.bmp *.png *.jpg *.webp *.tif)|*.bmp;*.png;*jpg,*.webp,*.tif|All Files (*.*)|*.*||");
	CFileDialog fdlg(FALSE, NULL, 0, OFN_OVERWRITEPROMPT, mfilter, NULL);
	if (fdlg.DoModal() == IDOK)
	{
		m_Path = fdlg.GetPathName();
		m_strEx = fdlg.GetFileExt();
		m_strName = fdlg.GetFileName();

		m_Path.ReleaseBuffer();
		m_strEx.ReleaseBuffer();
		m_strName.ReleaseBuffer();
	}
	else
	{
		mString = "图像存储操作已被取消";
		mInformation.SetWindowTextW(mString);
		return;
	}
	if (m_strEx == "BMP" || m_strEx == "bmp" || m_strEx == "dib" || m_strEx == "TIF" || m_strEx == "tif" || m_strEx == "tiff" || m_strEx == "PNG" || m_strEx == "png"
		|| m_strEx == "jpg" || m_strEx == "JPG" || m_strEx == "jpe" || m_strEx == "jpeg" || m_strEx == "jp2" || m_strEx == "webp" || m_strEx == "avif" || m_strEx == "pbm"
		|| m_strEx == "pgm" || m_strEx == "ppm" || m_strEx == "pxm" || m_strEx == "pnm" || m_strEx == "pfm" || m_strEx == "sr" || m_strEx == "ras" || m_strEx == "exr"
		|| m_strEx == "hdr" || m_strEx == "pic")
	{
		m_str = CT2A(m_Path);
		imwrite(m_str, dst);
		mString.Format(L"图像文件已存储到:%s ", m_Path);
		mInformation.SetWindowTextW(mString);
	}
	else if (m_strEx == "")
	{
		m_Path += ".bmp";
		m_str = CT2A(m_Path);
		imwrite(m_str, dst);
		mString.Format(L"图像文件已存储到:%s ", m_Path);
		mInformation.SetWindowTextW(mString);
	}
}

到此,示例程序的代码已完成。试运行,结果如下:

点击“打开图像”按钮,选择打开图像文件:

点击“打开”按钮,打开图像,如下:

在“缩放图像”按钮旁的输入框中输入2.5,然后点击“缩放图像”按钮,结果如下:

点击“选取ROI区域”按钮,将鼠标指针移动到图片适当位置,点击鼠标左键,然后拖动鼠标到适当位置,点击鼠标左键,选取图像中自己感兴趣的区域,如下:

点击“截取ROI区域”按钮,结果如下:

点击“保存图像”按钮,选定路径,输入存储图像名:

点击保存按钮,结果如下:

再点击“打开图像”按钮,选择刚才存储的图片:

点击“打开”按钮,结果如下:

说明存储的图片可以正常打开。本示例程序测试到此结束。本示例程序的源代码已上传到CSDN,如果需要查看细节,可以去下载。下载链接为:https://download.csdn.net/download/billliu66/89541184

如果需要重新编译,因OpenCV的路径及版本不一定一致,一般需要重新配置 OpenCV。本示例程序是基于OpenCv4.90及VS2022编写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/803505.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小熊猫C++与Dev-C++:两款C++开发环境的对比

引言 在C编程的世界中&#xff0c;选择合适的开发环境是至关重要的。今天&#xff0c;我们将对比两款流行的C开发工具&#xff1a;小熊猫C和Dev-C。这两款软件各有特色&#xff0c;适合不同的编程需求和偏好。本文将从多个方面对它们进行详细的比较&#xff0c;帮助开发者做出…

如何追查一个packet在linux 系统哪里丢失

要想追一个包在系统哪里丢失了&#xff0c; 就要了解 一个应用层的包在送出时 要经历那些 检查点 和被丢掉的点。 1. 在传输层&#xff0c;如果是 tcp 包 会有contrack 的 buf 的限制 可能会导致 packets 的丢失。 > 检查办法&#xff1a;查看dmesg日志有报错&#xff1a;k…

输入网址到网页显示的过程

输入网址到网页显示的过程 1. 浏览器解析 URL2. 域名解析解析的流程 3. TCP通过三次握手建立连接4. 生成TCP段&#xff1a;在数据的前面加上 TCP 头部&#xff0c;生成TCP段TCP 头部 5. 生成IP数据报&#xff1a;在TCP段的前面加上 IP包头&#xff0c;生成IP数据报IP包头 6. 在…

【时时三省】tessy 集成测试:小白入门指导手册

目录 1,创建集成测试模块且分析源文件 2,设置测试环境 3,TIE界面设置相关函数 4,SCE界面增加用例 5,编辑数据 6,用例所对应的测试函数序列 7,添加 work task 函数 8,为测试场景添加函数 9,为函数赋值 10,编辑时间序列的数值 11,执行用例 12,其他注意事项…

EXCEL VBA工程密码破解 工作表保护破解

这里写目录标题 破解Excel宏工程加密方法一 新建破解宏文件方法二 修改二进制文件 破解工作表保护引用 破解Excel宏工程加密 如图所示 白料数据处理已工程被加密。 方法一 新建破解宏文件 1 创建一个XLSM文件&#xff0c;查看代码 ALTF11 2 新建一个模块&#xff0c;“插…

35.UART(通用异步收发传输器)-RS232(2)

&#xff08;1&#xff09;RS232接收模块visio框图&#xff1a; &#xff08;2&#xff09;接收模块Verilog代码编写: /* 常见波特率&#xff1a; 4800、9600、14400、115200 在系统时钟为50MHz时&#xff0c;对应计数为&#xff1a; (1/4800) * 10^9 /20 -1 10416 …

基于springboot+vue+uniapp的超市购物系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

云监控(华为) | 实训学习day1(10)

云监控&#xff1a;确保服务器高效运行 在当今的数字化时代&#xff0c;服务器的稳定运行对于任何企业都至关重要。为了确保服务器的 CPU、内存和硬盘等资源的合理运行&#xff0c;云监控成为了一项不可或缺的技术。本文将详细介绍云监控的基本概念、所需软件、配置方法以及如何…

git 操纵分支和标签

我们只需要知道 每一个分支都是独立的进行的&#xff0c;假如 我们在 我们再git 上传代码时候&#xff0c;假如 master主分支 提交到第五次了&#xff0c;但是突然发现 第三次提交的代码有bug&#xff0c;我们可以 新创建一个分支&#xff0c;然后回退到第三次提交之后的代码&a…

NDK R25b 交叉编译FFMpeg4,项目集成,附库下载地址

1.准备工作 文件下载&#xff1a; NDK R25b下载地址&#xff1a;Android NDK历史版本下载网址 - 君*邪 - 博客园 (cnblogs.com) FFmpeg4.4.4 下载地址&#xff1a;https://ffmpeg.org/releases/ffmpeg-4.4.4.tar.xz 环境配置&#xff1a; 本次编译环境是在PC虚拟机中使用U…

算法 —— 快速幂

目录 P1045 [NOIP2003 普及组] 麦森数 P1226 【模板】快速幂 原理I 原理II P1226 代码解析 P1045 代码解析 P1045 [NOIP2003 普及组] 麦森数 本题来自洛谷&#xff1a;P1045 [NOIP2003 普及组] 麦森数&#xff0c;根据题意&#xff0c;我们可以看到本题需要计算最少2的1…

【Git】(基础篇二)—— Git操作

Git操作 在了解git理论知识之后&#xff0c;本文将结合实践操作为你讲解git的底层逻辑 Git的安装和配置 git官网下载&#xff1a;https://git-scm.com/ 下载后安装时除了选择安装地址外&#xff0c;其余都保持默认下一步即可。 安装好后鼠标右键会出现两个新的选项【Open …

【TDA4板端部署】 TIDL 简介

TIDL 用于加速 TI 嵌入式设备上的深度神经网络 (DNN)。 它支持 TI 的最新一代处理器 TI Jacinto7 TDA4 处理器。 TDA4 处理器属于 TI Jacinto7 家族的处理器&#xff0c;基于异构、可扩展的架构开发&#xff0c;此架构包含了 TI 数字信号处理 C7x DSP 和 C66x DSP、Cortex A72、…

本地部署 EVE: Unveiling Encoder-Free Vision-Language Models

本地部署 EVE: Unveiling Encoder-Free Vision-Language Models 0. 引言1. 快速开始2. 运行 Demo 0. 引言 EVE (Encoder-free Vision-language model) 是一种创新的多模态 AI 模型&#xff0c;主要特点是去除了传统视觉语言模型中的视觉编码器。 核心创新 架构创新&#xff…

Matlab进阶绘图第63期—带标记线的三维填充折线图

三维填充折线图是在三维折线图的基础上&#xff0c;对其与XOY平面之间的部分进行颜色填充&#xff0c;从而能够更好地刻画细节变化。 而带标记线的三维填充折线图是在其基础上&#xff0c;添加X相同的一条或多条标记线&#xff0c;以用于进一步讨论分析。 由于Matlab中未收录…

【ARM】使用JasperGold和Cadence IFV科普

#工作记录# 原本希望使用CCI自带的验证脚本来验证修改过后的address map decoder&#xff0c;但是发现需要使用JasperGold或者Cadence家的IFV的工具&#xff0c;我们公司没有&#xff0c;只能搜搜资料做一下科普了解&#xff0c;希望以后能用到吧。这个虽然跟ARM没啥关系不过在…

[HCTF 2018]WarmUp1

进入靶场&#xff0c;检查代码看到有source.php,访问 /source.php 读代码&#xff0c;在参数中传入 file&#xff0c;通过checkFile后&#xff0c;会加载file界面。 再看checkFile&#xff0c; 第一个判断&#xff0c;是非空并且是个字符串&#xff0c;否则返回false 第二个判…

C++基础(二十四):C++的类型转换

C 的类型转换&#xff08;Type Casting&#xff09;用于在不同类型之间转换数据。主要有四种方式&#xff1a;隐式转换由编译器自动完成&#xff1b;C 风格转换使用 (new_type)expression 语法&#xff0c;功能强大但不安全&#xff1b;static_cast 用于相关类型之间的显式转换…

Apple Intelligence将如何重新定义iPhone上的Siri使用方式|TodayAI

经过多年的讨论和批评&#xff0c;苹果&#xff08;Apple&#xff09;终于在今年秋季承诺推出更智能版本的数字助理Siri。此次更新得益于苹果智能&#xff08;Apple Intelligence&#xff09;&#xff0c;这是公司推出的生成式AI产品&#xff0c;并与OpenAI合作开发。 Siri将迎…

FPGA CFGBVS 管脚接法

说明 新设计了1个KU040 FPGA板子&#xff0c;回来之后接上JTAG FPGA不识别。做如下检查&#xff1a; 1、电源测试点均正常&#xff1b; 2、查看贴片是否有漏焊&#xff0c;检查无异常&#xff0c;设计上NC的才NC&#xff1b; 3、反复检查JTAG接线是否异常&#xff0c;贴片是…