计算机图形学常用算法实现3 多边形扫描转换算法-扫描线算法

2023-11-11

运行环境 vs2015 winform
其他环境只需要替换对应的画点画线算法即可。
这个算法其实很复杂的,实现起来需要有耐心,一步一步按照算法思路来写代码。
在算法中,我使用的是静态链表(c#没有指针-_-||)
下面的AET为活性边表,NET存储新边表
1.定义数组,变量

 class AET//定义AET表,不论是AET还是NET表用的都是这个AET类,因为里面的内容都是一样的
    {
        public float x;
        public float deltax;
        public int ymax;
        public int next;
        public AET()
        {
            x = -1;
            deltax = -1;
            ymax = -1;
            next = -1;
        }
    }
private Point[] polygon = new Point[10000];//多边形,依次连接数组中的各点以及最后一个点和第一个点形成的封闭多边形
private int indexOfPolygon;//多边形点的个数
//定义和初始化AET链表的空间
private AET[] AETSource;
void initAET()
    {
        AETSource = new AET[1000000];
        for (int i = 0; i < 1000000; i++)
        {
            AETSource[i] = new AET();
        }
        AETSourceindex = 0;
    }

2.初始化AET表和NET表
对于AET表的初始化,我们只需要简单的将其赋值为-1,对于NET的话,需要对扫描线进行遍历,把所有低端的定点等于扫描线的值的边加入NET表,因为我们多边形是用点数组来表示的,因此对于低端定点在不同位置需要有不同的写法,此外,对于斜率无穷的线(水平线)需要另外特殊讨论,此前我试过斜率无穷就不加入新边表,会造成扫描线交点的不匹配,使得该行扫描线只填充了一半,写好之后可以注释掉这个判断来试试看。

Graphics g = this.CreateGraphics();
Pen p = new Pen(Brushes.Red);
initAET();
//1.find max and min of y
int ymin = 0x3f3f3f, ymax = 0;
for (int i = 0; i < indexOfPolygon; i++)
{
    if (polygon[i].Y > ymax)
        ymax = polygon[i].Y;
    if (polygon[i].Y < ymin)
        ymin = polygon[i].Y;
}
int mAET = -1;//静态链表只需要一个int表示其在AETSource中的位置即可
int[] mNET = new int[ymax - ymin];
for (int i = 0; i < ymax - ymin; i++)
{
    mNET[i] = -1;
    for (int j = 0; j < indexOfPolygon; j++)
    {
        if (Math.Min(polygon[j].Y, polygon[(j + 1) % indexOfPolygon].Y) == i + ymin )
        {
            if (mNET[i] == -1)//首个
                mNET[i] = AETSourceindex;
            else//非首个,需要找到最后一个
            {
                int index = mNET[i];
                while (AETSource[index].next != -1)
                    index = AETSource[index].next;
                AETSource[index].next = AETSourceindex;
            }
            if (polygon[j].Y == i + ymin)//j为y比较小的值
            {
                AETSource[AETSourceindex].x = polygon[j].X;
                if (polygon[j].Y != polygon[(j + 1) % indexOfPolygon].Y)
                    AETSource[AETSourceindex].deltax = (float)(polygon[(j + 1) % indexOfPolygon].X - polygon[j].X) / (float)(polygon[(j + 1) % indexOfPolygon].Y - polygon[j].Y);
                else
                    AETSource[AETSourceindex].deltax = 0;
                AETSource[AETSourceindex].ymax = polygon[(j + 1) % indexOfPolygon].Y;
                AETSourceindex++;
            }
            el
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机图形学常用算法实现3 多边形扫描转换算法-扫描线算法 的相关文章

  • MFC计算机图形学(3)

    之前我们已经可以画出直线和曲线了 但是算法虽容易理解 xff0c 但是复杂度高 xff0c 今天就介绍比较流行的DDA画线法 xff0c 还有 xff0c 对鼠标进行事件有所响应 xff0c 即 xff0c 在画板上 xff0c 鼠标左键单
  • C#软件开发实例.私人订制自己的屏幕截图工具(九)使用自定义光标,QQ截图时的光标

    本实例全部文章目录 一 功能概览 二 创建项目 注册热键 显示截图主窗口 三 托盘图标及菜单的实现 四 基本截图功能实现 五 针对拖拽时闪烁卡顿现象的优化 六 添加配置管理功能 七 添加放大镜的功能 八 添加键盘操作截图的功能 九 使用自定
  • 计算机图形学 期末复习 微课版 孔令德 五、三维变换与投影 期末复习

    三维几何变换矩阵 为3 3阶子矩阵 对物体进行比例 旋转 反射和错切变换 对图形进行平移变换 三维基本变换 平移变换 比例变换 旋转变换 反射变换 平行投影 平行投影分为正投影和斜投影 投影方向垂直于投影面的平行投影称为正投影 投影方向不垂
  • FBX与Opengl骨骼系统

    转自 http blog csdn net mink365 article details 6328033 FBX是Autodesk提供的一个三维模型格式 由于AutoDesk已经收购了Maya 3D max等流行三维建模软件 FBX可以说
  • 基于QT绘制可交互性的Bezier曲线

    前言 因为项目需要 要做一款类似AI里面的曲率工具出来 其实也类似Photoshop里面的钢笔工具 所以写了个demo来演练一番 之前是不懂Bezier的 但是网上找到的源码都是固定点的 但无论是钢笔工具还是曲率工具都是要能与鼠标键盘交互的
  • 几何检测

    概述 几何检测主要相交性检测 这里的内容大体上是根据 3D数学基础 图形与游戏开发 这本书来的 对于这本书来说 这一部分看完了后面内容就不看了 因为后面讲的太空泛了 有点像一本绝世武功的目录一样 看似很强 其实没什么卵用 1 2D隐式直线上
  • OPENGL学习(一)认识OPENGL和各种库

    认识OPENGL和各种库 opengl 本身是一种标准 告诉你如何一个图形库需要哪些函数 真正这些函数是不同显卡厂商提供的 glu The OpenGL Utility Library OPENGL实用库 就是对OPENGL的更高级的封装
  • wstring 未定义的标识符,include

    wstring str L abcd VS2010提示 wstring未定义的标识符 include
  • 计算机图形学 期末复习 微课版 孔令德 七、建模与消隐 期末复习

    计算机中三维物体的表示有线框模型 表面模型和实体模型3种方法 模型的数据结构 三表结构 立方体的点表 顶点 x坐标 y坐标 z坐标 P0 X0 1 Y0 0 Z0 0 P1 X1 1 Y1 0 Z1 0 P2 X2 1 Y2 1 Z2 0
  • PCL点云边界特征检测 (附完整代码 C++)

    一 概述 点云特征在定义上 以我个人理解 大致可以分为两大类 一类是类似于深度学习的featrue map意义 通过计算一些算子来描述点云局部 这种描述只是一种标识符 并没有实际的几何意义 比如 PFH或者 FPFH 之类的 它们只是通过对
  • (三) 计算机图形学 之 Shader 定义 (顶点 着色器)

    shader 决定材质 跟灯光的作用 shader 属性定义的通用格式 Properties Property Property 相当于一个类的公共变量 Properties 定义一个Int name display name Int 1
  • 万向锁的理解

    万向锁 万向锁这个概念其实还是不大好理解的 看了很多的博客 虽然看起来他们讲的很有道理 可还是想不通 希望我这篇文章能讲清楚 万向锁产生的根本原因是绕三个轴的旋转不是同时进行的 想象一下我们旋转矩阵的推导是不是绕三个轴的旋转矩阵乘起来得到的
  • 计算机图形学常用算法实现3 多边形扫描转换算法-扫描线算法

    运行环境 vs2015 winform 其他环境只需要替换对应的画点画线算法即可 这个算法其实很复杂的 实现起来需要有耐心 一步一步按照算法思路来写代码 在算法中 我使用的是静态链表 c 没有指针 下面的AET为活性边表 NET存储新边表
  • Modern OpenGL---09 纹理(纹理单元可贴多个纹理)

    对之前画的矩形基础上贴上纹理 在片段着色器中 声明一个采样器 表示纹理位置 每个纹理位置叫做纹理单元 比如 0 1等 当只有一个纹理事时 纹理单元默认为0 当有一个以上的纹理时 则需要通过uniform从外部设置每个纹理单元的值 需要注意的
  • BRDF

    前言 现实世界中的表面绝大多数都是凹凸不平的 在这种情况下 可以把表面看成是大量朝向各异的微小光学平面的集合 我们肉眼可见的每个点都包含了很多个这样的微小光学平面 光线照射到这些微小表面上时 同样一部分在表面发生反射 这些朝向不同的微表面把
  • 计算机图形学GAMES101(三)变换(模型、视图、投影)

    补充内容 R 是逆时针方向旋转的矩阵 R 是顺时针方向旋转的矩阵 可以发现R T R 1 像这样的矩阵叫做正交矩阵 以后如果要求往相反的方向旋转相同角度的变换 R 只需要求正向旋转的矩阵然后转置就可以了 本节涉及内容 仿射变换 线性变换 平
  • Ray Tracing in One Weekend01无法查看ppm的问题及一个C++字符缓冲传参引发的bug

    最近在学习光线追踪的经典教程 lt
  • 全局光照算法:reflective shadow maps

    1 技术理解 RSM的全称是reflective shadow maps 受到Instant Radiosity这个离线技术的启发 其思想和ShadowMap的思想近似 在正式介绍和了解这个技术之前 我需要确定RSM用处何在 我想 RTR4
  • GDI+学习笔记7-统计报表的图形绘制

    图形编程 SetPixel 设置指定点的颜色 COLORREF SetPixel HDC hDC int X int Y COLORREF crColor hDC 绘制点的DC X Y 坐标位置 crColor 设置的颜色 返回值为设置颜色
  • 裁剪任意直线段 liang-barshky算法 c

    一 实验目的 使用liang barshky算法实现裁剪任意直线段实验工具 二 实验工具 VC6 0 三 实验步骤 思想 以直线的参数方程为基础 X x1 u x2 x1 Y y1 u y2 y1 裁剪区域是不等式 wxl lt X x1

随机推荐