⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawminutia.cpp

📁 北京航空航天大学指纹识别系统源码
💻 CPP
字号:
#include "stdafx.h"
#include "drawminutia.h"
#include "windowsx.h"
#include "math.h"



	COLORREF MinutiaColor1,MinutiaColor2,MinutiaColor3;
	COLORREF MinutiaDirection1,MinutiaDirection2,MinutiaDirection3;
	COLORREF MainCenterColor,MainCenterDirection;
	COLORREF AidCenterColor,AidCenterDirection;
	COLORREF LeftDeltaColor,LeftDeltaDirection;
	COLORREF RightDeltaColor,RightDeltaDirection;


short MinutiaRadius = 2,MinutiaLen = 5,CenterDeltaRadius = 5,CenterDeltaLen = 7;

void DrawMinutia(		
		HWND		hWnd,			//父窗口句柄
		CDC			*pDC,			//父窗口DC
		short		x,				//图象的位置(相对于父窗口的左上角)
		short		y,
		short		ShowWidth,		//显示的宽度
		short		ShowHeight,		//显示的高度
		unsigned char *lpImage,		//256灰度的图象数据
		short		ImageWidth,		//图象的实际宽度
		short		ImageHeight,	//图象的实际高度
		short		MinutiaNum1,	//特征点个数
		MINUTIASTRU *lpMinutia1,	//特征点结构数组
		short		MinutiaNum2,
		MINUTIASTRU *lpMinutia2,
		short		MinutiaNum3,
		MINUTIASTRU *lpMinutia3,
		CENTER		*lpMainCenter,	//主中心结构指针
		CENTER		*lpAidCenter,	//副中心结构指针
		DELTA		*lpLeftDelta,	//左三角结构指针
		DELTA		*lpRightDelta,	//右三角结构指针
		bool		whetherDraw		//true,显示特征点和中心三角;false 不显示
)	
{	
	MinutiaColor1 = RGB(255,0,0);
	MinutiaColor2 = RGB(255,0,255);
	MinutiaColor3 = RGB(0,255,255);
	MinutiaDirection1 = RGB(0,255,0);
	MinutiaDirection2 = RGB(255,255,0);
	MinutiaDirection3 = RGB(0,0,255);
	MainCenterColor = RGB(255,0,0);
	MainCenterDirection = RGB(255,255,0);
	AidCenterColor = RGB(255,128,0);
	AidCenterDirection = RGB(0,255,255);
	LeftDeltaColor = RGB(0,0,255);
	LeftDeltaDirection = RGB(0,255,255);
	RightDeltaColor = RGB(0,255,0);
	RightDeltaDirection = RGB(0,255,255);
	//画位图
	pDC->SetMapMode(MM_TEXT);

	if (whetherDraw) 
	{
		int i;
		//画特征点1
		for (i=0 ;i<MinutiaNum1;i++)
		{	Draw_Direction_Round(hWnd,pDC,(lpMinutia1+i)->x,(lpMinutia1+i)->y,(lpMinutia1+i)->direction,x,y,ShowWidth,ShowHeight,ImageWidth,ImageHeight,MinutiaDirection1,MinutiaColor1,TRUE);}
		//画特征点2
		for (i=0 ;i<MinutiaNum2;i++)
		{	Draw_Direction_Round(hWnd,pDC,(lpMinutia2+i)->x,(lpMinutia2+i)->y,(lpMinutia2+i)->direction,x,y,ShowWidth,ShowHeight,ImageWidth,ImageHeight,MinutiaDirection2,MinutiaColor2,TRUE);}
		//画特征点3		
		for (i=0 ;i<MinutiaNum3;i++)
		{	Draw_Direction_Round(hWnd,pDC,(lpMinutia3+i)->x,(lpMinutia3+i)->y,(lpMinutia3+i)->direction,x,y,ShowWidth,ShowHeight,ImageWidth,ImageHeight,MinutiaDirection3,MinutiaColor3,TRUE);}
		//画主中心
		if(lpMainCenter)
			Draw_Direction_Round(hWnd,pDC,lpMainCenter->x,lpMainCenter->y,lpMainCenter->direction,x,y,ShowWidth,ShowHeight,ImageWidth,ImageHeight,MainCenterDirection,MainCenterColor,FALSE);
		//画主副心
		if(lpAidCenter)
			Draw_Direction_Round(hWnd,pDC,lpAidCenter->x,lpAidCenter->y,lpAidCenter->direction,x,y,ShowWidth,ShowHeight,ImageWidth,ImageHeight,AidCenterDirection,AidCenterColor,FALSE);
		//画左三角
		if(lpLeftDelta)
			Draw_Direction_Round(hWnd,pDC,lpLeftDelta->x,lpLeftDelta->y,lpLeftDelta->direction,x,y,ShowWidth,ShowHeight,ImageWidth,ImageHeight,LeftDeltaDirection,LeftDeltaColor,FALSE);
		//画右三角
		if(lpRightDelta)
			Draw_Direction_Round(hWnd,pDC,lpRightDelta->x,lpRightDelta->y,lpRightDelta->direction,x,y,ShowWidth,ShowHeight,ImageWidth,ImageHeight,RightDeltaDirection,RightDeltaColor,FALSE);
	}		
}	

