【计算机图形学】实验四:线段裁剪

简介: 【计算机图形学】实验四:线段裁剪

1. 实验内容

采用Ivan Sutherland算法(编码裁剪算法)实现二维线段裁剪。要求:以金刚石图案中圆周的最上点和最右点构成的窗口对该图案进行裁剪。

2. 实验环境

Visual Studio 2022、图形学实验程序框架、Windows11系统

3. 问题分析

image.png


image.png

image.png


image.png

4. 算法设计

image.png

5. 源代码

//编码
int CDiamondView::Encode(int x,int y) {
  int res = 0;
  if (x < RectP1.x)
    res = res | 1;
  if (x > RectP2.x)
    res = res | 2;
  if (y < RectP1.y)
    res = res | 8;
  if (y > RectP2.y)
    res = res | 4;
  return res;
}
void CDiamondView::cutLine(POINT p1, POINT p2) {
  CDC* pDC = GetDC();
  CPen newPen, * oldPen;
  newPen.CreatePen(PS_SOLID, 2, RGB(0, 255, 0));
  oldPen = pDC->SelectObject(&newPen);
  int done = 0, accept = 0, reject = 0;
  while (done != 1) {
    int c1 = Encode(p1.x, p1.y);
    int c2 = Encode(p2.x, p2.y);
    if ((c1 & c2) != 0) {
      reject = 1;
      done = 1;
    }
    else if (c1 == 0 && c2 == 0) {
      accept = 1;
      done = 1;
    }
    else {
      if (c1 == 0) {
        POINT t = p1;
        p1 = p2;
        p2 = t;
        int temp = c1;
        c1 = c2;
        c2 = temp;
      }
      if (c1 & 1) {
        int x = RectP1.x;
        int y = (p2.y - p1.y) * 1.0 / ((p2.x - p1.x) * 1.0) * (x - p1.x) + p1.y;
        p1.x = x;
        p1.y = y;
      }
      if (c1 & 2) {
        int x = RectP2.x;
        int y = (p2.y - p1.y) * 1.0 / ((p2.x - p1.x) * 1.0) * (x - p1.x) + p1.y;
        p1.x = x;
        p1.y = y;
      }
      if (c1 & 4) {
        int y = RectP2.y;
        int x = (p2.x - p1.x) * 1.0 / ((p2.y - p1.y) * 1.0) * (y - p1.y) + p1.x;
        p1.x = x;
        p1.y = y;
      }
      if (c1 & 8) {
        int y = RectP1.y;
        int x = (p2.x - p1.x) * 1.0 / ((p2.y - p1.y) * 1.0) * (y - p1.y) + p1.x;
        p1.x = x;
        p1.y = y;
      }
    }
  }
  if (accept) {
    pDC->MoveTo(p1.x, p1.y);
    pDC->LineTo(p2.x, p2.y);
  }
  pDC->SelectObject(oldPen);
  return;
}
//线段裁剪
//裁剪窗口左上角顶点为RectP1,右下角顶点为RectP2,是CDiamondView的成员
void CDiamondView::Cut()
{
  IsCutting = FALSE;
  //以下添加您的代码
  int nVertex = 21;
  int radius = 150;
  POINT* pnt = new POINT[nVertex];
  const double PI = 3.14159265;
  double theta = 2 * PI / nVertex;
  for (int i = 0; i < nVertex; i++) {
    pnt[i].x = radius * cos(i * theta) + MaxX() / 2;
    pnt[i].y = radius * sin(i * theta) + MaxY() / 2;
  }
  for (int i = 0; i < nVertex; i++) {
    for (int j = i + 1; j < nVertex; j++) {
      cutLine(pnt[i], pnt[j]);
    }
  }
}

6.程序运行结果

如图,正确地绘制出了金刚石图案。

如图,正确地对金刚石图形进行了裁剪。选取金刚石的中间部分作为裁剪窗口,裁剪窗口区域内的线条变为绿色。

7. 总结


目录
相关文章
|
1月前
|
存储 算法 图形学
【计算机图形学】实验二 用扫描线算法实现多边形填充
【计算机图形学】实验二 用扫描线算法实现多边形填充
46 2
|
1月前
|
算法 图形学
【计算机图形学】实验三 用Cohen-Sutherland裁剪算法实现直线段裁剪
【计算机图形学】实验三 用Cohen-Sutherland裁剪算法实现直线段裁剪
212 2
|
1月前
|
算法 图形学
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
85 2
|
17天前
|
算法 BI 计算机视觉
图像处理之积分图应用一(半径无关的快速模糊算法)
图像处理之积分图应用一(半径无关的快速模糊算法)
11 0
|
1月前
|
计算机视觉
OpenCV(二十七):图像距离变换
OpenCV(二十七):图像距离变换
28 0
|
1月前
[Halcon&几何] 直线的垂线与延长线的计算
[Halcon&几何] 直线的垂线与延长线的计算
176 1
|
1月前
|
文字识别 Python
Halcon 学习笔记五:几何定位+仿射变换+测量
Halcon 学习笔记五:几何定位+仿射变换+测量
217 0
|
9月前
|
机器学习/深度学习 传感器 算法
【配色优化】基于遗传算法进行图形着色优化附matlab代码
【配色优化】基于遗传算法进行图形着色优化附matlab代码
|
12月前
|
数据可视化 C++
【影像配准】配准之棋盘网格图(镶嵌图像)(附有 C++ 代码)
【影像配准】配准之棋盘网格图(镶嵌图像)(附有 C++ 代码)
|
11月前
|
编解码 算法 计算机视觉
【OpenCV • c++】几何检测 —— 霍夫变换 | 霍夫直线检测 | 霍夫线变化
【OpenCV • c++】几何检测 —— 霍夫变换 | 霍夫直线检测 | 霍夫线变化
308 0