梁友栋算法用多边形裁剪线段
Posted 这个有点难诶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了梁友栋算法用多边形裁剪线段相关的知识,希望对你有一定的参考价值。
// 计算机图形学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);
}
以上是关于梁友栋算法用多边形裁剪线段的主要内容,如果未能解决你的问题,请参考以下文章