// FinalView.cpp : implementation of the CFinalView class
#include "stdafx.h"
#include "Final.h"
#include "FinalDoc.h"
#include "FinalView.h"
#include "Dialogline.h"
#include "DialogLineS.h"
#include "DialogPen.h"
#include "DialogCircle.h"
#include "DialogEllipse.h"
#include "DialogRect.h"
#include "DialogPoly.h"
#include "DialogArc.h"
#include "DialogTri.h"
#include "DialogTrans.h"
#include "DialogRatio1.h"
#include "DialogShare.h"
#include "DialogSym.h"
#include "DialogRotate.h"
#include "DialogSymx.h"
#include "DialogSymxx.h"
#include "DialogBezier3.h"
#include "DialogColor.h"
#include <math.h>
#include <string>
#include <malloc.h>
#define ROUND(a) int(a+0.5)
using namespace std;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int Flag = 0;
CPoint spt[7],s_point;
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CFinalView, CView)
BEGIN_MESSAGE_MAP(CFinalView, CView)
//{{AFX_MSG_MAP(CFinalView)
ON_COMMAND(ID_Line, OnLine)
ON_COMMAND(ID_BresenhamCircle, OnBresenhamCircle)
ON_COMMAND(ID_BresenhamEllipse, OnBresenhamEllipse)
ON_COMMAND(ID_Rectangle, OnRectangle)
ON_COMMAND(ID_Polygon, OnPolygon)
ON_COMMAND(ID_Arc, OnArc)
ON_WM_RBUTTONDOWN()
ON_COMMAND(ID_Translation, OnTranslation)
ON_COMMAND(ID_Ratio, OnRatio)
ON_COMMAND(ID_Shear, OnShear)
ON_COMMAND(ID_Sym, OnSym)
ON_COMMAND(ID_Rotate, OnRotate)
ON_COMMAND(ID_CompTrans, OnCompTrans)
ON_COMMAND(ID_CompRatio, OnCompRatio)
ON_COMMAND(ID_CompRotate, OnCompRotate)
ON_COMMAND(ID_Rotatex, OnRotatex)
ON_COMMAND(ID_Symx, OnSymx)
ON_COMMAND(ID_Symxx, OnSymxx)
ON_COMMAND(ID_Bezier1, OnBezier1)
ON_COMMAND(ID_Bezier2, OnBezier2)
ON_COMMAND(ID_Bezier3, OnBezier3)
ON_COMMAND(ID_Bspl, OnBspl)
ON_COMMAND(ID_Hermite, OnHermite)
ON_COMMAND(ID_Curvesplicing, OnCurvesplicing)
ON_COMMAND(ID_Graphcut, OnGraphcut)
ON_COMMAND(ID_Refresh, OnRefresh)
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_MENUITEM32802, OnMenuAET)
ON_COMMAND(ID_MENUITEM32803, OnMenuDrawPolygon)
ON_COMMAND(ID_CAIJIAN, OnCaijian)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CFinalView construction/destruction
CFinalView::CFinalView()
{
// TODO: add construction code here
//多边形端点坐标
Point[0]=CPoint(600,100);//P0
Point[1]=CPoint(800,600);//P1
Point[2]=CPoint(550,500);//P2
}
CFinalView::~CFinalView()
{
}
BOOL CFinalView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CFinalView drawing
void CFinalView::OnDraw(CDC* pDC)
{
CFinalDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(choose==1)
{
pDC->Polygon(Point,3);//绘制多边形
}
if (!pDoc)
return;
CRect rectClient;
GetClientRect(rectClient);
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(2000,1000);
pDC->SetViewportExt(rectClient.right,-rectClient.bottom);
pDC->SetViewportOrg(rectClient.right/2,rectClient.bottom/2);
pDC->MoveTo(-1000,0);
pDC->LineTo(1000,0);
pDC->LineTo(985,15);
pDC->MoveTo(1000,0);
pDC->LineTo(985,-15);
int i;
for(i=-10;i<=10;i++)
{
pDC->MoveTo(100*i,-10);
pDC->LineTo(100*i,10);
CString Str;
Str.Format(_T("%d"),i);
if(i!=0)
{
pDC->TextOut(100*i-10,-10,Str);
}
}
pDC->MoveTo(0,-500);
pDC->LineTo(0,500);
pDC->LineTo(-15,485);
pDC->MoveTo(0,500);
pDC->LineTo(15,485);
for(i=-5;i<=5;i++)
{
pDC->MoveTo(-5,100*i);
pDC->LineTo(5,100*i);
CString Str;
Str.Format(_T("%d"),i);
pDC->TextOut(-20,100*i-5,Str);
}
pDC->TextOut(980,-40,_T("X"));
pDC->TextOut(-40,490,_T("Y"));
}
/////////////////////////////////////////////////////////////////////////////
// CFinalView printing
BOOL CFinalView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CFinalView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CFinalView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CFinalView diagnostics
#ifdef _DEBUG
void CFinalView::AssertValid() const
{
CView::AssertValid();
}
void CFinalView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CFinalDoc* CFinalView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFinalDoc)));
return (CFinalDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CFinalView message handlers
void CFinalView::OnLine() //画直线
{
// TODO: Add your command handler code here
CDC *pDC = GetDC();
CRect rectClient;
GetClientRect(rectClient);
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(2000,1000);
pDC->SetViewportExt(rectClient.right,-rectClient.bottom);
pDC->SetViewportOrg(rectClient.right/2,rectClient.bottom/2);
DialogLineS dlg;
int x0,y0,x1,y1;
if(dlg.DoModal())
{
Linef = dlg.Lineflag;
}
DialogLine dlg1;
if(dlg1.DoModal())
{
x0 = dlg1.m_x0 * 100;
y0 = dlg1.m_y0 * 100;
x1 = dlg1.m_x1 * 100;
y1 = dlg1.m_y1 * 100;
}
if(Linef == 1)
{
int dx,dy,d,UpIncre,DownIncre,x,y;
if(x0>x1)
{
x=x1;x1=x0;x0=x;
y=y1;y1=y0;y0=y;
}
x=x0; y=y0;
dx=x1-x0; dy=y1-y0; d=dx-2*dy;
UpIncre = 2*dx - 2*dy; DownIncre = -2*dy;
while(x<=x1)
{
pDC->SetPixel(x,y,RGB(15,100,255));
x++;
if(d<0)
{
y++;
d+=UpIncre;
}
else
{
d+=DownIncre;
}
}
}
else if(Linef == 2)
{
pDC->MoveTo(x0,y0);
pDC->LineTo(x1,y1);
}
else if(Linef == 3)
{
int dx,dy,epsl,k;
float x,y,xIncre,yIncre;
dx = x1 - x0;
dy = y1 - y0;
x = x0;
y = y0;
if(abs(dx)>abs(dy)) epsl = abs(dx);
else epsl = abs(dy);
xIncre = (float)dx/(float)epsl;
yIncre = (float)dy/(float)epsl;
for(k=0;k<epsl;k++)
{
pDC->SetPixel(int(x+0.5),int(y+0.5),RGB(100,100,0));
x += xIncre;
y += yIncre;
}
}
else
{
int wid,color,x = 1;
DialogPen dlg2;
if(dlg2.DoModal())
{
wid = dlg2.m_wid;
color = dlg2.m_color;
x = dlg2.pen;
}
if(x == 1)
{
CPen MyPen,*OldPen;
MyPen.CreatePen(PS_SOLID,wid,color);
OldPen=pDC->SelectObject(&MyPen);
pDC->MoveTo(x0,y0);
pDC->LineTo(x1,y1);
}
else if(x == 2)
{
CPen MyPen,*OldPen;
MyPen.CreatePen(PS_DASH,wid,color);
OldPen=pDC->SelectObject(&MyPen);
pDC->MoveTo(x0,y0);
pDC->LineTo(x1,y1);
}
}
}
void CFinalView::Circle(int a, int b, int x0, int y0, int color, CDC *pDC)
{
int x=0,y=b;
pDC->SetPixel(x0+x,y0+y,color);
pDC->SetPixel(x0-x,y0+y,color);
pDC->SetPixel(x0+x,y0-y,color);
pDC->SetPixel(x0-x,y0-y,color);
double d1=b*b+a*a*(-b+0.25);
while(b*b*x<a*a*y)
{
if(d1<0)
{
d1+=b*b*(2*x+3);
x++;
}else
{
d1+=(b*b*(2*x+3)+a*a*(-2*y+2));
x++;y--;
}
pDC->SetPixel(x0+x,y0+y,color);
pDC->SetPixel(x0-x,y0+y,color);
pDC->SetPixel(x0+x,y0-y,color);
pDC->SetPixel(x0-x,y0-y,color);
}
double d2=sqrt((double)b*(x+0.5))+sqrt((double)a*(y-1))-sqrt((double)a*b);
while(y>0)
{
if(d2<0)
{
d2+=b*b*(2*x+2)+a*a*(-2*y+3);
x++;y--;
}else
{
d2+=a*a*(-2*y+3);
y--;
}
pDC->SetPixel(x0+x,y0+y,color);
p
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
计算机图形学作业-基于C++实现MFC程序源码+项目说明.zip 【资源介绍】 MFC程序实现: 1.基本图形绘制: Bresenham、DDA、改进的Bresenham、系统库函数四种方法画直线, Bresenham画圆,Bresenham画椭圆,绘制矩形,多边形,圆弧。 2.基本图形变换: 平移变换,比例变换,错切变换,对称变换,旋转变换,复合平移变换,复合比例变换,复合旋转变换,相对任意参考点对称,相对任意参考点旋转,相关任意直线对称。 3.自由曲线绘制: 1次 Bezier曲线,2次 Bezier曲线,3次 Bezier曲线,3次B样条曲线,Hermite三次样条曲线,曲线拼接。 4.图形裁剪和图形填充: 多边形裁剪,绘制填充多边形,有效边表填充算法填充多边形。 建议使用VC++6.0打开工作空间运行程序
资源推荐
资源详情
资源评论
收起资源包目录
计算机图形学作业-基于C++实现MFC程序源码+项目说明.zip (67个子文件)
DialogLine.h 1KB
FinalDoc.cpp 2KB
Final.vcxproj.filters 6KB
DialogPen.h 1KB
项目说明.md 772B
Final.dsw 518B
DialogSymxx.cpp 1KB
DialogColor.cpp 962B
Final.cpp 4KB
DialogPen.cpp 1KB
DialogSymx.h 1KB
Bucket.cpp 525B
FinalDoc.h 1KB
DialogArc.cpp 1KB
resource.h 4KB
FinalView.cpp 38KB
DialogSym.h 1KB
Final.ncb 817KB
DialogShare.cpp 994B
Final.opt 61KB
MainFrm.cpp 2KB
DialogCircle.h 1KB
DialogSymxx.h 1KB
DialogRotate.h 1KB
Final.plg 4KB
DialogShare.h 1KB
res
Final.rc2 397B
Toolbar.bmp 1KB
Final.ico 1KB
FinalDoc.ico 1KB
Final.h 1KB
DialogLine.cpp 1KB
DialogRect.cpp 1KB
DialogBezier3.h 1KB
MainFrm.h 1KB
Final.dsp 7KB
DialogRatio1.cpp 1012B
DialogEllipse.cpp 1KB
DialogTri.cpp 1KB
StdAfx.cpp 207B
DialogCircle.cpp 1KB
Bucket.h 581B
DialogPoly.cpp 951B
DialogBezier3.cpp 1KB
DialogLineS.h 1KB
Final.clw 14KB
DialogColor.h 1KB
DialogEllipse.h 1KB
DialogPoly.h 1KB
AET.CPP 504B
DialogTrans.cpp 996B
Final.sln 1KB
DialogSymx.cpp 982B
DialogRatio1.h 1KB
DialogRect.h 1KB
FinalView.h 4KB
DialogRotate.cpp 1KB
AET.H 522B
StdAfx.h 1KB
DialogLineS.cpp 2KB
DialogTrans.h 1KB
Final.rc 27KB
DialogTri.h 1KB
Final.vcxproj 10KB
Final.vcxproj.user 165B
DialogArc.h 1KB
DialogSym.cpp 2KB
共 67 条
- 1
资源评论
- 回°憶2023-12-09资源太好了,解决了我当下遇到的难题,抱紧大佬的大腿~
- m0_749614562023-11-22这个资源对我启发很大,受益匪浅,学到了很多,谢谢分享~
- 2301_768926412023-12-09怎么能有这么好的资源!只能用感激涕零来形容TAT...
Make程序设计
- 粉丝: 5623
- 资源: 3567
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功