WU反走样算法

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.mfbz.cn/a/271192.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Drogon Win11 编译 /MT

Drogon是一个基于C17/20的Http应用框架&#xff0c;使用Drogon可以方便的使用C构建各种类型的Web应用服务端程序。 Drogon的主要应用平台是Linux&#xff0c;也支持Mac OS、FreeBSD和Windows。 它的主要特点如下&#xff1a; 网络层使用基于epoll(macOS/FreeBSD下是kqueue)的…

nginx反向代理服务器及负载均衡服务配置

一、正向代理与反向代理 正向代理&#xff1a;是一个位于客户端和原始服务器(oricin server)之间的服务器&#xff0c;为了从原始服务器取得内容&#xff0c;客户端向代理发送一个请求并指定目标(原始服务器)&#xff0c;然后代理向原始服务器转交请求并将获得的内容返回给客户…

Matlab/Simulink的一些功能用法笔记(3)

01--引言 最近加入到一个项目组&#xff0c;有一些测试需要去支持&#xff0c;通过了解原先团队的测试方法后&#xff0c;自己作了如下改善&#xff0c;大大提高了工作效率。这也许就是软件开发的意义吧&#xff0c;能够去除一些重复的机械的人工操作并且结果还非常不可靠。 …

Discrete Time Signals and Systems

Discrete Time Signals and Systems 文章目录 Discrete Time Signals and SystemsSignal classificationbasic signalOperation on signalSystem of discrete signalLinear systems and nonlinear systemsCausal and non-causal SystemsTime-varying and time-invariant system…

助力打造清洁环境,基于美团最新YOLOv6-4.0开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统

公共社区环境生活垃圾基本上是我们每个人每天几乎都无法避免的一个问题&#xff0c;公共环境下垃圾投放点都会有固定的值班时间&#xff0c;但是考虑到实际扔垃圾的无规律性&#xff0c;往往会出现在无人值守的时段内垃圾堆放垃圾桶溢出等问题&#xff0c;有些容易扩散的垃圾比…

使用travelbook架设自己的实时位置共享服务

travelbook 是一款开源的安卓APP&#xff0c;它能以低功耗提供实时位置共享&#xff0c;它包含功能如下&#xff1a; 好友之间分享实时位置&#xff1b;记录行程轨迹&#xff1b;标记收藏地点&#xff1b; 这款软件的主要解决的问题包括&#xff1a; 场景1&#xff1a;查看老…

【开源】基于Vue+SpringBoot的新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

安防视频云平台/可视化监控云平台EasyCVR如何快速定位占用大量存储空间的文件?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

【Vue2+3入门到实战】(4)Vue基础之指令修饰符 、v-bind对样式增强的操作、v-model应用于其他表单元素 详细示例

目录 一、今日学习目标1.指令补充 二、指令修饰符1.什么是指令修饰符&#xff1f;2.按键修饰符3.v-model修饰符4.事件修饰符 三、v-bind对样式控制的增强-操作class1.语法&#xff1a;2.对象语法3.数组语法4.代码练习 四、京东秒杀-tab栏切换导航高亮1.需求&#xff1a;2.准备代…

小白的实验室服务器深度学习环境配置指南

安装nvidia 本文在ubuntu server 22.04上实验成功&#xff0c;其他版本仅供参考 注意&#xff0c;本文仅适用于ubuntu server&#xff0c;不需要图形界面&#xff0c;没有对图形界面进行特殊考虑和验证&#xff01;依赖图形操作界面的读者慎用 查看是否安装了gcc gcc -v若没…

如何快速删除pdf周围的空白

问题&#xff1a;写论文往往需要pdf格式的图片&#xff0c;但pdf往往四周存在大量空白需要手动截图很麻烦 解决&#xff1a; 打开命令行输入&#xff1a;pdfcrop 图片名.pdf

【Mysql】InnoDB统计数据的收集(十三)

我们前边在计算查询成本的时候会用到一些统计数据&#xff0c;比如通过 SHOW TABLE STATUS 可以看到关于表的统计数据&#xff0c;通过 SHOW INDEX 可以看到关于某个索引的统计数据&#xff0c;那么这些统计数据是怎么来的呢&#xff1f;本章节将分享 InnoDB 存储引擎的统计数据…

深圳锐科达SIP矿用电话模块SV-2801VP

深圳锐科达SIP矿用电话模块SV-2801VP 一、简介 SV-2800VP系列模块是我司设计研发的一款用于井下的矿用IP音频传输模块&#xff0c;可用此模块打造一套低延迟、高效率、高灵活和多扩展的IP矿用广播对讲系统&#xff0c;亦可对传统煤矿电话系统加装此模块&#xff0c;进行智能化…

在Vue3中使用vue-qrcode库实现二维码生成

本文主要介绍在Vue3中使用qrcode库实现二维码生成的方法。 目录 一、基础用法实现vue-qrcode库的参数介绍 在Vue3中实现二维码生成需要使用第三方库来处理生成二维码的逻辑。常用的库有 qrcode和 vue-qrcode。 一、基础用法实现 在Vue3中使用vue-qrcode库实现二维码生成的方…

记录一次云主机故障排查

云上某云主机&#xff0c;在安全组test-a中&#xff0c;同一安全组下还有另外两台主机。 从本地可以ping 通另外两台主机的公网地址。但是不能ping通这个主机的公网地址。 与是重启主机&#xff0c;发现问题依然存在。依然是不能ping 通&#xff0c;主机上部署的业务也不能访…

LabVIEW在齿轮箱故障诊断中的应用

LabVIEW在齿轮箱故障诊断中的应用 在现代机械工业中&#xff0c;齿轮箱作为重要的传动设备&#xff0c;其性能稳定性对整体机械系统的运行至关重要。故障的及时诊断和处理不仅保障了设备的稳定运行&#xff0c;还减少了维护成本。利用LabVIEW强大数据处理和仿真能力&#xff0…

新版IDEA中Git的使用(二)

说明&#xff1a;前面介绍了在新版IDEA中Git的基本操作&#xff0c;本文介绍关于分支合并、拉取等操作&#xff1b; 例如&#xff0c;现在有一个项目&#xff0c;分支如下&#xff1a; main&#xff1a;主分支&#xff1b; dev&#xff1a;开发分支&#xff1b; test&#x…

Springboot整合MVC进阶篇

一、概述 1.1SpringBoot整合SpringMVC配置 SpringBoot对SpringMVC的配置主要包括以下几个方面&#xff1a; 自动配置&#xff1a;SpringBoot会自动配置一个嵌入式的Servlet容器&#xff08;如Tomcat&#xff09;&#xff0c;并为我们提供默认的SpringMVC配置。这样我们无需手动…

【Java、Python】获取电脑当前网络IP进行位置获取(附源码)

我相信看到这篇博客的时候心里肯定是想解决自己的一个问题的&#xff0c;而这篇博客我就以简单快速的方式解决这些烦恼&#xff01; 一、获取当前IP 在Java中自带了一些自己的流对象来获取当前的IP地址&#xff0c;不多说我们直接上代码。 //获取当前网络ip地址 ipAddress Ine…

在k8s中将gitlab-runner的运行pod调度到指定节点

本篇和前面的 基于helm的方式在k8s集群中部署gitlab 具有很强的关联性&#xff0c;因此如果有不明白的地方可以查看往期分享&#xff1a; 基于helm的方式在k8s集群中部署gitlab - 部署基于helm的方式在k8s集群中部署gitlab - 备份恢复基于helm的方式在k8s集群中部署gitlab - 升…