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

📄 mydrawnode.cpp

📁 B+树的演示程序
💻 CPP
字号:
// MyDrawNode.cpp : 实现文件
//

#include "stdafx.h"
#include "BPlusTree.h"
#include "MyDrawNode.h"
#include "parameters.h"
#include <math.h>

// MyDrawNode
CDC* MyDrawNode::m_pDC = NULL;
COLORREF MyDrawNode::m_crNormal = NORMAL_COLOR;
COLORREF MyDrawNode::m_crLight = LIGHT_COLOR;
CPen MyDrawNode::m_penThickNormal;
CPen MyDrawNode::m_penThinNormal;
CPen MyDrawNode::m_penThickDotNormal;
CPen MyDrawNode::m_penThickLight;
CPen MyDrawNode::m_penThinLight;
CPen MyDrawNode::m_penThickDotLight;
CFont MyDrawNode::m_font;
int MyDrawNode::N = MINIMUS_NUMBER_OF_NODE;

MyDrawNode::MyDrawNode()
{
	m_pnode = NULL;
	m_position = CPoint(0,0);
}

MyDrawNode::~MyDrawNode()
{
}


// MyDrawNode 成员函数

// static fuction

void MyDrawNode::SetDC(CDC* pDC)
{
	m_pDC = pDC;
}
void MyDrawNode::Initialization()
{
	m_penThickNormal.CreatePen(PS_DASH,THICK_PEN,m_crNormal);
	m_penThickDotNormal.CreatePen(PS_DOT,1,m_crNormal);
	m_penThinNormal.CreatePen(PS_DASH,THIN_PEN,m_crNormal);
	m_penThickLight.CreatePen(PS_DASH,THICK_PEN,m_crLight);
	m_penThickDotLight.CreatePen(PS_DOT,1,m_crLight);
	m_penThinLight.CreatePen(PS_DASH,THIN_PEN,m_crLight);
	m_font.CreateFont(FONT_HEIGHT,FONT_WIDTH,0,0,FONT_WEIGHT,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,NULL);
}

void MyDrawNode::SetN(int n)
{
	N = n;
}
void MyDrawNode::SetNormalColor(COLORREF cr)
{
	m_crNormal = cr;
}
void MyDrawNode::SetLightColor(COLORREF cr)
{
	m_crLight = cr;
}

void MyDrawNode::Create(POINT position)
{
	m_position = position;

	m_rect.left = m_position.x - KEY_WIDTH*N/2;
	m_rect.top = m_position.y;
	m_rect.right = m_rect.left + KEY_WIDTH*N;
	m_rect.bottom = m_rect.top + KEY_HEIGHT + POINTER_HEIGHT;
}

int MyDrawNode::DrawFont(POINT point,long key,bool bLight)
{
	if(!m_pDC)	return -1;
	m_pDC->SelectObject(&m_font);
	if(bLight)
		m_pDC->SetTextColor(m_crLight);
	else
		m_pDC->SetTextColor(m_crNormal);
		
	CString str;
	str.Format("%d",key);

	int i = 0;
	do
	{
		key = key/10;
		i++;
	}while(key > 0);
	m_pDC->TextOut(point.x - i*FONT_WIDTH/2,point.y - FONT_HEIGHT/2,str);
	return i;
}

