关于直线段裁剪的一个问题

lujie84 2005-12-05 04:00:17
老师给我们布置了一个题目,编一个直线段裁剪的算法,编了好久才编出来,可是运行了半天,来是不对,请高手指点。
caijian3View.cpp
// caijian3View.cpp : implementation of the CCaijian3View class
//

#include "stdafx.h"
#include "caijian3.h"

#include "caijian3Doc.h"
#include "caijian3View.h"

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

/////////////////////////////////////////////////////////////////////////////
// CCaijian3View

IMPLEMENT_DYNCREATE(CCaijian3View, CView)

BEGIN_MESSAGE_MAP(CCaijian3View, CView)
//{{AFX_MSG_MAP(CCaijian3View)
// 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()

/////////////////////////////////////////////////////////////////////////////
// CCaijian3View construction/destruction

CCaijian3View::CCaijian3View()
{
// TODO: add construction code here

}

CCaijian3View::~CCaijian3View()
{
}

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

return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CCaijian3View drawing








typedef struct{ unsigned all;
unsigned left,right,top,bottom;
}OutCode;

void CompOutCode(float x,float y,CRect rect,OutCode *outCode)
{ outCode->all=0;
outCode->top=outCode->bottom=0;
if(y>(float)rect.left)
{
outCode->top=1;
outCode->all+=1;
}
else if(y<(float)rect.bottom)
{
outCode->bottom=1;
outCode->all+=1;
}
outCode->right=outCode->left=0;
if(x>(float)rect.right)
{
outCode->right=1;
outCode->all+=1;
}
else if(x<(float)rect.left)
{
outCode->left=1;
outCode->all+=1;
}
}


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



CRect rect(100,100,200,200);
float x0=50,y0=100,x1=300,y1=300;


pDC->Rectangle(x0,y0,x1,y1);

int accept,done;
OutCode outCode0,outCode1;
OutCode *outCodeOut;
float x,y;
CompOutCode(x0,y0,rect,&outCode0);
CompOutCode(x1,y1,rect,&outCode1);
accept=0;
done=0;


do{
if(outCode0.all==0&&outCode1.all==0)
{accept=1;
done=1;
}
else if(outCode0.all&outCode1.all!=0)
done=1;
else
{
if(outCode0.all!=0)
outCodeOut=&outCode0;
else
outCodeOut=&outCode1;
if(outCodeOut->left)
{
y=y0+(y1-y0)*(rect.left-x0)/(x1-x0);
x=(float)rect.left;
}
else if (outCodeOut->top)
{
x=x0+(x1-x0)*(rect.top-y0)/(y1-y0);
y=(float)rect.top;
}
else if(outCodeOut->right)
{
y=y0+(y1-y0)*(rect.right-x0)/(x1-x0);
x=(float)rect.right;
}
else if(outCodeOut->bottom)
{
x=x0+(x1-x0)*(rect.bottom-x0)/(y1-y0);
y=(float)rect.bottom;
}
if(outCodeOut->all==outCode0.all)
{
x0=x;
y0=y;
CompOutCode(x0,y0,rect,&outCode0);
}
else
{
x1=x;
y1=y;
CompOutCode(x1,y1,rect,&outCode1);
}
}
}while(!done);


if(accept)//这行去掉的化就对了,为什么?
pDC->MoveTo(int(x0),int(y0));
pDC->LineTo(int(x1),int(y1));




}

/////////////////////////////////////////////////////////////////////////////
// CCaijian3View printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CCaijian3View diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CCaijian3View message handlers


关键问题是我把 if(accept)去掉的话程序就正确了,请问这到底是怎么回事啊????
请高手看看啊 !
...全文
129 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
RobinKin 2005-12-11
  • 打赏
  • 举报
回复
不去掉就不move了 。。。。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