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

📄 afxfun.cpp

📁 同学做的基于贪婪策略的拓扑排序算法可视化演示程序
💻 CPP
字号:
#include "StdAfx.h"
#include "AfxFun.h"
#include "math.h"

#define PI 3.1415926

void DrawNode(CWnd* wnd,CPoint p,char c,COLORREF m_Color)//画结点,加一个变量m_Color,用来控制结点的颜色
{
//	if(((CMainFrame*)AfxGetMainWnd())->m_Node)
//	{
		CClientDC dc(wnd);
		CBrush brs1(m_Color);
		dc.SelectObject(&brs1);
		CRect rect;
		rect.left = p.x - 10;
		rect.top = p.y - 10;
		rect.right = p.x + 10;
		rect.bottom = p.y + 10;
		dc.Ellipse(&rect);
		CBrush brs2;
		brs2.CreateSolidBrush(RGB(255,255,255));
		dc.SetBkColor(RGB(100,255,150));
		CString m_tempStr;
		m_tempStr.Format("%c",c);
		dc.TextOut(p.x-5,p.y+15,m_tempStr);
}

void DrawPath(CWnd* wnd,CPoint sc,CPoint dest,COLORREF m_Color)//画路径,加一个变量m_Color,用来控制路径的颜色
{
	CClientDC dc(wnd);
	CPen pen;
	pen.CreatePen(PS_SOLID,1,m_Color);//第三个参数的含义是画线的颜色,如果是初始的则着黑色,去掉的着红色。
	CPen *pOldPen = dc.SelectObject(&pen);

	//画一个小红点表示箭头
	//CRect temprect;
	//temprect.left = dest.x-3;
	//temprect.top = dest.y-3;
	//temprect.right = dest.x+3;
	//temprect.bottom = dest.y+3;
	//CBrush brs(RGB(255,0,0));
	//dc.SelectObject(&brs);
	//dc.Ellipse(&temprect);

///////////////////////////////////////////////////////////////////////////////////
	//下面实现画箭头!有点难度啊!
	const double acute_angle = 20.0*PI/180 ; //箭头的角度
	const double m_Length = 9.0 ;//箭头两边线段的长度
	double pri_angle = atan2((double)(dest.y-sc.y),(double)(dest.x-sc.x)); //此为两个结点的角度

	//下面实现从源结点的圆圈外画到目的结点的圆圈外
	CPoint sc1,dest1;
	sc1.x = sc.x + 10.0 * cos(pri_angle);
	sc1.y = sc.y + 10.0 * sin(pri_angle);
	dest1.x = dest.x - 10.0 * cos(pri_angle);
	dest1.y = dest.y - 10.0 * sin(pri_angle);
	dc.MoveTo(sc1);
	dc.LineTo(dest1);

	CPoint pntLeft,pntRight;//箭头左右末端点
	pntLeft.x  = (int) dest1.x - m_Length * cos(pri_angle - acute_angle);
	pntLeft.y  = (int) dest1.y - m_Length * sin(pri_angle - acute_angle);
	pntRight.x = (int) dest1.x - m_Length * cos(pri_angle + acute_angle);
	pntRight.y = (int) dest1.y - m_Length * sin(pri_angle + acute_angle);
	//将箭头的位置也作相应的移动
	dc.MoveTo(dest1);
	dc.LineTo(pntLeft);
	dc.MoveTo(dest1);
	dc.LineTo(pntRight);
	//哈哈,居然搞定了,太棒了!

///////////////////////////////////////////////////////////////////////////////////

	dc.SelectObject(pOldPen);
}

BOOL IsInArray(int a, int * Array )//仅对本程序适用,含有则返回真,不含则返回假。
{
	for(int i=0;i<50;i++)
	{
		if(Array[i]==-1)
			break;
		if(Array[i]==a)
			return TRUE;
	}
	return FALSE;
}

⌨️ 快捷键说明

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