绘制纹理C++

用数学和C++绘制一些纹理

sin(x * x + y * y)

int main() {
	int width = 400; // 宽度
	int height = 400; // 高度
	Mat texture = Mat::zeros(height, width, CV_8UC1);
	
	for (int y = 0; y < height; ++y) {
	    for (int x = 0; x < width; ++x) {
	        int value = static_cast<int>(255 * sin(x * x + y * y));
	        texture.at<uchar>(y, x) = static_cast<uchar>(value);
	    }
	}
	
	imshow("Generated Texture", texture);
	imwrite("D:\\doc\\image\\sin(xx+yy).jpg", texture);
	waitKey(0);
    return 0;
}

在这里插入图片描述

交错斜线

 // 生成交错斜线风格的黑白纹理
    for (int y = 0; y < height; ++y) {
        for (int x = 0; x < width; ++x) {
            if ((x + y) % 20 < 10) {
                texture.at<uchar>(y, x) = 255; // 白色
            }
            else {
                texture.at<uchar>(y, x) = 0; // 黑色
            }
        }
    }

在这里插入图片描述

竖纹

int width = 400; // 宽度
int height = 400; // 高度

Mat texture = Mat::zeros(height, width, CV_8UC1);

for (int y = 0; y < height; ++y) {
    for (int x = 0; x < width; ++x) {
        int value = static_cast<int>(255 * 0.5 * (1 + sin(2 * M_PI * x / 20)));//竖纹
    }
}

在这里插入图片描述

交错方块

int width = 400; // 宽度
int height = 400; // 高度

Mat texture = Mat::zeros(height, width, CV_8UC1);

for (int y = 0; y < height; ++y) {
    for (int x = 0; x < width; ++x) {
        int value = static_cast<int>(255 * 0.5 * (1 + sin(2 * M_PI * x / 20) * sin(2 * M_PI * y / 20)));
    }
}

在这里插入图片描述

sin(abs(x)) + sin(abs(y))

int width = 400; // 宽度
int height = 400; // 高度

Mat texture = Mat::zeros(height, width, CV_8UC1);

for (int y = 0; y < height; ++y) {
    for (int x = 0; x < width; ++x) {
       int value = static_cast<int>(255 * (sin(abs(x)) + sin(abs(y)))) ;
    }
}

在这里插入图片描述

sin(x)*sin(y)

int width = 400; // 宽度
int height = 400; // 高度

Mat texture = Mat::zeros(height, width, CV_8UC1);

for (int y = 0; y < height; ++y) {
    for (int x = 0; x < width; ++x) {
       int value = static_cast<int>(255 * ( sin(x)*sin(y) )) ;
    }
}

在这里插入图片描述

花纹1

公式 坐标系下的函数: r=sin(n*t)

for (int y = 0; y < height; ++y) {
    for (int x = 0; x < width; ++x) {
        int curx = x % 50;
        int cury = y % 50;
        originX = x/50+25;
        originY = y/50+25;
        float t = atan2(cury - originY, curx - originX);
        float r = sqrt((curx - originX) * (curx - originX) + (cury - originY) * (cury - originY));
        float functionValue = sin(n * t);
        if (abs(r - functionValue * 20) < 5) // 乘以20是为了放大图像
        {
            texture.at<uchar>(y, x) = static_cast<uchar>(200);
        }
    }
}

在这里插入图片描述

花纹2

void drawFunction() {
    // 创建一个空白图像
    int width = 200;
    int height = 200;
    cv::Mat image(height, width, CV_8UC3, cv::Scalar(255, 255, 255));

    // 设置极坐标参数
    int numPoints = max(width, height)*2;
    double radius = min(width, height)/4;

    // 绘制极坐标曲线
    for (int i = 0; i < numPoints; ++i) {
        double angle = 2 * CV_PI * i / numPoints;
        int x = static_cast<int>(radius * (cos(angle) +cos(angle*8)/2 + sin(0*angle) / 3)) + width / 2; // 将坐标平移到图像中心
        int y = static_cast<int>(radius * (sin(angle) +sin(angle*8)/2 + cos(0*angle)/3)) + height / 2; // 将坐标平移到图像中心
        if (x+1 >= 0 && x+1 < width && y+1 >= 0 && y+1 < height) {
            image.at<cv::Vec3b>(y, x) = cv::Vec3b(0, 0, 0); // 绘制像素点
            image.at<cv::Vec3b>(y+1, x) = cv::Vec3b(0, 0, 0); // 绘制像素点
            image.at<cv::Vec3b>(y, x + 1) = cv::Vec3b(0, 0, 0); // 绘制像素点
            image.at<cv::Vec3b>(y + 1, x + 1) = cv::Vec3b(0, 0, 0); // 绘制像素点
        }
    }


    imshow("Generated Texture", image);
    imwrite("D:\\code\\noise\\image\\polar_plot.jpg", image);
    waitKey(0);

}

