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

📄 sanjiaowangview.cpp

📁 这是一个三角网边生长算法的实现方法。VC代码。
💻 CPP
字号:
// sanjiaowangView.cpp : implementation of the CSanjiaowangView class
//

#include "stdafx.h"
#include "sanjiaowang.h"

#include "sanjiaowangDoc.h"
#include "sanjiaowangView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSanjiaowangView

IMPLEMENT_DYNCREATE(CSanjiaowangView, CView)

BEGIN_MESSAGE_MAP(CSanjiaowangView, CView)
//{{AFX_MSG_MAP(CSanjiaowangView)
ON_COMMAND(ID_dingdian, Ondingdian)
ON_COMMAND(ID_Gouwang, OnGouwang)
ON_WM_LBUTTONDOWN()
	ON_COMMAND(ID_Clear, OnClear)
	//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSanjiaowangView construction/destruction

CSanjiaowangView::CSanjiaowangView()
{
	// TODO: add construction code here
	m_dingdian=false;
	
}

CSanjiaowangView::~CSanjiaowangView()
{
}

BOOL CSanjiaowangView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	MessageBox("请阅读文件夹中的说明文档");
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSanjiaowangView drawing

void CSanjiaowangView::OnDraw(CDC* pDC)
{
	CSanjiaowangDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CSanjiaowangView printing

BOOL CSanjiaowangView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CSanjiaowangView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CSanjiaowangView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CSanjiaowangView diagnostics

#ifdef _DEBUG
void CSanjiaowangView::AssertValid() const
{
	CView::AssertValid();
}

void CSanjiaowangView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CSanjiaowangDoc* CSanjiaowangView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSanjiaowangDoc)));
	return (CSanjiaowangDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSanjiaowangView message handlers

void CSanjiaowangView::delaunay(CPoint p1, CPoint p2)
{
	CPoint p3, ThirdPoint;
	ThirdPoint = GetThirdPoint(p1,p2);  //获取第三点(采用余弦值最小判断)
	if (ThirdPoint.x!=0 && ThirdPoint.y!=0)
	{
		p3 = ThirdPoint;
		this->BuildTriangle(p1, p2, p3);
		Line l1;
		l1.p1 = p1;
		l1.p2 = p2;
		a2.push_back(l1);
	}
	else 
		return;//储存已构成的直线 
	delaunay(p1,p3);             
	delaunay(p3,p2);  //标记已构三角形的边,对尚未构三角形的边用算法进行递归调用             
}

CPoint CSanjiaowangView::GetThirdPoint(CPoint p1, CPoint p2)
{
	bool p=this->panduan(p1,p2);
	double temp=1;
	int j=0; 
	for(int i=0;i<a1.size();i++)
	{  
		double equation;
		equation = ((p1.y - p2.y) * (a1[i].x - p2.x))
			- ((a1[i].y - p2.y) * (p1.x - p2.x));//确定基线的方向
		if(equation<=0) continue;
		double a=sqrt(pow(p1.x-a1[i].x,2)+pow(p1.y-a1[i].y,2));
		double b=sqrt(pow(p2.x-a1[i].x,2)+pow(p2.y-a1[i].y,2));
		double c=sqrt(pow(p1.x-p2.x,2)+pow(p1.y-p2.y,2));
		double d=(a*a+b*b-c*c)/(2*a*b);
		if(d<temp && equation>0 && p)
		{
			temp=d;
			j=i;
		}	
	}
	if(j!=0)
		return a1[j];
	else
		return CPoint(0,0);
}

void CSanjiaowangView::Ondingdian() 
{	
	m_dingdian=true;	
}

void CSanjiaowangView::OnGouwang() 
{
	// TODO: Add your command handler code here
	m_dingdian = false;
	int n = a1.size();
	for (int i=0; i<n-1; i++)//确定基线
	{
		for (int j=i+1; j<n; j++)
		{
			if (a1[i].x > a1[j].x)
			{
				CPoint tp1;
				tp1 = a1[i];
				a1[i] = a1[j];
				a1[j] = tp1;		
			}
		}
	}
	if (n>=3)
	{
		if (a1[0].y > a1[1].y)
			this->delaunay(a1[0], a1[1]);
		else
			this->delaunay(a1[1], a1[0]);
	}
	else
		MessageBox("请输入至少三个以上的点");
	a2.clear();	
}

void CSanjiaowangView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_dingdian)
	{
		CClientDC dc(this);
		dc.Ellipse(point.x,point.y,point.x +5,point.y+5);
		a1.push_back(point);
	}
	
	CView::OnLButtonDown(nFlags, point);
}

bool CSanjiaowangView::panduan(CPoint p1, CPoint p2)
{
	bool p=true;
	Line l1;
	l1.p1=p1;
	l1.p2=p2;
	for(int i=0;i<a2.size();i++)
	{
		if(l1.p1==a2[i].p1 && l1.p2==a2[i].p2)
			p=false;
	}
	return p;
}

void CSanjiaowangView::BuildTriangle(CPoint p1, CPoint p2, CPoint p3)
{
	CClientDC dc(this);
	dc.MoveTo(p1.x,p1.y);
	dc.LineTo(p2.x,p2.y);
	dc.MoveTo(p2.x,p2.y);
	dc.LineTo(p3.x,p3.y);
	dc.MoveTo(p1.x,p1.y);
	dc.LineTo(p3.x,p3.y);	
}

void CSanjiaowangView::OnClear() 
{   
	// TODO: Add your command handler code here
	CClientDC dc(this); 
	CRect rc;
	GetClientRect(rc);
	dc.FillSolidRect(rc,dc.GetBkColor());
}

⌨️ 快捷键说明

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