int MyDrawNode::DrawArrow(POINT ptFrom,POINT ptTo,int type,bool bLight)	//type : 0 sPen, 1 bPen, 2 svPen
{
	if(!m_pDC)	return -1;
	if(bLight)
	{
		if(type == 0)
			m_pDC->SelectObject(&m_penThinLight);
		else if(type == 1)
			m_pDC->SelectObject(&m_penThickLight);
		else
			m_pDC->SelectObject(&m_penThickDotLight);
	}
	else
	{
		if(type == 0)
			m_pDC->SelectObject(&m_penThinNormal);
		else if(type == 1)
			m_pDC->SelectObject(&m_penThickNormal);
		else
			m_pDC->SelectObject(&m_penThickDotNormal);
	}
	m_pDC->MoveTo(ptFrom);
	m_pDC->LineTo(ptTo);

	// draw arrow
	double tanA,A,B;
	double O = ARROWDEGREE*PI/180;
	int x,y,i=1,j=1;
	
	if( (ptFrom.x - ptTo.x < 3) && (ptFrom.x - ptTo.x > -3) )
        A = PI/2;
	else
	{
		i = (ptFrom.x-ptTo.x > 0) ? 1 : -1;
		j = (ptTo.y-ptFrom.y > 0) ? 1 : -1;
		tanA = (double)(ptTo.y-ptFrom.y) / (double)(ptFrom.x-ptTo.x);
		A = atan(abs(tanA));
		if( (i==1) && (j==1 ) )			;
		else if( (i==-1) && (j==1) )	A = A + PI/2;
		else if( (i==-1) && (j==-1) )	A = A + PI;
		else if( (i==1) && (j==-1) )	A = -A;
	}

	for(int n=-1;n<=1;n += 2)
	{
		B = A + n*O;
		if(B < 0)
		{	B = -B;	i = 1;	j = -1;	}
		else if(B < PI/2)
		{	i = 1;	j = 1;	}
		else if(B < PI)
		{	B = PI - B;	i = -1;	j = 1;	}
		else
		{	B = B - PI;	i = -1; j = -1;	}
		x = (int)(ARROWLEGHT * cos(B));
		y = (int)(ARROWLEGHT * sin(B));
		m_pDC->MoveTo(ptTo);
		m_pDC->LineTo(ptTo.x + i*x,ptTo.y - j*y);
	}
	return 0;
}

void MyDrawNode::DrawNode(MyNode* pnode,POINT position,bool bLight)
{
	m_pnode = pnode;
	Create(position);

	if(m_pnode->m_level == 1)
		DrawLeaf(bLight);
	else
		DrawBranch(bLight);
	return;
}

void MyDrawNode::DrawBranch(bool bLight)
{
	// draw other
	CPen* oldPen;
	POINT pt;
	int i;

	// draw rect
	if(bLight)
		oldPen = m_pDC->SelectObject(&m_penThickLight);
	else
		oldPen = m_pDC->SelectObject(&m_penThickNormal);
	m_pDC->Rectangle(&m_rect);

	// draw line
	if(bLight)
		m_pDC->SelectObject(&m_penThinLight);
	else
		m_pDC->SelectObject(&m_penThinNormal);
	// ---------
	m_pDC->MoveTo(m_rect.left,m_position.y + KEY_HEIGHT);
	m_pDC->LineTo(m_rect.right,m_position.y + KEY_HEIGHT);
	// |  |  |  |
	for(i=1;i<m_pnode->N;i++)
	{
		m_pDC->MoveTo(m_rect.left+KEY_WIDTH*i,m_position.y);
		m_pDC->LineTo(m_rect.left+KEY_WIDTH*i,m_position.y + KEY_HEIGHT);
	}
	// | | | | |
	int width = (KEY_WIDTH*N)/(N+1);
	for(i=1;i<=m_pnode->N;i++)
	{
		m_pDC->MoveTo(m_rect.left+width*i,m_rect.bottom - POINTER_HEIGHT);
		m_pDC->LineTo(m_rect.left+width*i,m_rect.bottom);
	}

	m_pDC->SelectObject(oldPen);
		
	// draw key;
	pt.x = m_rect.left + KEY_WIDTH/2;
	pt.y = m_rect.top + KEY_HEIGHT/2;
	for(i=0;i<m_pnode->m_n;i++)
	{
		DrawFont(pt,m_pnode->k[i],bLight);
		pt.x += KEY_HEIGHT;
	}
}