在这里插入图片描述
https://www.zhihu.com/zvideo/1471926178575970304

叠加

void drawFunction() {
    // 创建一个空白图像
    int width = 200;
    int height = 200;
    cv::Mat image(height, width, CV_8UC3, cv::Scalar(255, 255, 255));

    // 设置极坐标参数
    int numPoints = max(width, height)*4;
    double radius = min(width, height)/4;

    // 绘制极坐标曲线
    for (int i = 0; i < numPoints; ++i) {
        double angle = 2 * CV_PI * i / numPoints;

        
        double tempx = cos(angle) + cos(angle * 8) / 2 + sin(0 * angle) / 3;
        double tempy = sin(angle) + sin(angle * 8) / 2 + cos(0 * angle) / 3;
        int x = static_cast<int>(radius * (tempx)) + width / 2; // 将坐标平移到图像中心
        int y = static_cast<int>(radius * (tempy)) + height / 2; // 将坐标平移到图像中心
        if (x+1 >= 0 && x+1 < width && y+1 >= 0 && y+1 < height) {
            image.at<cv::Vec3b>(y, x) = cv::Vec3b(0, 0, 0); // 绘制像素点
            //image.at<cv::Vec3b>(y+1, x) = cv::Vec3b(0, 0, 0); // 绘制像素点
            //image.at<cv::Vec3b>(y, x + 1) = cv::Vec3b(0, 0, 0); // 绘制像素点
            //image.at<cv::Vec3b>(y + 1, x + 1) = cv::Vec3b(0, 0, 0); // 绘制像素点
        }

        x = static_cast<int>(radius * (tempx)*0.8) + width / 2; // 将坐标平移到图像中心
        y = static_cast<int>(radius * (tempy) * 0.8) + height / 2; // 将坐标平移到图像中心
        if (x + 1 >= 0 && x + 1 < width && y + 1 >= 0 && y + 1 < height) {
            image.at<cv::Vec3b>(y, x) = cv::Vec3b(0, 0, 0); // 绘制像素点
            //image.at<cv::Vec3b>(y + 1, x) = cv::Vec3b(0, 0, 0); // 绘制像素点
            //image.at<cv::Vec3b>(y, x + 1) = cv::Vec3b(0, 0, 0); // 绘制像素点
            //image.at<cv::Vec3b>(y + 1, x + 1) = cv::Vec3b(0, 0, 0); // 绘制像素点
        }

        x = static_cast<int>(radius * (tempx) * 0.618) + width / 2; // 将坐标平移到图像中心
        y = static_cast<int>(radius * (tempy) * 0.618) + height / 2; // 将坐标平移到图像中心
        if (x + 1 >= 0 && x + 1 < width && y + 1 >= 0 && y + 1 < height) {
            image.at<cv::Vec3b>(y, x) = cv::Vec3b(0, 0, 0); // 绘制像素点
            //image.at<cv::Vec3b>(y + 1, x) = cv::Vec3b(0, 0, 0); // 绘制像素点
            //image.at<cv::Vec3b>(y, x + 1) = cv::Vec3b(0, 0, 0); // 绘制像素点
            //image.at<cv::Vec3b>(y + 1, x + 1) = cv::Vec3b(0, 0, 0); // 绘制像素点
        }
        x = static_cast<int>(radius * (tempx) * 0.4) + width / 2; // 将坐标平移到图像中心
        y = static_cast<int>(radius * (tempy) * 0.4) + height / 2; // 将坐标平移到图像中心
        if (x + 1 >= 0 && x + 1 < width && y + 1 >= 0 && y + 1 < height) {
            image.at<cv::Vec3b>(y, x) = cv::Vec3b(0, 0, 0); // 绘制像素点
            //image.at<cv::Vec3b>(y + 1, x) = cv::Vec3b(0, 0, 0); // 绘制像素点
            //image.at<cv::Vec3b>(y, x + 1) = cv::Vec3b(0, 0, 0); // 绘制像素点
            //image.at<cv::Vec3b>(y + 1, x + 1) = cv::Vec3b(0, 0, 0); // 绘制像素点
        }
    }


    imshow("Generated Texture", image);
    imwrite("D:\\code\\noise\\image\\polar_plot.jpg", image);
    waitKey(0);

}

