WU反走样算法

news2025/3/19 1:04:26

WU反走样算法

由离散量表示连续量而引起的失真称为走样,用于减轻走样现象的技术成为反走样,游戏中称为抗锯齿。走样是连续图形离散为想想点后引起的失真,真实像素面积不为 零。走样是光栅扫描显示器的一种固有现象,只能减轻,不可避免。

在这里插入图片描述

原理

Wu 反走样算法是对距离进行加权的反走样算法。

空间混色原理指出,人眼对某一区域颜色的识别是取这个区域颜色的平均值,Wu 反走样算法原理是对理想直线上的任一点,同时用两个不同亮度等级的相邻像素来表示。

算法

  1. 确定直线起点 P 0 P_0 P0 的坐标 ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 和终点 P 1 P_1 P1 的坐标 ( x 1 , y 1 ) (x_1, y_1) (x1,y1)
  2. 定义直线当前点坐标 x , y x, y x,y 下方像素点和直线的距离 e e e 直线的斜率 k k k
  3. 把当前点设置为直线的起点,也就是 x = x 0 , y = y 0 x=x_0, y=y_0 x=x0,y=y0 并且设置 e e e 的初始值 0;
  4. 设置像素点 ( x , y ) (x, y) (x,y) 的亮度为 R G B ( e ∗ 255 , e ∗ 255 , 2 ∗ 255 ) RGB (e *255, e *255, 2 *255) RGB(e255,e255,2255), 设置像素点 ( x , y + 1 ) (x, y+1) (x,y+1) 的亮度为 R G B ( ( 1 − e ) ∗ 255 , ( 1 − e ) ∗ 255 , ( 1 − e ) ∗ 255 ) RGB((1-e)*255, (1-e)*255, (1-e)*255) RGB((1e)255,(1e)255,(1e)255)
  5. 计算 e = e + k e = e + k e=e+k,判断 e e e 是否大于等于 1, 若 e ≥ 1 e \geq 1 e1 x x x y y y 方向都要递增,并且 e = e − 1 e=e-1 e=e1,否则 y y y 方向不递增;
  6. 如果 x < x 1 x < x_1 x<x1 重新计算 (4) 和 (5) 否则结束。
void WUAntiLine(QPainter* painter, QPoint P0, QPoint P1) {
    int dx = P1.x() - P0.x();
    int dy = P1.y() - P0.y();

    double k = static_cast<double>(dy) / dx;
    double e = 0.0;

    for (int x = P0.x(), y = P0.y(); x < P1.x(); x++) {
        qreal intensity = 1.0 - e;

        QColor color1(255 * intensity, 255 * intensity, 255 * intensity);
        QColor color2(255 * e, 255 * e, 255 * e);

        painter->setPen(color1);
        painter->drawPoint(x, y);

        painter->setPen(color2);
        painter->drawPoint(x, y + 1);

        e += k;

        if (e >= 1.0) {
            y++;
            e--;
        }
    }
}
#include <QApplication>
#include <QPainter>
#include <QWidget>

void WUAntiLine(QPainter* painter, QPoint P0, QPoint P1) {
    int dx = P1.x() - P0.x();
    int dy = P1.y() - P0.y();

    double k = static_cast<double>(dy) / dx;
    double e = 0.0;

    for (int x = P0.x(), y = P0.y(); x < P1.x(); x++) {
        qreal intensity = 1.0 - e;

        QColor color1(255 * intensity, 255 * intensity, 255 * intensity);
        QColor color2(255 * e, 255 * e, 255 * e);

        painter->setPen(color1);
        painter->drawPoint(x, y);

        painter->setPen(color2);
        painter->drawPoint(x, y + 1);

        e += k;

        if (e >= 1.0) {
            y++;
            e--;
        }
    }
}

