实验报告计算机图形学
- 格式:doc
- 大小:46.00 KB
- 文档页数:9
了解梁友栋算法和编码裁剪算法并利用该算法思想实现某一图形或直线段的裁剪,加深对梁友栋算法和编码裁剪算法的理解。
二、实验内容
利用梁友栋算法(参数化线段裁剪算法)或编码裁剪算法变成实现对直线段或者任一图形的裁剪。
三、实验原理
梁友栋算法简介如下:
设线段两端点坐标分别为P1(x1,y1)和P2(x2,y2),则其参数化直线方程可写成下列形式:
0≤u≤1
当u=0时,得点P1,当u=1时,得点P2。线段的裁剪条件可以由下面的不等式表示:Wxl≤x1﹢uΔx≤Wxr;Wyb≤y1﹢uΔy≤Wyt
这四个不等式可以表示为:upk≤qk k=1,2,3,4
其中,参数p,q定义为:
p1﹦-Δx,q1﹦x1﹣Wxl
p2﹦Δx,q2﹦Wxr﹣x1
p3﹦-Δy,q3﹦y1﹣Wyb
p4﹦Δy,q4﹦Wyt﹣y1
下标k=1,2,3,4分别对应裁剪窗口的左、右、下、上四条边界线。如果线段平行于裁剪窗口的某两边界,则必有相应的pk﹦0,如果还满足qk<0,则线段的端点位于窗口外部,即线段在窗口外,应该舍弃。如果qk≥0,线段在窗口内。当pk<0时,直线是从裁剪窗口第k条边界线的外部延伸到内部。当pk>0时,直线是从裁剪窗口第k条边界线的内部延伸到外部。当pk不等于零时,可以计算出线段与第k条裁剪窗口边界线的交点参数:根据定义,对于每条线段,pk中必有两个小于零,而另两个大于零。对于小于零的pk,直线同第k条裁剪窗口边线是从外到内相遇的,此时如果线段同第k条裁剪窗口边界线有交点的话,是参数u从0变大时遇到的,这时计算出相应的rk值,取0和各个rk值之中的最大值记为u1。与此相反,对于大于零的pk,计算出相应的rk值,取1和各个rk值之中的最小值记为u2。两个参数u1和u2定义了在裁剪窗口内的线段部分。如果u1>u2,则线段完全落在裁剪窗口之外,应被舍弃。否则被裁剪线段可见部分的端点由参数u1和u2计算出来。
Windows XP VisualC++6.0
五、实验步骤
进入VisualC++6.0环境,在菜单中选择“FileàNewàProjects”,然后选择“MFCAppWizard(exe)”新建一个工程文件单击“OK”,在弹出的对话框中选择“Single documen t”,单击“Finish”,在VisualC++6.0编程界面中选择CMyView单击右键,选择“Add Member Function”,在弹出的对话框中添写“void”和函数名。
// 图形裁减View.cpp : implementation of the CMyView class
//
#include "stdafx.h"
#include "图形裁减.h"
#include "图形裁减Doc.h"
#include "图形裁减View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyView
IMPLEMENT_DYNCREATE(CMyView, CView)
BEGIN_MESSAGE_MAP(CMyView, CView)
//{{AFX_MSG_MAP(CMyView)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction
CMyView::CMyView()
{
// TODO: add construction code here
}
CMyView::~CMyView()
{
}
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMyView drawing
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
LINECLIP();
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CMyView printing
BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}