📄 besurview.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 + -