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



    // 计算机图形学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);

    }

  • 相关阅读:
    7.2对象的生命周期
    7.2.2垃圾收集和对象的终结
    7.1.2验证
    发现电脑上装着liteide,就用golang做一个TCP通讯测试(支持先启动client端和断线重连)
    C++读写局域网共享
    C++编写 动态链接库dll 和 调用dll
    VBA果然很强大
    [Windows]查看运行进程的参数【wmic】
    自旋锁-SpinLock(.NET 4.0+)
    C#并行和多线程编程
  • 原文地址:https://www.cnblogs.com/qin5429/p/8986474.html
Copyright © 2020-2023  润新知