void Draw_Direction_Round(
		HWND		hWnd,			//父窗口句柄
		CDC			*pDC,			//父窗口DC
		short		Point_X,		//标志点位置(相对于图象的左下角)
		short		Point_Y,
		short		Point_Direction,//标志点方向
		short		x,				//图象的位置(相对于父窗口的左上角)
		short		y,
		short		ShowWidth,		//显示的宽度
		short		ShowHeight,		//显示的高度
		short		ImageWidth,		//图象的实际宽度
		short		ImageHeight,	//图象的实际高度
		COLORREF	DirectionColor,	//标志点方向的颜色
		COLORREF	MinutianColor,	//标志点圆圈的颜色
		BOOL		Have_Brush		//true 是画实心,false是画空心
)
{
	MINUTIASTRU 	*my_lpMinutia;
	double	Point_Arc;
	CPen* pOldPen;
	CBrush* pOldBrush;
	CPen newPen_Line,newPen_Round;
    CBrush newBrush_Round;
	my_lpMinutia = (MINUTIASTRU *)LocalAlloc ( GMEM_FIXED|GMEM_ZEROINIT,sizeof(MINUTIASTRU) );
	//画方向	
	my_lpMinutia->x = x+short(Point_X*ShowWidth/ImageWidth);
	my_lpMinutia->y = y+ShowHeight-short(Point_Y*ShowHeight/ImageHeight);
	Point_Arc = double(Point_Direction)/57.295;//10000;
	newPen_Line.CreatePen( PS_SOLID, 2, DirectionColor ) ;
	pOldPen = pDC->SelectObject( &newPen_Line  );
	if (Have_Brush)
	{
		MinutiaRadius++;
		pDC->MoveTo(my_lpMinutia->x + short(MinutiaRadius * cos(Point_Arc)) ,my_lpMinutia->y - short(MinutiaRadius * sin(Point_Arc)));
		pDC->LineTo(my_lpMinutia->x + short((MinutiaLen+MinutiaRadius) * cos(Point_Arc)) ,my_lpMinutia->y - short((MinutiaLen+MinutiaRadius) * sin(Point_Arc)));
		MinutiaRadius--;
	}
	else
	{
		CenterDeltaRadius++;
		pDC->MoveTo(my_lpMinutia->x + short((CenterDeltaRadius) * cos(Point_Arc)) ,my_lpMinutia->y - short((CenterDeltaRadius) * sin(Point_Arc)));
	    pDC->LineTo(my_lpMinutia->x + short((CenterDeltaLen+CenterDeltaRadius) * cos(Point_Arc)) ,my_lpMinutia->y- short((CenterDeltaLen+CenterDeltaRadius) * sin(Point_Arc)));
		CenterDeltaRadius--;
	}
	pDC->SelectObject( pOldPen );
	newPen_Line.DeleteObject() ;
	//画圆	
	newPen_Round.CreatePen( PS_SOLID, 2, MinutianColor ) ;
	pOldPen = pDC->SelectObject( &newPen_Round  );
	if (Have_Brush)
	{
		newBrush_Round.CreateSolidBrush( MinutianColor ) ;
		pOldBrush = pDC->SelectObject( &newBrush_Round );
		pDC->Ellipse(my_lpMinutia->x - MinutiaRadius , my_lpMinutia->y - MinutiaRadius , my_lpMinutia->x + MinutiaRadius , my_lpMinutia->y +MinutiaRadius);
		pDC->SelectObject( pOldBrush );
		newBrush_Round.DeleteObject() ;
	}
	else
	{
		pDC->SelectStockObject( NULL_BRUSH );
		pDC->Ellipse(my_lpMinutia->x - CenterDeltaRadius , my_lpMinutia->y - CenterDeltaRadius , my_lpMinutia->x + CenterDeltaRadius , my_lpMinutia->y +CenterDeltaRadius);
	}
	pDC->SelectObject( pOldPen );
	newPen_Round.DeleteObject() ;
	LocalFree(my_lpMinutia);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -