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

📄 besurview.cpp

📁 本程序实现besur算法
💻 CPP
字号:
// BesurView.cpp : implementation of the CBesurView class
//

#include "stdafx.h"
#include "Besur.h"

#include "BesurDoc.h"
#include "BesurView.h"
#include "DLG_zuobiaozhi.h"
#include "DLG_CUR_VALUE.h"

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

/////////////////////////////////////////////////////////////////////////////
// CBesurView

IMPLEMENT_DYNCREATE(CBesurView, CView)

BEGIN_MESSAGE_MAP(CBesurView, CView)
	//{{AFX_MSG_MAP(CBesurView)
	ON_COMMAND(ID_SUR, OnSur)
	ON_COMMAND(ID_CUR, OnCur)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CBesurView construction/destruction

CBesurView::CBesurView()
{
	// TODO: add construction code here
   p_gview=this;
   m_p[0][0].x=-175;   m_p[0][0].y=-200;   m_p[0][0].z=-50;
   m_p[0][1].x=450;   m_p[0][1].y=-350; m_p[0][1].z=-50;
   m_p[0][2].x=-350;   m_p[0][2].y=350; m_p[0][2].z=-50;
   m_p[0][3].x=250;   m_p[0][3].y=300; m_p[0][3].z=-50;

   m_p[1][0].x=-175;   m_p[1][0].y=-200;   m_p[1][0].z=50;
   m_p[1][1].x=450;   m_p[1][1].y=-350; m_p[1][1].z=50;
   m_p[1][2].x=-350;   m_p[1][2].y=350; m_p[1][2].z=50;
   m_p[1][3].x=250;    m_p[1][3].y=300; m_p[1][3].z=50;

   m_p[2][0].x=-175;   m_p[2][0].y=-200;   m_p[2][0].z=110;
   m_p[2][1].x=450;   m_p[2][1].y=-350; m_p[2][1].z=110;
   m_p[2][2].x=-350;   m_p[2][2].y=350; m_p[2][2].z=110;
   m_p[2][3].x=250;   m_p[2][3].y=300; m_p[2][3].z=110;

     m_p[3][0].x=-175;   m_p[3][0].y=-200;   m_p[3][0].z=220;
   m_p[3][1].x=450;   m_p[3][1].y=-350; m_p[3][1].z=220;
   m_p[3][2].x=-350;   m_p[3][2].y=350; m_p[3][2].z=220;
   m_p[3][3].x=250;   m_p[3][3].y=300; m_p[3][3].z=220;
		   

   m_p_cur[0].x=-400;   m_p_cur[0].y=350; m_p_cur[0].z=-300;
   m_p_cur[1].x=-100;   m_p_cur[1].y=200;  m_p_cur[1].z=0;
   m_p_cur[2].x=100;   m_p_cur[2].y=200; m_p_cur[2].z=300;
   m_p_cur[3].x=-100;   m_p_cur[3].y=-300; m_p_cur[3].z=-300;
   m_p_cur[4].x=-200;   m_p_cur[4].y=-10; m_p_cur[4].z=240;
}

CBesurView::~CBesurView()
{
}

BOOL CBesurView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CBesurView drawing

void CBesurView::OnDraw(CDC* pDC)
{
	CBesurDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	D3Position zuobiao_yuandian(-200,-100,0),zuobiao_x(-100,-100,0),
		zuobiao_y(-200,0,0),zuobiao_z(-200,-100,100);
	D2Position  V_zuobiao_yuandian(0,0),V_zuobiao_x(0,0),
		V_zuobiao_y(0,0),V_zuobiao_z(0,0);
	CPoint W_zuobiao_yuandian(0,0),W_zuobiao_x(0,0),
		W_zuobiao_y(0,0),W_zuobiao_z(0,0);
	V_zuobiao_yuandian=zuobiao_yuandian.D3_To_D2(zuobiao_yuandian,V_zuobiao_yuandian);
	V_zuobiao_x=zuobiao_x.D3_To_D2(zuobiao_x,V_zuobiao_x);
	V_zuobiao_y=zuobiao_y.D3_To_D2(zuobiao_y,V_zuobiao_y);
	V_zuobiao_z=zuobiao_z.D3_To_D2(zuobiao_z,V_zuobiao_z);
	
	W_zuobiao_yuandian=View_To_Window(V_zuobiao_yuandian,W_zuobiao_yuandian);
	W_zuobiao_x=View_To_Window(V_zuobiao_x,W_zuobiao_x);
	W_zuobiao_y=View_To_Window(V_zuobiao_y,W_zuobiao_y);
	W_zuobiao_z=View_To_Window(V_zuobiao_z,W_zuobiao_z);
    
	CPen myPen1(PS_SOLID, 2, RGB(255,0,0));
    CPen * oldpen=pDC->SelectObject(&myPen1);
	

	pDC->MoveTo(W_zuobiao_yuandian.x,W_zuobiao_yuandian.y);
	pDC->LineTo(W_zuobiao_x.x,W_zuobiao_x.y);

	pDC->MoveTo(W_zuobiao_yuandian.x,W_zuobiao_yuandian.y);
	pDC->LineTo(W_zuobiao_y.x,W_zuobiao_y.y);

	pDC->MoveTo(W_zuobiao_yuandian.x,W_zuobiao_yuandian.y);
	pDC->LineTo(W_zuobiao_z.x,W_zuobiao_z.y);
    
	pDC->TextOut(10,10,"默认的BEZIER曲面和默认的B样条曲线");
  	pDC->TextOut(10,30,"如需更改参数,可以单击菜单栏");
	pDC->SelectObject(oldpen);
	drawsur();
	drawcur();
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CBesurView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CBesurView diagnostics

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

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

CBesurDoc* CBesurView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBesurDoc)));
	return (CBesurDoc*)m_pDocument;
}

CPoint CBesurView::View_To_Window(D2Position d2point,CPoint win_point){
	CRect dc;
	GetClientRect(&dc);
	win_point.x=(int)d2point.x+(dc.left+dc.right)/2;
	win_point.y=(dc.bottom+dc.top)/2-(int)d2point.y;
	return win_point;
}

D3Position CBesurView::Multi_Mul(double uu,double vv,
								 D3Position p00,D3Position p01,D3Position p02,D3Position p03,
								 D3Position p10,D3Position p11,D3Position p12,D3Position p13, 
								 D3Position p20,D3Position p21,D3Position p22,D3Position p23, 
								 D3Position p30,D3Position p31,D3Position p32,D3Position p33){
   
	D3Position p_uu_vv(0,0,0);
	double B03_uu,B13_uu,B23_uu,B33_uu;
	double B03_vv,B13_vv,B23_vv,B33_vv;
     
    B03_uu=(1-uu)*(1-uu)*(1-uu);
	B13_uu=3*uu*(1-uu)*(1-uu);
	B23_uu=3*uu*uu*(1-uu);
	B33_uu=uu*uu*uu;

	B03_vv=(1-vv)*(1-vv)*(1-vv);
	B13_vv=3*vv*(1-vv)*(1-vv);
	B23_vv=3*vv*vv*(1-vv);
	B33_vv=vv*vv*vv;

	p_uu_vv=(p00*B03_uu+p10*B13_uu+p20*B23_uu+p30*B33_uu)*B03_vv+
		    (p01*B03_uu+p11*B13_uu+p21*B23_uu+p31*B33_uu)*B13_vv+
			(p02*B03_uu+p12*B13_uu+p22*B23_uu+p32*B33_uu)*B23_vv+
			(p03*B03_uu+p13*B13_uu+p23*B23_uu+p33*B33_uu)*B33_vv;




	return p_uu_vv;
								 
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBesurView message handlers

void CBesurView::OnSur() 
{
	// TODO: Add your command handler code here

   	DLG_zuobiaozhi dlg;
	if (dlg.DoModal()==IDOK)
	{

    dlg.m_p[0][0].x=dlg.m_edit00x;
	dlg.m_p[0][0].y=dlg.m_edit00y;
	dlg.m_p[0][0].z=dlg.m_edit00z;

	dlg.m_p[0][1].x=dlg.m_edit01x;
	dlg.m_p[0][1].y=dlg.m_edit01y;
	dlg.m_p[0][1].z=dlg.m_edit01z;

	dlg.m_p[0][2].x=dlg.m_edit02x;
	dlg.m_p[0][2].y=dlg.m_edit02y;
	dlg.m_p[0][2].z=dlg.m_edit02z;
	
	dlg.m_p[0][3].x=dlg.m_edit03x;
	dlg.m_p[0][3].y=dlg.m_edit03y;
	dlg.m_p[0][3].z=dlg.m_edit03z;

	dlg.m_p[1][0].x=dlg.m_edit10x;
	dlg.m_p[1][0].y=dlg.m_edit10y;
	dlg.m_p[1][0].z=dlg.m_edit10z;

	dlg.m_p[1][1].x=dlg.m_edit11x;
	dlg.m_p[1][1].y=dlg.m_edit11y;
	dlg.m_p[1][1].z=dlg.m_edit11z;

	dlg.m_p[1][2].x=dlg.m_edit12x;
	dlg.m_p[1][2].y=dlg.m_edit12y;
	dlg.m_p[1][2].z=dlg.m_edit12z;

	dlg.m_p[1][3].x=dlg.m_edit13x;
	dlg.m_p[1][3].y=dlg.m_edit13y;
	dlg.m_p[1][3].z=dlg.m_edit13z;

	dlg.m_p[2][0].x=dlg.m_edit20x;
	dlg.m_p[2][0].y=dlg.m_edit20y;
	dlg.m_p[2][0].z=dlg.m_edit20z;

	dlg.m_p[2][1].x=dlg.m_edit21x;
	dlg.m_p[2][1].y=dlg.m_edit21y;
	dlg.m_p[2][1].z=dlg.m_edit21z;

	dlg.m_p[2][2].x=dlg.m_edit22x;
	dlg.m_p[2][2].y=dlg.m_edit22y;
	dlg.m_p[2][2].z=dlg.m_edit22z;

	dlg.m_p[2][3].x=dlg.m_edit23x;
	dlg.m_p[2][3].y=dlg.m_edit23y;
	dlg.m_p[2][3].z=dlg.m_edit23z;

	dlg.m_p[3][0].x=dlg.m_edit30x;
	dlg.m_p[3][0].y=dlg.m_edit30y;
	dlg.m_p[3][0].z=dlg.m_edit30z;

	dlg.m_p[3][1].x=dlg.m_edit31x;
	dlg.m_p[3][1].y=dlg.m_edit31y;
	dlg.m_p[3][1].z=dlg.m_edit31z;

	dlg.m_p[3][2].x=dlg.m_edit32x;
	dlg.m_p[3][2].y=dlg.m_edit32y;
	dlg.m_p[3][2].z=dlg.m_edit32z;

	dlg.m_p[3][3].x=dlg.m_edit33x;
	dlg.m_p[3][3].y=dlg.m_edit33y;
	dlg.m_p[3][3].z=dlg.m_edit33z;
	
  for (int i=0;i<4;i++)
  {
	  for (int j=0;j<4;j++)
	  {
	  
	  m_p[i][j]=dlg.m_p[i][j];
  }
  }
	}

  Invalidate();
}














void CBesurView::drawsur(){

    CDC * pDC=GetDC();

	D3Position d3(0,0,0);
	D2Position d2(0,0);
	CPoint       point(0,0);
     for (double uu=0;uu<=1;uu=uu+0.02)
     {
		 for (double vv=0;vv<=1;vv=vv+0.02)
		 {
           d3=Multi_Mul(uu,vv,
			            m_p[0][0],m_p[0][1],m_p[0][2],m_p[0][3],
						m_p[1][0],m_p[1][1],m_p[1][2],m_p[1][3],
						m_p[2][0],m_p[2][1],m_p[2][2],m_p[2][3],
						m_p[3][0],m_p[3][1],m_p[3][2],m_p[3][3]
						);
		   d2=d3.D3_To_D2(d3,d2);
		   point=View_To_Window(d2,point);

           if (vv==0)
           {
             pDC->MoveTo(point.x,point.y);
           }
		   else pDC->LineTo(point.x,point.y);
		  
		 }
     }


	 for (double vv=0;vv<=1;vv=vv+0.02)
     {
		 for (double uu=0;uu<=1;uu=uu+0.02)
		 {
           d3=Multi_Mul(uu,vv,
			            m_p[0][0],m_p[0][1],m_p[0][2],m_p[0][3],
						m_p[1][0],m_p[1][1],m_p[1][2],m_p[1][3],
						m_p[2][0],m_p[2][1],m_p[2][2],m_p[2][3],
						m_p[3][0],m_p[3][1],m_p[3][2],m_p[3][3]
						);
		   d2=d3.D3_To_D2(d3,d2);
		   point=View_To_Window(d2,point);

           if (uu==0)
           {
             pDC->MoveTo(point.x,point.y);
           }
		   else pDC->LineTo(point.x,point.y);

		 }
     }



}


D3Position CBesurView::Mlti_cur_ul(double v,
								   D3Position p0,D3Position p1,D3Position p2,D3Position p3){
   D3Position p_v(0,0,0);
   double N03,N13,N23,N33;
   N03=(1-v)*(1-v)*(1-v)/6;
   N13=(4-6*v*v+3*v*v*v)/6;
   N23=(1+3*v+3*v*v-3*v*v*v)/6;
   N33=v*v*v/6;

   p_v=p0*N03+p1*N13+p2*N23+p3*N33;

   return p_v;


 }


void CBesurView::drawcur(){
     CDC * pDC=GetDC();

	D3Position d3(0,0,0);
	D2Position d2(0,0);
	CPoint       point(0,0);
	CString str;
	
	CPen myPen1(PS_SOLID, 2, RGB(0,0,255));
    	CPen* oldpen=pDC->SelectObject(&myPen1);


	for (int j=0;j<5;j++)
	{ 
	  d2=m_p_cur[j].D3_To_D2(m_p_cur[j],d2);
	  point=View_To_Window(d2,point);
	  str.Format("%d",j);

	  pDC->TextOut(point.x,point.y,"P"+str);
//   pDC->TextOut(10*j+10,10*j+10,"P");
	if (j==0)
	{
		pDC->MoveTo(point.x,point.y);
	}
	else 
		pDC->LineTo(point.x,point.y);
	}
	
	for (double v=0;v<=1;v=v+0.01)
	{ 
	  d3=Mlti_cur_ul(v,m_p_cur[0],m_p_cur[1],m_p_cur[2],m_p_cur[3]);
	  d2=d3.D3_To_D2(d3,d2);
	  point=View_To_Window(d2,point);
	
	  if (v==0)
	  {
		  pDC->MoveTo(point.x,point.y);
	  }
	  else
		  pDC->LineTo(point.x,point.y);
	}

		for ( v=0;v<=1;v=v+0.01)
	{ 
	  d3=Mlti_cur_ul(v,m_p_cur[1],m_p_cur[2],m_p_cur[3],m_p_cur[4]);
	  d2=d3.D3_To_D2(d3,d2);
	  point=View_To_Window(d2,point);
	
//	  if (v==0)
//	  {
//		  pDC->MoveTo(point.x,point.y);
//	  }
	 //  else
		  pDC->LineTo(point.x,point.y);
	}


		pDC->SelectObject(oldpen);
//	pDC->TextOut()
}

void CBesurView::OnCur() 
{
	// TODO: Add your command handler code here
	DLG_CUR_VALUE dlg;
	if (dlg.DoModal()==IDOK)
	{   

       	 dlg.m_p[0].x=dlg.m_P0X;	dlg.m_p[0].y=dlg.m_P0Y;	dlg.m_p[0].z=dlg.m_P0Z;
	     dlg.m_p[1].x=dlg.m_P1X;	dlg.m_p[1].y=dlg.m_P1Y;	dlg.m_p[1].z=dlg.m_P1Z;
	     dlg.m_p[2].x=dlg.m_P2X;	dlg.m_p[2].y=dlg.m_P2Y;	dlg.m_p[2].z=dlg.m_P2Z;
	     dlg.m_p[3].x=dlg.m_P3X;	dlg.m_p[3].y=dlg.m_P3Y;	dlg.m_p[3].z=dlg.m_P3Z;
	     dlg.m_p[4].x=dlg.m_P4X;	dlg.m_p[4].y=dlg.m_P4Y;	dlg.m_p[4].z=dlg.m_P4Z;


		for (int i=0;i<5;i++)
		{
			m_p_cur[i]=dlg.m_p[i];
		}

		drawcur();
	}

	Invalidate();
}

⌨️ 快捷键说明

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