class MyWidget : public QWidget {
public:
    MyWidget(QWidget* parent = nullptr) : QWidget(parent) {
        setFixedSize(800, 600);
    }

protected:
    void paintEvent(QPaintEvent* event) override {
        Q_UNUSED(event);

        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing, true);
        QPoint P0(100, 100);
        QPoint P1(500, 500);
        WUAntiLine(&painter, P0,P1);

    }
};


int main(int argc, char* argv[]) {
    QApplication app(argc, argv);

    MyWidget widget;
    widget.show();

    return app.exec();
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1336177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA分频电路设计(2)

实验要求&#xff1a; 采用 4 个开关以二进制形式设定分频系数&#xff08;0-10&#xff09;&#xff0c;实现对已知信号的分频。 类似实验我之前做过一次&#xff0c;但那次的方法实在是太笨了&#xff1a; 利用VHDL实现一定系数范围内的信号分频电路 需要重做以便将来应对更…

B+树索引和哈希索引的区别?

B树是一个平衡的多叉树&#xff0c;从根节点到每个叶子节点的高度差值不超过1&#xff0c;而且同层级的节点间有指针相互链接&#xff0c;是有序的&#xff0c;如下图&#xff1a; 哈希索引就是采用一定的哈希算法&#xff0c;把键值换算成新的哈希值&#xff0c;检索时不需要类…

STM32独立看门狗

时钟频率 40KHZ 看门狗简介 STM32F10xxx 内置两个看门狗&#xff0c;提供了更高的安全性、时间的精确性和使用的灵活性。两个看 门狗设备 ( 独立看门狗和窗口看门狗 ) 可用来检测和解决由软件错误引起的故障&#xff1b;当计数器达到给 定的超时值时&#xff0c;触发一个中…

MyBatis中select语句中使用String[]数组作为参数

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;无 &#x1f33c…

CMakeLists.txt

源码结构 生成可执行程序 # CMake最小版本号 cmake_minimum_required(VERSION 3.15.0)#增加-stdc11 set(CMAKE_CXX_STANDARD 11)#设置工程名称 project(calculate)#[[ #方法一&#xff1a;添加源码文件 #aux_source_directory(< dir > < variable >) #dir&#xf…

Netty组件基础

Netty入门简介 netty是一个异步、基于事件驱动的网络应用框架&#xff0c;用于快速开发可维护、高性能的网络服务器和客户端。 Netty优势 Netty解决了TCP传输问题&#xff0c;如黏包、半包问题&#xff0c;解决了epoll空轮询导致CPU100%的问题。并且Netty对API进行增强&#xf…

Github 2023-12-26开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-26统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目7非开发语言项目1JavaScript项目1TypeScript项目1 GPT PILOT: 从头开始编写可扩展的应用程序的开发…

MVC下的四种验证编程方式

ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表&#xff0c;但是在真正执行目标Action方法之前&#xff0c;还需要对绑定的参数实施验证以确保其有效性&#xff0c;我们将针对参数的验证成为Model绑定。总地来说&#xff0c;我们可以采用4种不同的编程模式来进行针…

北亚服务器数据恢复-服务器断电导致raid5故障的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器有一组由12块硬盘组建的raid5阵列。 服务器故障&分析&#xff1a; 机房供电不稳导致服务器意外断电&#xff0c;工作人员重启服务器后发现服务器无法正常使用。 根据故障情况&#xff0c;北亚企安数据恢复工程师初步判断服务器故障原…

【深度学习目标检测】十一、基于深度学习的电网绝缘子缺陷识别(python,目标检测,yolov8)

YOLOv8是一种物体检测算法&#xff0c;是YOLO系列算法的最新版本。 YOLO&#xff08;You Only Look Once&#xff09;是一种实时物体检测算法&#xff0c;其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化&#xff0c;提高了检测速度和准确性。…

408计算机网络错题知识点拾遗

个人向错题相关部分整理&#xff0c;涵盖真题、模拟、课后习题等。 408相关&#xff1a; 408数据结构错题知识点拾遗 408计算机网络错题知识点拾遗 计网复习资料下载整合 已进行资源绑定&#xff0c;相关计网复习资料上方下载。 第一章 计算机网络体系结构 第二章 物理层 第三…

H.266/VVC 关键帧内预测技术

在 VVC 中&#xff0c;帧内预测过程分为三个步骤&#xff1a;首先&#xff0c;从当前 CU 左侧和上方相 邻块获取参考像素&#xff0c;并对获取的参考像素值进行平滑滤波。其次&#xff0c;基于参考像素 预测得到当前 CU 像素值。最后为了提高预测像素值的精度&#xff0c;平滑滤…

【数据库系统概论】第3章-关系数据库标准语言SQL(3)

文章目录 3.5 数据更新3.5.1 插入数据3.5.2 修改数据3.5.3 删除数据 3.6 空值的处理3.7 视图3.7.1 建立视图3.7.2 查询视图3.7.3 更新视图3.7.4 视图的作用 3.5 数据更新 3.5.1 插入数据 注意&#xff1a;插入数据时要满足表或者列的约束条件&#xff0c;否则插入失败&#x…

类加载器及其类加载子系统

类加载器子系统作用 类加载器子系统的作用是负责将字节码文件加载到内存中&#xff0c;并将其转化为能够被虚拟机直接使用的形式。它是Java虚拟机的一部分&#xff0c;具体作用如下&#xff1a; 加载 类加载器负责将类的字节码文件加载到虚拟机的方法区中&#xff0c;以便…

通过自然语言处理增强推荐系统:协同方法

一、介绍 自然语言处理 (NLP) 是人工智能的一个分支&#xff0c;专注于使机器能够以有意义且有用的方式理解、解释和响应人类语言。它包含一系列技术&#xff0c;包括情感分析、语言翻译和聊天机器人。 另一方面&#xff0c;推荐系统&#xff08;RecSys&#xff09;是旨在向用户…

elasticsearch 笔记二:搜索DSL 语法(搜索API、Query DSL)

文章目录 一、搜索 API1. 搜索 API 端点地址2. URI Search3. 查询结果说明5. 特殊的查询参数用法6. Request body Search6.1 query 元素定义查询6.2 指定返回哪些内容**6.2.1 source filter 对_source 字段进行选择****6.2.2 stored_fields 来指定返回哪些 stored 字段****6.2.…

【Azure 架构师学习笔记】- Power Platform(1) - 简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Power Platform】系列。 Power Platform 它是一个SaaS平台&#xff0c;支持和延伸M365&#xff0c; Dynamics 365和Azure甚至其他第三方服务。主要提供低代码&#xff0c;自动化&#xff0c;数据驱动和定制化业务逻辑的服务…

PSINS四元数转换函数rv2q

pins中的关于四元数转换 cquat rv2q(const cvect3* rv) 函数 代码对应的公式&#xff0c;第一个 第二个 其他 理解公式&#xff1a; 四元数的表示&#xff0c;与三角函数之间的关系 &#xff0c;矢量&#xff08;x,,y&#xff0c;z&#xff09; 旋转角度为a&#xff0c; 矢量变…

c# OpenCvSharp 检测(斑点检测、边缘检测、轮廓检测)(五)

在C#中使用OpenCV进行图像处理时&#xff0c;可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。 斑点检测边缘检测轮廓检测 一、斑点检测&#xff08;Blob&#xff09; 斑点检测是指在图像中找到明亮或暗的小区域&#xff08;通常表示为斑点&#xff09;&#…

数据结构之<堆>的介绍

1.简介 堆是一种特殊的数据结构&#xff0c;通常用于实现优先队列。堆是一个可以被看作近似完全二叉树的结构&#xff0c;并且具有一些特殊的性质&#xff0c;根据这些性质&#xff0c;堆被分为最大堆&#xff08;或者大根堆&#xff0c;大顶堆&#xff09;和最小堆两种。 2.…