首页 > 编程语言 >中点算法和Bresenham算法画线

中点算法和Bresenham算法画线

时间:2024-09-26 17:01:03浏览次数:9  
标签:x1 int Bresenham 画线 x2 算法 dy y1 y2

使用EasyX c++库

中点算法直线绘制

//中点算法划线:横向直线绘制
void DDAline(int x1, int y1, int x2, int y2, int color) {
    int x;
    float dx, dy, y, k;
    dx = x2 - x1, dy = y2 - y1;
    if (dx == 0) {
        for (y = min(y1, y2); y < max(y1, y2); y++) {
            putpixel(x1, y, color);
        }
        return;
    }
    k = dy / dx;
    if (x1 < x2)y = y1;
    else y = y2;
    for (x = min(x1, x2); x <= max(x1, x2); x++) {
        putpixel(x, int(y + 0.5), color);
        y = y + k;
    }
}

Bresenham算法直线绘制

//Bresenham算法画线:棋盘纵向网格绘制
void Bresenhamline(int x1, int y1, int x2, int y2, int color) {
    int x;
    float dx, dy, y, e;
    dx = x2 - x1, dy = y2 - y1;
    if (dx == 0) {
        for (y = min(y1, y2); y < max(y1, y2); y++) {
            putpixel(x1, y, color);
        }
        return;
    }
    if (dy == 0) {
        for (x = min(x1, x2); x < max(x1, x2); x++) {
            putpixel(x, y1, color);
        }
        return;
    }
    x = x1, y = y1;
    if (x1 < x2) {
        if (y1 < y2) {
            if (dy <= dx) {
                e = -dx;
                for (int i = 0; i <= dx; i++)
                {
                    putpixel(x, y, color);
                    x++, e = e + 2 * dy;
                    if (e >= 0) {
                        y++; e = e - 2 * dx;
                    }
                }
            }
            else {
                e = -dy;
                for (int i = 0; i <= dy; i++)
                {
                    putpixel(x, y, color);
                    y++, e = e + 2 * dx;
                    if (e >= 0) {
                        x++; e = e - 2 * dy;
                    }
                }
            }
        }
        else {
            if (-dy <= dx) {
                e = -dx;
                for (int i = 0; i <= dx; i++)
                {
                    putpixel(x, y, color);
                    x++, e = e + 2 * dy;
                    if (e <= 0) {
                        y--; e = e + 2 * dx;
                    }
                }
            }
            else {
                e = -dy;
                for (int i = 0; i <= -dy; i++)
                {
                    putpixel(x, y, color);
                    y--, e = e + 2 * dx;
                    if (e >= 0) {
                        x++; e = e + 2 * dy;
                    }
                }
            }
        }
    }
    else { //x = x2, y = y2; 
        if (y1 < y2) {
            if (dy <= -dx) {
                e = -dx;
                for (int i = 0; i <= -dx; i++)
                {
                    putpixel(x, y, color);
                    x--, e = e + 2 * dy;
                    if (e >= 0) {
                        y++; e = e + 2 * dx;
                    }
                }
            }
            else {
                e = -dy;
                for (int i = 0; i <= dy; i++)
                {
                    putpixel(x, y, color);
                    y++, e = e - 2 * dx;
                    if (e >= 0) {
                        x--; e = e - 2 * dy;
                    }
                }
            }
        }
        else {
            if (-dy <= -dx) {
                e = -dx;
                for (int i = 0; i <= -dx; i++)
                {
                    putpixel(x, y, color);
                    x--, e = e + 2 * dy;
                    if (e <= 0) {
                        y--; e = e - 2 * dx;
                    }
                }
            }
            else {
                e = -dy;
                for (int i = 0; i <= -dy; i++)
                {
                    putpixel(x, y, color);
                    y--, e = e + 2 * dx;
                    if (e <= 0) {
                        x--; e = e - 2 * dy;
                    }
                }
            }
        }
    }
}

主函数执行程序

    //绘制网格线

        //直线整体纵向平移需要更改坐标(y1,y2)相同单位
    DDAline(x1, y1 - 50, x2, y2 - 50, BLACK);
    DDAline(x1, y1, x2, y2, BLACK);
        //直线整体横向平移需要更改坐标(x1,x2)相同单位
    Bresenhamline(300, 40, 300, 440, BLACK);
    Bresenhamline(300 - 50, 40, 300 - 50, 440, BLACK);

 