void MyDrawNode::DrawLeaf(bool bLight)
{
	// draw other
	CPen* oldPen;
	int i;
	POINT pt,pt2,pt3;
	RECT rect;

	// draw rect
	if(bLight)
		oldPen = m_pDC->SelectObject(&m_penThickLight);
	else
		oldPen = m_pDC->SelectObject(&m_penThickNormal);	
	pt.x = pt.y = LEAF_CORNER;
	m_pDC->RoundRect(&m_rect,pt);

	// draw line
	if(bLight)
		m_pDC->SelectObject(&m_penThinLight);
	else
		m_pDC->SelectObject(&m_penThinNormal);
	// ---------
	m_pDC->MoveTo(m_rect.left,m_position.y + KEY_HEIGHT);
	m_pDC->LineTo(m_rect.right,m_position.y + KEY_HEIGHT);
	// |  |  |  |
	for(i=1;i<m_pnode->N;i++)
	{
		m_pDC->MoveTo(m_rect.left+KEY_WIDTH*i,m_rect.top);
		m_pDC->LineTo(m_rect.left+KEY_WIDTH*i,m_rect.bottom);
	}
	// draw ]
	rect.left = m_rect.right;
	rect.top = m_rect.top + KEY_HEIGHT;
	rect.right = rect.left + LEAF_NEXT_WIDTH;
	rect.bottom = rect.top + POINTER_HEIGHT;
	m_pDC->Rectangle(&rect);
	//draw ->
	if(((MyLeaf*)m_pnode)->m_next)
	{
		pt.x = rect.right;
		pt.y = rect.top + POINTER_HEIGHT/2;
		pt2.x = m_rect.right + DISTANCE;
		pt2.y = pt.y;
		DrawArrow(pt,pt2,0,bLight);
	}

	// draw key;
	pt.x = m_rect.left + KEY_WIDTH/2;
	pt.y = m_rect.top + KEY_HEIGHT/2;
	for(i=0;i<m_pnode->m_n;i++)
	{
		DrawFont(pt,m_pnode->k[i],bLight);
		pt.x += KEY_HEIGHT;
	}

	// draw point key
	pt.x = m_rect.left + KEY_WIDTH/2;
	pt.y = m_rect.bottom;
	pt2.y = pt.y + LEAF_KEY_POINT_LONGTH;
	rect.top = pt2.y;
	rect.bottom = rect.top + 2*LEAF_KEY_POINT_RADIUS;
	pt3.y = pt2.y + LEAF_KEY_POINT_RADIUS;
	for(i=0;i<m_pnode->m_n;i++)
	{
		pt2.x = pt.x;
		DrawArrow(pt,pt2,0,bLight);

		rect.left = pt.x - LEAF_KEY_POINT_RADIUS;
		rect.right = pt.x + LEAF_KEY_POINT_RADIUS;
		m_pDC->Ellipse(&rect);

		pt3.x = pt.x;
        DrawFont(pt3,*(long*)m_pnode->p[i],bLight);
		pt.x += KEY_WIDTH;
	}
	m_pDC->SelectObject(oldPen);
}
void MyDrawNode::DrawInsertKey(long key)
{
	POINT pt,pt2;
	RECT rect;

	pt.x = m_rect.right;
	pt.y = m_rect.bottom + LEAF_KEY_POINT_LONGTH/2;
	pt2.x = pt.x + KEY_WIDTH/2;
	pt2.y = pt.y + LEAF_KEY_POINT_LONGTH;
	DrawArrow(pt2,pt,0,true);

	rect.left = pt2.x - LEAF_KEY_POINT_RADIUS;
	rect.right = pt2.x + LEAF_KEY_POINT_RADIUS;
	rect.top = pt2.y;
	rect.bottom = rect.top + 2*LEAF_KEY_POINT_RADIUS;
	m_pDC->Ellipse(&rect);

	pt2.y += LEAF_KEY_POINT_RADIUS;
    DrawFont(pt2,key,true);
}

POINT MyDrawNode::GetFirstPointFrom()
{
	POINT point;
	point.x = m_rect.left + (KEY_WIDTH*N)/(N+1)/2;
	point.y = m_rect.bottom;
	return point;
}

int MyDrawNode::GetPointDistance()
{
	return (KEY_WIDTH*N)/(N+1);
}

⌨️ 快捷键说明

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