在这里插入图片描述

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

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

相关文章

分享86个选项卡TABJS特效,总有一款适合您

分享86个选项卡TABJS特效&#xff0c;总有一款适合您 86个选项卡TABJS特效下载链接&#xff1a;https://pan.baidu.com/s/1NBtPP2tT5YQqi6c744tCqg?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0…

C++进阶篇7---异常

目录 一、异常的介绍 二、异常的使用 1.异常的抛出和捕获 2.异常的重新抛出 3.异常安全 4.异常规范 三、自定义异常体系 四、C标准库的异常体系 一、异常的介绍 异常是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时就可以抛出异常&#xff0c;让…

初识Linux——基本指令(详解)1

呀哈喽&#xff0c;我是结衣。 在学习数据结构的同时&#xff0c;也不要忘了Linux的学习啊。今天我们开始Linux的教学&#xff0c;在学习之前我们肯定要会搭建Linux的学习环境&#xff0c;在我们的以前的博客里是有讲解的&#xff0c;所以所以这里我们就不在多说&#xff0c;我…

openEuler 22.03 升级openssh9.5

yum安装编译依赖的组件 yum install -y rpm-build gcc gcc-c glibc glibc-devel openssl-devel openssl pcre-devel zlib zlib-devel make wget krb5-devel pam-devel libX11-devel libXt-devel initscripts libXt-devel gtk2-devel lrzsz建立编译目录 mkdir -pv /root/rpm…

【数据结构与算法篇】一文详解数据结构之二叉树

树的介绍及二叉树的C实现 一 . 树的概念二 . 相关术语三 . 树的表示四 . 什么是二叉树1> 二叉树的特性2> 特殊的二叉树3> 二叉树的性质 五 . 二叉树的存储结构1> 二叉树的顺序存储2> 二叉树的链式存储 六 . 堆1> 什么是堆2> 用堆存储数据3> 堆的Cpp代码…

HarmonyOS4.0开发应用——【ArkUI组件使用】

