梁友栋算法用多边形裁剪线段


// 计算机图形学View.cpp : C计算机图形学View 类的实现
//

#include "stdafx.h"
#include"math.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "计算机图形学.h"
#endif

#include "计算机图形学Doc.h"
#include "计算机图形学View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// C计算机图形学View

IMPLEMENT_DYNCREATE(C计算机图形学View, CView)

BEGIN_MESSAGE_MAP(C计算机图形学View, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_COMMAND(ID_32773, &C计算机图形学View::liang)
END_MESSAGE_MAP()

// C计算机图形学View 构造/析构

C计算机图形学View::C计算机图形学View()
{
// TODO: 在此处添加构造代码

}

C计算机图形学View::~C计算机图形学View()
{
}

BOOL C计算机图形学View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式

return CView::PreCreateWindow(cs);
}

// C计算机图形学View 绘制

void C计算机图形学View::OnDraw(CDC* /*pDC*/)
{
C计算机图形学Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

CDC* pDC=GetDC();
pDC->Rectangle(10,20,90,80);
int x1=20,y1=10,x2=80,y2=90;
pDC->MoveTo(x1,y1);
pDC->LineTo(x2,y2);
}


// C计算机图形学View 打印

BOOL C计算机图形学View::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}

void C计算机图形学View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}

void C计算机图形学View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清理过程
}


// C计算机图形学View 诊断

#ifdef _DEBUG
void C计算机图形学View::AssertValid() const
{
CView::AssertValid();
}

void C计算机图形学View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

C计算机图形学Doc* C计算机图形学View::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(C计算机图形学Doc)));
return (C计算机图形学Doc*)m_pDocument;
}
#endif //_DEBUG


// C计算机图形学View 消息处理程序


void C计算机图形学View::liang()
{
int x1,x2,y1,y2,xl,xr,yb,yt;
xl=10,xr=90,yb=20,yt=80;
x1=20,y1=10,x2=80,y2=90;
int dx=x2-x1,dy=y2-y1;
int p1=-dx,p2=dx,p3=-dy,p4=dy;
int q1=x1-xl,q2=xr-x1,q3=y1-yb,q4=yt-y1;
float u1,u2,u3,u4;
float umax,umin;
int x11,y11,x22,y22;

if(dx==0)
{ u3=q3/p3,u4=q4/p4;
if(q1<0||q2<0)
exit(0);
if(q1>=0&&q2>=0)
umax=max(u3,0);
umin=min(u4,1);
/* if(p3>0)
{
umin=min(u3,1);
umax=max(u4,0);
}
if(p3<0)
{
umax=max(u3,0);
umin=min(u4,1);
}
if(umax>umin)
exit(0);
if(umax<=umin)
{
x11=x1+umax*(x2-x1);
y11=y1+umax*(y2-y1);
x22=x1+umin*(x2-x1);
y22=x1+umin*(y2-y1);
}
*/

}


if(dy==0)
{
u1=q1/p1;u2=p2/q2;
if(q3<0||q4<0)
exit(0);
if(q3>=0&&q4>=0)
{
umax=(u3,0);
umin=min(u4,1);
}
/*if(p1>0)
{
umin=min(u1,1);
umax=max(u2,0);
}
if(p1<0)
{
umax=max(u1,0);
umin=min(u2,1);
}


if(umax>umin)
exit(0) ;
if(umax<=umin)
{
x11=x1+umax*(x2-x1);
y11=y1+umax*(y2-y1);
x22=x1+umin*(x2-x1);
y22=x1+umin*(y2-y1);
}*/

}


if(dx!=0&&dy!=0)
{
u1=(float)q1/(float)p1,u2=(float)q2/(float)p2,u3=(float)q3/(float)p3,u4=(float)q4/(float)p4;
float umin1,umax1;
umin1=min(u2,1);
umin=min(umin1,u4);
umax1=max(u1,0);
umax=max(umax1,u3);
/* int umin1,umax1;
if(p1>0&&p3>0)
{
umin1=min(u1,1);
umin=min(umin1,u3);
umax1=max(u2,0);
umax=max(umax1,u4);
}
if(p1>0&&p3<0)
{
umin1=min(u1,1);
umin=min(umin1,u4);
umax1=max(u2,0);
umax=max(umax1,u3);
}
if(p1<0&&p3<0)
{
umin1=min(u2,1);
umin=min(umin1,u4);
umax1=max(u3,0);
umax=max(umax1,u1);
}
if(p1<0&&p3>0)
{
umin1=min(u2,1);
umin=min(umin1,u3);
umax1=max(u1,0);
umax=max(umax1,u4);
}
if(umax>umin)
exit(0) ;
if(umax<=umin)
{
x11=x1+umax*(x2-x1);
y11=y1+umax*(y2-y1);
x22=x1+umin*(x2-x1);
y22=x1+umin*(y2-y1);
}
*/
}

if(umax>umin)
exit(0) ;
if(umax<=umin)
{
x11=x1+umax*dx;
y11=y1+umax*dy;
x22=x1+umin*dx;
y22=y1+umin*dy;
}

CDC* pDC=GetDC(); CPen penBlack;
penBlack.CreatePen(PS_SOLID, 3, RGB(0, 0, 255));
CPen* pOldPen = pDC->SelectObject(&penBlack);
pDC->MoveTo(x11,y11);
pDC->LineTo(x22,y22);

}

原文地址:https://www.cnblogs.com/qin5429/p/8986474.html