沿着“bresenham”线平滑颜色插值

2024-04-01

我正在尝试沿一条线插值颜色,以便给定两个点及其各自的 RGB 值,我可以绘制一条具有平滑颜色渐变的线。使用布雷森纳姆的线条算法,我现在可以绘制线条,但不确定如何开始在两个端点之间插值颜色。以下是 drawLine() 函数的一部分,适用于斜率小于 1 的所有直线。

    int x_start = p1.x, x_end = p2.x, y_start =p1.y, y_end = p2.y;
    int dx = Math.abs(x_end-x_start), dy = Math.abs(y_end-y_start);

    int x = x_start, y = y_start;       
    int step_x = x_start < x_end ? 1:-1;
    int step_y = y_start < y_end ? 1:-1;

    int rStart = (int)(255.0f * p1.c.r), rEnd = (int)(255.0f * p2.c.r);
    int gStart = (int)(255.0f * p1.c.g), gEnd = (int)(255.0f * p2.c.g);
    int bStart = (int)(255.0f * p1.c.b), bEnd = (int)(255.0f * p2.c.b);

    int xCount = 0;


//for slope < 1
        int p = 2*dy-dx;
        int twoDy = 2*dy, twoDyMinusDx = 2*(dy-dx);         
        int xCount = 0;

        // draw the first point
        Point2D start = new Point2D(x, y, new ColorType(p1.c.r, p1.c.g, p1.c.b));           
        drawPoint(buff, start);

        float pColor = xCount / Math.abs((x_end - x_start));
        System.out.println(x_end + "  " + x_start);

        while(x != x_end){
            x+= step_x;
            xCount++;
            if(p<0){
                p+= twoDy;
            }
            else{
                y += step_y;
                p += twoDyMinusDx;
            }

            Point2D draw_line = new Point2D(x, y, new ColorType(p1.c.r*(1-pColor)+p2.c.r*pColor,p1.c.g*(1-pColor)+p2.c.g*pColor,p1.c.b*(1-pColor)+p2.c.b*pColor));
            System.out.println(pColor);
            drawPoint(buff,draw_line );
        }

所以我的想法是,就像画线一样,我也需要某种决策参数 p 来确定何时更改 RGB 值。我正在考虑类似的事情x 增量,查看每个 rgb 值并决定是否要操纵它们.

我初始化了 rStart 和 rEnd(g 和 b 等),但不知道从哪里开始。任何形式的帮助或建议将不胜感激!

编辑:感谢@Compass 的好建议!现在,我在尝试实施该策略时遇到了另一个错误,我几乎可以肯定这是一个简单的错误。我只是现在看不到它。由于某种原因我的pColor总是返回0,我不知道为什么。我运行了一些打印语句以确保 xCount 确实在增加,所以我不确定还有什么可能使该变量始终为 0。


我记得在我学习 GUI 的时候就解决了这个问题!我将为您解释基本概念。

假设我们有两种颜色, RGB(A,B,C) 和 RGB(X,Y,Z) 为了简单起见。

如果我们知道沿线的百分比位置(我们将其称为 P,浮点数 0 表示开始,1.0 表示结束),我们可以使用以下方法计算那里应该有什么颜色:

Resultant Color = RGB(A*(1-P)+X*P,B*(1-P)+Y*P,C*(1-P)+Z*P)

换句话说,您可以平均沿线的各个 RGB 值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

沿着“bresenham”线平滑颜色插值 的相关文章