ArkUI组件使用 这里会详细演示以下组件使用: ImageTextTextInputButtonSliderColumn&&RowList自定义组件以及相关函数使用 Image 可以是网络图片、可以是本地图片、也可以是像素图 Image("https://ts1.cn.mm.bing.net/th?idOIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&…

Linux 环境变量

文章目录 环境变量概念查看环境变量设置环境变量代码获取环境变量补充说明 环境变量概念 定义 &#xff1a;环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。 个人理解&#xff1a;Linux下一切皆文件&#xff0c;在Linux中所用的指…

正则表达式(4):连续次数的匹配

正则表达式&#xff08;4&#xff09;&#xff1a;连续次数的匹配 小结 本博文转载自 在本博客中&#xff0c;”正则表达式”为一系列文章&#xff0c;如果你想要从头学习怎样在Linux中使用正则&#xff0c;可以参考此系列文章&#xff0c;直达链接如下&#xff1a; 在Linux中…

uniapp使用vue-i18n国际化多国语言

前言&#xff1a;uniapp是自带有i18n这个插件的&#xff0c;如果没有npm安装即可 此插件需要自己去给每一个需要国际化的字符去手动配置key&#xff0c;所以如果是已经完成的项目可能工作量就稍微有点大了 第一步&#xff1a; 语言命名是有规范的不能乱取名&#xff0c;具体可…

TCP首部格式_基本知识

TCP首部格式 表格索引: 源端口目的端口 序号 确认号 数据偏移保留 ACK等 窗口检验和紧急指针 TCP报文段首部格式图 源端口与目的端口: 各占16位 序号:占32比特&#xff0c;取值范围0~232-1。当序号增加到最后一个时&#xff0c;下一个序号又回到0。用来指出本TCP报文段数据载…

Linux下如何运行.sh文件

运行环境为ubuntu20.04 如在/home/zoe/map运行.sh文件&#xff1a; 进入到/home/zoe文件夹下&#xff1a; cd /home/zoe/map 第一种运行方式&#xff1a; sh play.sh 结果&#xff1a; 第二种方式&#xff1a; 使用chmod修改文件的执行权限&#xff0c;然后运行 chmod x …

图书馆智能密集书架怎么用的

图书馆智能密集书架是一种高密度存储书籍的设备&#xff0c;通过机器控制和操作&#xff0c;实现了对书籍的高效存储和检索。使用专久智能智能密集书架的方法如下&#xff1a; 1.先进行授权认证&#xff0c;确认身份和权限&#xff0c;进行操作前要确保权限正确&#xff0c;以免…

HTTP请求

前言 HTTP是应用层的一个协议。实际我们访问一个网页&#xff0c;都会像该网页的服务器发送HTTP请求&#xff0c;服务器解析HTTP请求&#xff0c;返回HTTP响应。如此就是我们获取资源或者上传资源的原理 HTTP请求报头格式 图片来自网络 HTTP请求报头总体有四部分&#xff1a;…

Gmsh <二>:Mesh generation

上一节主要涉及Gmsh的使用入门和几何模型构建简介中&#xff0c;我们讲了Gmsh构建几何的一些基本知识&#xff0c;下面主要侧重于Gmsh在网格生成方面的操作。 网格生成的不同算法 在Gmsh中&#xff0c;当几何模型构建完成后&#xff0c;我们可以使用函数gmsh.model.mesh.gene…

unity 2d入门飞翔小鸟按钮点击功能且场景切换(二)

1、素材包获取 链接: https://pan.baidu.com/s/1KgCtQ_7wt2mlbGbIaMVvmw 提取码: xxh8 2、将素材全部拉进去 3、创建新的场景 并且将场景添加到build settings里面 4、脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityE…

Python的海龟 turtle 库使用详细介绍(画任意多边形,全网最详细)

学Turtle库&#xff0c;其实就是学数学&#xff0c;而且还能提高对数学和学习的兴趣。Turtle库还能够帮助孩子更好地理解几何学和数学概念&#xff0c;比如角度、比例、几何图形的性质等等&#xff0c;是Python中一个很有趣的库。 前言 Turtle库是Python中一个很有趣的库&…

装修流程篇

装修流程 https://www.xiaohongshu.com/explore/627ba70d00000000210357b3 https://www.xiaohongshu.com/explore/63b6bc0c000000002203776f 半包装修流程 https://www.xiaohongshu.com/explore/64e5ea3b0000000003021711 户型图 效果 https://www.xiaohongshu.com/ex…

5G承载网和大客户承载的演进

文章目录 移动4/5G承载网联通和电信4/5G承载网M-OTN&#xff08;Metro-optimized OTN&#xff09;&#xff0c;城域型光传送网PeOTN&#xff08;packet enhanced optical transport network&#xff09;&#xff0c;分组增强型OTN板卡增强型PeOTN集中交叉型PeOTN VC-OTN&#x…

CoreDNS实战(六)-编译安装unbound插件

本文主要介绍coredns的unbound插件进行编译安装的过程及常用的配置方法。 coredns官方的unbound文档&#xff1a;unbound unbound插件的github地址&#xff1a;https://github.com/coredns/unbound 注&#xff1a;unbound插件虽然是coredns中的External Plugins&#xff0c;但…

如何使用llm 制作多模态

首先将任何非字符的序列信息使用特殊n个token 编码。 具体编码方法以图像为例子说明&#xff1a; 将固定尺寸图像如256256 的图像分割为1616 的子图像块。 将已知的所有图像数据都分割后进行str将其看做是一个长的字符&#xff0c;而后去重后方式一个词表。 使用特殊1024 个tok…