标签:x1,int,Bresenham,画线,x2,算法,dy,y1,y2
From: https://www.cnblogs.com/Cyruswong/p/18433755

相关文章

  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977.有序数组的平方。
    704.二分查找总结:防止int溢出:classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0;intright=nums.size()-1;while(left<=right){intmiddle=(left+right)/2;//intmid=(right-left)/......
  • 算法与数据结构——快速排序
    快速排序快速排序(quicksort)是一种基于分治策略的排序算法,运行高效,应用广泛。快速排序的核心操作是“哨兵划分”,其目标是::选择数组中的某个元素作为“基准数”,将所有小于基准数的元素移到其左侧,而大于基准数的元素移到其右侧。具体流程如下:选取数组最左端元素作为基准数,初始化......
  • JAVA 数据结构与算法 队列的介绍与应用
    一、队列队列是一个有序列表,可以用数组或者链表来实现遵循先入先出的原则。当我们将数据存入队列时称为”addQueue”,addQueue的处理需要有两个步骤:思路分析:将尾指针往后移:rear+1,当front==rear【空】若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所......
  • 字符串从入门到退竞(2)——KMP 算法
    约定在文字描述中字符串下标从\(1\)开始,代码中从\(0\)开始。前缀函数对于长\(n\)的字符串\(S\),其前缀函数是一个长\(n\)的数组(数列)\(\pi\),定义如下:若\(S[1..i]\)有相等的真前缀和真后缀(称之为border),\(\pi[i]\)为其长度的最大值;若不存在,\(\pi[i]=0\)。字符串的......
  • RabbitMq 入门应用 提升性能 : 算法多阶段并行 (Python)
    大问题:我们有一个算法,它可以被分为多个阶段进行(顺序不可颠倒),每个阶段的性能和资源要求不同(且不均衡程度比较高);假设我们现在可以堆资源(较多的CPU和内存),如何将算法各个步骤拆分并进行性能均衡和实现,使得算法性能最大化以满足生产要求?多进程:由于算法有严格的顺序要求,如果是......
  • 老鼠检测、厨房老鼠检测、老鼠识别算法
    老鼠检测算法主要用于家庭、餐饮行业、仓储物流、医疗设施等领域的鼠患监控,通过图像识别技术来检测和识别视频或图像中的老鼠。这种技术可以帮助管理者实时监控老鼠活动,及时采取措施,防止鼠患带来的健康和经济损失。一、技术实现老鼠检测算法通常依赖于计算机视觉和深度学习技术,通......
  • 本科学历能找到人工智能算法岗位的工作吗?好就业吗?
    随着科技的发展,人工智能技术在各行各业的应用日益广泛,催生了大量专注于人工智能的企业,这些企业在招聘网站上发布了众多相关岗位,并且这些岗位的薪资普遍高于其他行业岗位,因此越来越多求职者渴望进入这一行业。对于同样有这一愿景的本科生来说,他们常常会问:“我本科学历能找到人工智能......
  • 【图计算算法‌】基于路径依赖的图计算算法‌
    目录一、基于路径依赖的图计算算法‌概述二、基于路径依赖的图计算算法‌主要特点三、基于路径依赖的图计算算法‌优缺点和改进2.1  基于路径依赖的图计算算法‌优点3.2  基于路径依赖的图计算算法‌缺点3.3  基于路径依赖的图计算算法‌改进四、 基于路径依赖的......
  • 要不要入行大模型算法啊?
    最近又有不少私信问我关于要不要入行大模型之类的问题,年初的时候我写过一篇相同主题的笔记,时隔8个月,今时不同往日,想法确实有些变化,再说一说这个问题。先讨论算法相关的方向,分成三部分吧pretrain、post-training和更偏应用的工作pretrain的机会应该是越来越少了,还能在......
  • [算法] A LITTLE 网络流
    简介所谓网络流,就是给了一张图,有源点和汇点,让你求从源点放水,到汇点的水最多能有多少;这实际上是一个最大流的问题;最大流我们把这张图的每个边看作一条水管,每个水管都有一个容量,那么对于一条从源点到汇点的路径,其最大通过量是这些水管中容量最小的那一个的容量;对于这个问题,我们......