随机推荐

  • Laravel 4 无法运行整个 RAW 查询

    我想使用 laravel 的 DB 类来执行 mysql 查询 但 Laravel 提供的功能都不起作用 这些都不起作用 DB statement DB select DB raw DB update DB select DB raw 这是
  • 转义字符串以在 XML 中使用

    我正在使用Python的xml dom minidom创建 XML 文档 逻辑结构 gt XML 字符串 而不是相反 如何让它转义我提供的字符串 这样它们就不会弄乱 XML 像这样的东西吗 gt gt gt from xml sax sax
  • 如何将 AWS WAF 与应用程序 ELB 结合使用

    我需要对 AWS 上托管的 Web 应用程序使用 AWS WAF 以为其提供额外的基于规则的安全性 我找不到任何方法直接将 WAF 与 ELB 结合使用 并且 WAF 需要 Cloudfront 添加 WEB ACL 以根据规则阻止操作 因
  • 在Interface Builder中设计UITableView的节标题

    我有一个xib文件带有UITableView我想使用委托方法添加自定义节标题视图tableView viewForHeaderInSection 有没有可能设计成Interface Builder然后以编程方式更改其一些子视图属性 My U
  • 遗留代码中的泛型

    我们有相当多的代码刚刚跳转到 Java 5 我们一直在那些打算在 Java 5 版本中发布的组件中使用泛型 但是剩下的代码当然充满了原始代码类型 我已将编译器设置为生成原始类型错误并开始手动清除它们 但按照目前的速度 这将需要very很长时
  • 什么样的日志记录对您的应用程序来说是好的日志记录?

    因此 我们已经讨论了在我的工作地点进行登录 我想知道这里的一些人是否可以给我一些关于你们的方法的想法 通常我们的场景是 根本没有日志记录 并且大多数是 NET 应用程序 winforms WPF 客户端通过 Web 服务进行通信或直接与数据
  • 如何知道推送通知发送状态

    我正在应用程序中使用推送通知 一切都很顺利 有时从服务器发送的消息但在应用程序端它没有收到 在这种情况下 我必须知道缺少哪条消息无法传递 应用程序未收到 有没有办法从服务器端知道应用程序收到了哪些消息 哪些没有收到 不 推送通知是一劳永逸的
  • 如何在 Laravel Passport 中获取刷新令牌?

    我正在使用 Laravel 6 7 并尝试使用Passport用于用户身份验证 我可以在用户注册时为他们创建访问令牌 这是代码 user User create input user gt createToken auth token 正如
  • NUnit 与 Windows Phone 7 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想使用 NUnit 对我的 Windows Phone 7 库进行单元测试 是否有与 Windows Phone 7 兼容的 NUnit
  • 通过 React App 的数据表按钮

    在 React 中工作时 我在尝试添加 Excel 导出按钮时遇到了问题 我认为它与导入有关 但在这方面我在网上找不到太多与 React 和 DataTables net 相关的帮助 我只希望用户能够下载到 Excel 这些是我与 jque
  • 我在使用 log4js-protractor-appender 时遇到麻烦

    我的 log4js js 文件代码 use strict var log4js require log4js var log4jsGen getLogger function getLogger log4js loadAppender fi
  • 模块错误“模块是使用不兼容的 Kotlin 版本编译的。其元数据的二进制版本是 1.5.1,预期版本是 1.1.16”

    我正在为我们的项目编写一个 kotlin 库 完成后 我构建了一个 aar 文件并将其发送给团队 但他们有一个错误 Module was compiled with an incompatible version of Kotlin The
  • 如何使用tensorflow keras在网络中一起使用嵌入层和其他特征列

    让我们考虑一个包含 6 列和 10 行的示例数据集 这 3 列是数字 其余 3 列是分类变量 分类列被转换为大小为 10x3 的多热编码数组 我有目标列 我想要预测它也是分类变量 它可以再次采用 3 个可能的值 这一列是一个热编码的列 现在
  • Webpack 开发服务器 (webpack-dev-server) 热模块替换 (HMR) 不起作用

    我已经在 StackOverflow 和 GitHub 问题上查看了许多答案 但是 我仍然陷入 Webpack 中的热模块替换中 我在用npm start运行我的服务器webpack dev server hot inline 我正在尝试更
  • 如何使用 FOP 在 XSL-FO 中保留表头但允许在表体内分页

    我正在使用 Apache FOP 和 XSL FO 样式表生成 PDF 在 PDF 中 我输出属于表格的标题 html 相当于 h1 因此应始终保持在一起 但是 我的表格也可能包含太多数据 以至于一页纸上不一定能容纳得下 期望的结果是一个规
  • 如何防止可拖动的子元素相互拖动?

    如何防止可拖动子元素在绝对位置相互拖动 就像是 if firstChild position left gt secondChild position left this draggable disabled true 但这只会在停止拖动时
  • 从android将多个图像保存到mysql php中,但只插入一张图像

    我在活动 A 中有三个列表视图 如下所示 当提交button点击后 文字和图片路径将被保存到MySQL和image将被存储在PhotoUpload文件夹 我能够将 3 个文本存储到 MySQL 中 但问题是只有一个图像路径保存到 MySQL
  • 将某些值排序到顶部

    我有一个 MySQL 表 其中包含以下数据 简化 INSERT INTO stores storeId name country VALUES 1 Foo us 2 Bar jp 3 Baz us 4 Foo2 se 5 Baz2 jp 6
  • 尝试安装 pecl 扩展时在 mac os x 10.7.3 上出现 $PHP_AUTOCONF 错误

    我正在尝试使用 pecl http 和 memcache 设置我的机器 在这两种情况下 我都会遇到类似的错误 这是在 MAC OS X 10 7 3 lion 上 我也在上面安装了 XCODE 在运行这些命令之前 我还安装了 Zend Se
  • 沿着“bresenham”线平滑颜色插值

    我正在尝试沿一条线插值颜色 以便给定两个点及其各自的 RGB 值 我可以绘制一条具有平滑颜色渐变的线 使用布雷森纳姆的线条算法 我现在可以绘制线条 但不确定如何开始在两个端点之间插值颜色 以下是 drawLine 函数的一部分 适用于斜率小