games101-作业3
由于此次试验需要加载模型,涉及到本地环节,如果是windows系统,需要对main函数中的路径稍作改变:
这么写需要:
#include "windows.h"
该段代码:
#include "windows.h"
int main(int argc, const char** argv)
{std::vector<Triangle*> TriangleList;float angle = 140.0;bool command_line = false;std::string filename = "output.png";objl::Loader Loader;std::string obj_path = "\\..\\..\\test\\models\\spot\\";char pathBuf[MAX_PATH];char* p;if (GetModuleFileNameA(NULL, pathBuf, MAX_PATH)){p = strrchr(pathBuf, '\\');if (p){*p = '\0';std::string exe_path = pathBuf;obj_path = exe_path + obj_path;}}bool loadout = Loader.LoadFile("D:\\opencode\\games101\\test\\test\\models\\spot\\spot_triangulated_good.obj");
同时在windows下计算很卡,可能软件模拟计算量很大的原因;
使用c++17及以上版本,
\spot_triangulated_good.obj 中的描述了顶点信息
输入到三角形列表中:
但是 在使用的时候:
fragment_shader 即下面的着色模型:中去如何消费这个图片
std::function<Eigen::Vector3f(fragment_shader_payload)> active_shader = normal_fragment_shader; 用于设置着色模型
着色模型
1.normal模型
// 根据法线进行不同着色
Eigen::Vector3f normal_fragment_shader(const fragment_shader_payload& payload)
{Eigen::Vector3f return_color = (payload.normal.head<3>().normalized() + Eigen::Vector3f(1.0f, 1.0f, 1.0f)) / 2.f;Eigen::Vector3f result;result << return_color.x() * 255, return_color.y() * 255, return_color.z() * 255;return result;
}
这个函数并不是光照模型,只是根据不同法线返回不同颜色值。
第一行的代码,首先取出当前待着色像素点的法向量的X,Y,Z坐标并归一化,故此时X,Y,Z都在[-1,1]之间,加上(1.0f, 1.0f, 1.0f)后,变为[0,2],再除以2,即得[0,1],再分别乘以255即可得到各个颜色值了。
效果:
2.phong模型
Eigen::Vector3f phong_fragment_shader(const fragment_shader_payload& payload)
{// 泛光、漫反射、高光系数Eigen::Vector3f ka = Eigen::Vector3f(0.005, 0.005, 0.005);Eigen::Vector3f kd = payload.color;Eigen::Vector3f ks = Eigen::Vector3f(0.7937, 0.7937, 0.7937);// 灯光位置和强度auto l1 = light{{20, 20, 20}, {500, 500, 500}};auto l2 = light{{-20, 20, 0}, {500, 500, 500}};std::vector<light> lights = {l1, l2};// 光照Eigen::Vector3f amb_light_intensity{10, 10, 10};// 环境光强度Eigen::Vector3f eye_pos{0, 0, 10};// 相机位置float p = 150;// ping point的信息Eigen::Vector3f color = payload.color;Eigen::Vector3f point = payload.view_pos;// view spaceEigen::Vector3f normal = payload.normal;Eigen::Vector3f result_color = {0, 0, 0};// 光照结果Eigen::Vector3f La = ka.cwiseProduct(amb_light_intensity);// 遍历每一束光for (auto& light : lights){Eigen::Vector3f l = (light.position - point).normalized(), v = (eye_pos - point).normalized();// 光照方向和观察方向Eigen::Vector3f h = (l + v).normalized();// 半程向量Eigen::Vector3f I = light.intensity;// 光强float r2 = (light.position - point).dot(light.position - point);Eigen::Vector3f Ld = kd.cwiseProduct(I / r2) * std::max(0.0f, normal.dot(l));//cwiseProduct()函数允许Matrix直接进行点对点乘法,而不用转换至ArrayEigen::Vector3f Ls = ks.cwiseProduct(I / r2) * std::pow(std::max(0.0f, normal.dot(h)), p);result_color += La + Ld + Ls;}//Eigen::Vector3f La = ka.cwiseProduct(amb_light_intensity);//result_color += La;return result_color * 255.f;
}
直接根据公式写就行,这里我认为环境光应该放在循环外,不过这样渲出来的结果相比说说明偏暗,但后面的displacement又要放在外面否则偏亮。
phong模型渲染结果:
3.texture模型
Eigen::Vector3f texture_fragment_shader(const fragment_shader_payload& payload)
{Eigen::Vector3f return_color = {0, 0, 0};if (payload.texture){return_color = payload.texture->getColor(payload.tex_coords.x(), payload.tex_coords.y());// 获取材质颜色信息}Eigen::Vector3f texture_color;texture_color << return_color.x(), return_color.y(), return_color.z();Eigen::Vector3f ka = Eigen::Vector3f(0.005, 0.005, 0.005);Eigen::Vector3f kd = texture_color / 255.f;// 材质颜色影响漫反射系数Eigen::Vector3f ks = Eigen::Vector3f(0.7937, 0.7937, 0.7937);auto l1 = light{{20, 20, 20}, {500, 500, 500}};auto l2 = light{{-20, 20, 0}, {500, 500, 500}};std::vector<light> lights = {l1, l2};Eigen::Vector3f amb_light_intensity{10, 10, 10};Eigen::Vector3f eye_pos{0, 0, 10};float p = 150;Eigen::Vector3f color = texture_color;Eigen::Vector3f point = payload.view_pos;Eigen::Vector3f normal = payload.normal;Eigen::Vector3f result_color = {0, 0, 0};Eigen::Vector3f La = ka.cwiseProduct(amb_light_intensity);for (auto& light : lights){Eigen::Vector3f l = (light.position - point).normalized(), v = (eye_pos - point).normalized();// 光照方向和观察方向Eigen::Vector3f h = (l + v).normalized();// 半程向量Eigen::Vector3f I = light.intensity;// 光强float r2 = (light.position - point).dot(light.position - point);Eigen::Vector3f Ld = kd.cwiseProduct(I / r2) * std::max(0.0f, normal.dot(l));//cwiseProduct()函数允许Matrix直接进行点对点乘法,而不用转换至ArrayEigen::Vector3f Ls = ks.cwiseProduct(I / r2) * std::pow(std::max(0.0f, normal.dot(h)), p);result_color += La + Ld + Ls;}// Eigen::Vector3f La = ka.cwiseProduct(amb_light_intensity);// result_color += La;return result_color * 255.f;
}
Eigen::Vector3f getColor(float u, float v){// 限制(u, v)坐标范围u = std::fmin(1, std::fmax(u, 0));v = std::fmin(1, std::fmax(v, 0));auto u_img = u * (width-1);auto v_img = (1 - v) * (height-1);auto color = image_data.at<cv::Vec3b>(v_img, u_img);// 四舍五入return Eigen::Vector3f(color[0], color[1], color[2]);}
更换一个材质:
4 displacement_fragment_shader
Eigen::Vector3f displacement_fragment_shader(const fragment_shader_payload& payload)
{Eigen::Vector3f ka = Eigen::Vector3f(0.005, 0.005, 0.005);Eigen::Vector3f kd = payload.color;Eigen::Vector3f ks = Eigen::Vector3f(0.7937, 0.7937, 0.7937);auto l1 = light{{20, 20, 20}, {500, 500, 500}};auto l2 = light{{-20, 20, 0}, {500, 500, 500}};std::vector<light> lights = {l1, l2};Eigen::Vector3f amb_light_intensity{10, 10, 10};Eigen::Vector3f eye_pos{0, 0, 10};float p = 150;Eigen::Vector3f color = payload.color; Eigen::Vector3f point = payload.view_pos;Eigen::Vector3f normal = payload.normal;float kh = 0.2, kn = 0.1;float x = normal.x();float y = normal.y();float z = normal.z();Eigen::Vector3f t{ x * y / std::sqrt(x * x + z * z), std::sqrt(x * x + z * z), z*y / std::sqrt(x * x + z * z) };Eigen::Vector3f b = normal.cross(t);Eigen::Matrix3f TBN;TBN << t.x(), b.x(), normal.x(),t.y(), b.y(), normal.y(),t.z(), b.z(), normal.z();float u = payload.tex_coords.x();float v = payload.tex_coords.y();float w = payload.texture->width;float h = payload.texture->height;float dU = kh * kn * (payload.texture->getColor(u + 1 / w , v).norm() - payload.texture->getColor(u, v).norm());float dV = kh * kn * (payload.texture->getColor(u, v + 1 / h).norm() - payload.texture->getColor(u, v).norm());Eigen::Vector3f ln{-dU, -dV, 1};//与凹凸贴图的区别就在于这句话point += (kn * normal * payload.texture->getColor(u , v).norm());normal = (TBN * ln).normalized();Eigen::Vector3f result_color = {0, 0, 0};for (auto& light : lights){Eigen::Vector3f l = (light.position - point).normalized(); // 光Eigen::Vector3f v = (eye_pos - point).normalized(); // 眼Eigen::Vector3f h = (l + v).normalized(); // 半程向量double r_2 = (light.position - point).dot(light.position - point);Eigen::Vector3f Ld = kd.cwiseProduct(light.intensity / r_2) * std::max(0.0f, normal.dot(l)); //cwiseProduct()函数允许Matrix直接进行点对点乘法,而不用转换至Array。Eigen::Vector3f Ls = ks.cwiseProduct(light.intensity / r_2) * std::pow(std::max(0.0f, normal.dot(h)), p);result_color += (Ld + Ls); }Eigen::Vector3f La = ka.cwiseProduct(amb_light_intensity);result_color += La; return result_color * 255.f;
}
draw函数(顶点、三角形处理阶段)
void rst::rasterizer::draw(std::vector<Triangle*>& TriangleList) {float f1 = (50 - 0.1) / 2.0;// zfar和znear距离的一半float f2 = (50 + 0.1) / 2.0;// zfar和znear的中心z坐标Eigen::Matrix4f mvp = projection * view * model;// 计算MVP变换矩阵// 遍历每个小三角形for (const auto& t : TriangleList){Triangle newtri = *t;// 计算viewspace_pos,其中viewspace_pos的坐标是经过MV变换,没有经过P投影变换// 所以默认在相机坐标系而不是世界坐标系// 记录三角形顶点MV变换后坐标std::array<Eigen::Vector4f, 3> mm{(view * model * t->v[0]),(view * model * t->v[1]),(view * model * t->v[2])};std::array<Eigen::Vector3f, 3> viewspace_pos;// 存入viewspace_posstd::transform(mm.begin(), mm.end(), viewspace_pos.begin(), [](auto& v) {return v.template head<3>();});// 得到经过mvp后的坐标Eigen::Vector4f v[] = {mvp * t->v[0],mvp * t->v[1],mvp * t->v[2]};// 换算齐次坐标for (auto& vec : v) {vec.x() /= vec.w();vec.y() /= vec.w();vec.z() /= vec.w();}// 计算在MV转换后各顶点的法向量// 利用原来点法向量推出MV变换后法向量// 因为光线作用是在view_space下进行的Eigen::Matrix4f inv_trans = (view * model).inverse().transpose();Eigen::Vector4f n[] = {inv_trans * to_vec4(t->normal[0], 0.0f),inv_trans * to_vec4(t->normal[1], 0.0f),inv_trans * to_vec4(t->normal[2], 0.0f)};// 视口变换 得到顶点在屏幕上的坐标 即screen spacefor (auto& vert : v){vert.x() = 0.5 * width * (vert.x() + 1.0);vert.y() = 0.5 * height * (vert.y() + 1.0);// 为了Zbuffer保留Z值// (透视)投影变换最后一步是从正交投影变换到正则立方体// 而这一步就是把正则立方体的z值还原到正交投影时的z值,即原始z值vert.z() = vert.z() * f1 + f2;}// 记录经过MVP视口变换后的顶点坐标// 完成顶点变换,变换到屏幕空间for (int i = 0; i < 3; ++i){//screen space coordinatesnewtri.setVertex(i, v[i]);}// 记录顶点的法向量for (int i = 0; i < 3; ++i){//view space normalnewtri.setNormal(i, n[i].head<3>());}// 设置颜色newtri.setColor(0, 148, 121.0, 92.0);newtri.setColor(1, 148, 121.0, 92.0);newtri.setColor(2, 148, 121.0, 92.0);// 对这个小三角形进行光栅化// 传入viewspace_pos的坐标,光线的作用是在viewspace下的rasterize_triangle(newtri, viewspace_pos);}
}
//Screen space rasterization
void rst::rasterizer::rasterize_triangle(const Triangle& t, const std::array<Eigen::Vector3f, 3>& view_pos)
{auto v = t.toVector4(); //v[0],v[1],v[2]分别为三角形的三个顶点,是四维向量//比较三个顶点的横纵坐标,确定包围盒的边界并取整double min_x = std::min(v[0][0], std::min(v[1][0], v[2][0]));double max_x = std::max(v[0][0], std::max(v[1][0], v[2][0]));double min_y = std::min(v[0][1], std::min(v[1][1], v[2][1]));double max_y = std::max(v[0][1], std::max(v[1][1], v[2][1]));min_x = static_cast<int>(std::floor(min_x));min_y = static_cast<int>(std::floor(min_y));max_x = static_cast<int>(std::ceil(max_x));max_y = static_cast<int>(std::ceil(max_y));//此处实现的是MSAAstd::vector<Eigen::Vector2f> pos{ //对一个像素分割四份 当然你还可以分成4x4 8x8等等甚至你还可以为了某种特殊情况设计成不规则的图形来分割单元{0.25,0.25}, //左下{0.75,0.25}, //右下{0.25,0.75}, //左上{0.75,0.75} //右上};for (int i = min_x; i <= max_x; ++i){for (int j = min_y; j <= max_y; ++j){int count = 0; //开始遍历四个小格子,获得平均值for (int MSAA_4 = 0; MSAA_4 < 4; ++MSAA_4){if (insideTriangle(static_cast<float>(i+pos[MSAA_4][0]), static_cast<float>(j+pos[MSAA_4][1]),t.v))++count;}if(count) //至少有一个小格子在三角形内{//此处是框架中代码,获得z,见原程序注释:// * v[i].w() is the vertex view space depth value z.// * Z is interpolated view space depth for the current pixel// * zp is depth between zNear and zFar, used for z-bufferauto[alpha, beta, gamma] = computeBarycentric2D(i + 0.5, j + 0.5, t.v);float Z = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());float zp = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();zp *= Z;//endif (depth_buf[get_index(i, j)] > zp){depth_buf[get_index(i, j)] = zp;//更新深度//这里注意,虽然说明上说"反转了z,保证都是正数,并且越大表示离视点越远",//但经过我的查看,实际上并没有反转,因此还是按照-z近大远小来做,当然也可以在上面补一个负号不过没必要//利用重心坐标插值各种值auto interpolated_color = interpolate(alpha, beta, gamma, t.color[0], t.color[1], t.color[2], 1);auto interpolated_normal = interpolate(alpha, beta, gamma, t.normal[0], t.normal[1], t.normal[2], 1).normalized();auto interpolated_texcoords = interpolate(alpha, beta, gamma, t.tex_coords[0], t.tex_coords[1], t.tex_coords[2], 1);auto interpolated_shadingcoords = interpolate(alpha, beta, gamma, view_pos[0], view_pos[1], view_pos[2], 1);//shadingcoords是由view_pos插值得到,也就是物体表面的点在相机坐标系的位置。他们会在shader中被用到,来计算光照等信息。//此处是框架中代码,获得z,见原程序注释:fragment_shader_payload payload(interpolated_color, interpolated_normal, interpolated_texcoords, texture ? &*texture : nullptr);payload.view_pos = interpolated_shadingcoords;auto pixel_color = fragment_shader(payload);//end// 设置颜色set_pixel(Eigen::Vector2i(i, j), pixel_color * (count / 4.0));}}}}
}
完整代码:vs2022
相关文章:
games101-作业3
由于此次试验需要加载模型,涉及到本地环节,如果是windows系统,需要对main函数中的路径稍作改变: 这么写需要: #include "windows.h" 该段代码: #include "windows.h" int main(int ar…...
信息安全专业优秀毕业设计选题汇总:热点选题
目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…...
AI协助探索AI新构型的自动化创新概念
训练AI自生成输出模块化代码,生成元代码级别的AI功能单元代码,然后再由AI组织为另一个AI,实现AI开发AI的能力;用AI协助探索迭代新构型AI将会出现,并成为一种新的技术路线潮流。 有限结点,无限的连接形式&a…...
python——Django 框架
Django 框架 1、简介 Django 是用python语言写的开源web开发框架,并遵循MVC设计。 Django的**主要目的是简便、快速的开发数据库驱动的网站。**它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能…...
SpringBoot基础概念介绍-数据源与数据库连接池
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 毛毛张今天介绍的SpringBoot中的基础概念-数据源与数据库连接池,同时介绍SpringBoot整合两种连接池的教程 文章目录 1 数据库与数据库管理系统2 JDBC与数…...
MYSQL 商城系统设计 商品数据表的设计 商品 商品类别 商品选项卡 多表查询
介绍 在开发商品模块时,通常使用分表的方式进行查询以及关联。在通过表连接的方式进行查询。每个商品都有不同的分类,每个不同分类下面都有商品规格可以选择,每个商品分类对应商品规格都有自己的价格和库存。在实际的开发中应该给这些表进行…...
视频网站服务器为什么需要使用负载均衡?
随着视频网站等娱乐活动的逐渐增加,进行使用的用户数量也在不断上升,大量的用户会给视频网站行业带来一定的访问压力,需要处理大量的媒体资料,比如上传视频图片和数据保存发布等内容,会消耗大量的带宽资源,…...
Golang Gin系列-9:Gin 集成Swagger生成文档
文档一直是一项乏味的工作(以我个人的拙见),但也是编码过程中最重要的任务之一。在本文中,我们将学习如何将Swagger规范与Gin框架集成。我们将实现JWT认证,请求体作为表单数据和JSON。这里唯一的先决条件是Gin服务器。…...
docker中运行的MySQL怎么修改密码
1,进入MySQL容器 docker exec -it 容器名 bash 我运行了 docker ps命令查看。正在运行的容器名称。可以看到MySQL的我起名为db docker exec -it db bash 这样就成功的进入到容器中了。 2,登录MySQL中 mysql -u 用户名 -p 回车 密码 mysql -u root -p roo…...
智能汽车网络安全威胁报告
近年来随着智能汽车技术的快速发展,针对智能汽车的攻击也逐渐从传统的针对单一车辆控制器的攻击转变为针对整车智能化服务的攻击,包括但不限于对远程控制应用程序的操控、云服务的渗透、智能座舱系统的破解以及对第三方应用和智能服务的攻击。随着WP.29 …...
[EAI-026] DeepSeek-VL2 技术报告解读
Paper Card 论文标题:DeepSeek-VL2: Mixture-of-Experts Vision-Language Models for Advanced Multimodal Understanding 论文作者:Zhiyu Wu, Xiaokang Chen, Zizheng Pan, Xingchao Liu, Wen Liu, Damai Dai, Huazuo Gao, Yiyang Ma, Chengyue Wu, Bin…...
【腾讯云】腾讯云docker搭建单机hadoop
这里写目录标题 下载jdk hadoop修改hadoop配置编写Dockerfile构建镜像运行镜像创建客户端 下载jdk hadoop wget --no-check-certificate https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.tar.gz wget --no-check-certificate https://repo.huaweicloud.…...
【回溯+剪枝】电话号码的字母组合 括号生成
文章目录 17. 电话号码的字母组合解题思路:回溯 哈希表22. 括号生成解题思路:回溯 剪枝 17. 电话号码的字母组合 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 …...
Day29(补)-【AI思考】-精准突围策略——从“时间贫困“到“效率自由“的逆袭方案
文章目录 精准突围策略——从"时间贫困"到"效率自由"的逆袭方案**第一步:目标熵减工程(建立四维坐标)** 与其他学习方法的结合**第二步:清华方法本土化移植** 与其他工具对比**~~第三步:游戏化改造…...
进程间通信
进程间通信 进程间通信介绍 进程间通信⽬的 数据传输:⼀个进程需要将它的数据发送给另⼀个进程 资源共享:多个进程之间共享同样的资源。 通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)…...
【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂
目录 1. 常见运算函数 个人主页:Icomi 专栏地址:PyTorch入门 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&…...
2024年数据记录
笔者注册时间超过98.06%的用户 CSDN 原力是衡量一个用户在 CSDN 的贡献和影响力的系统,笔者原力值超过99.99%的用户 其他年度数据...
hot100(4)
31.437. 路径总和 III - 力扣(LeetCode) 方法一:递归、dfs 由树的结构想到使用递归解决,且路径相关问题容易考虑到使用dfs和bfs. 使用dfs解决,这里关键在于如何设计递归函数。 递归函数的参数:root,tar…...
海浪波高预测(背景调研)
#新星杯14天创作挑战营第7期# ps:图片由通义千问生成 历史工作: 针对更高细粒度、更高精度的波浪高度预测任务: Mumtaz Ali 等人提出了一种多元线性回归模型(MLR-CWLS),该模型利用协方差加权最小二乘法&a…...
C++ 3
delete 和 free 有什么区别? delete和free都是用来释放动态分配的内存,但它们有不同的使用方式: 语法: ○ delete是C中的关键字,用于释放由new分配的对象。 ○ free是C语言中的函数,通常包含在<stdlib…...
【逻辑学导论】1.4论证与说明
许多语段看起来好像是论证,实际上不是论证而是说明。即使有某些前提或结论指示词出现,例如“因为”“由于”“因”“所以”等,也不能解决问题,这些语词既可用在论证中也可用在说明中(虽然“因……”一词有时可以指时间…...
vue3+elementPlus之后台管理系统(从0到1)(day4-完结)
面包屑 创建一个面包屑组件 将路由导入然后格式化map对象 key-value 将当前路由的key和value获取然后存入list数组中 遍历list数据,渲染内容 <!--BreadcrumbCom.vue--> <template><el-breadcrumb separator">"><el-breadcrum…...
Python标准库 - os (2) 进程管理
文章目录 3 进程管理3.1 进程状态和控制3.2 进程优先级3.3 程序段控制3.4 其他 4 创建子进程4.1 创建子进程常见函数4.2 spawn*族函数4.3 exec*族函数 5 子进程管理5.1 创建子进程触发事件5.2 等待子进程执行完5.3 子进程的状态 os模块提供了各种操作系统接口。包括环境变量、进…...
单细胞-第四节 多样本数据分析,下游画图
文件在单细胞\5_GC_py\1_single_cell\2_plots.Rmd 1.细胞数量条形图 rm(list ls()) library(Seurat) load("seu.obj.Rdata")dat as.data.frame(table(Idents(seu.obj))) dat$label paste(dat$Var1,dat$Freq,sep ":") head(dat) library(ggplot2) lib…...
【2024年华为OD机试】(B卷,100分)- 热点网站统计(Java JS PythonC/C++)
一、问题描述 题目描述 企业路由器的统计页面需要动态统计公司访问最多的网页URL的Top N。设计一个算法,能够高效动态统计Top N的页面。 输入描述 每一行都是一个URL或一个数字: 如果是URL,代表一段时间内的网页访问。如果是数字N&#…...
脚本运行禁止:npm 无法加载文件,因为在此系统上禁止运行脚本
问题与处理策略 1、问题描述 npm install -D tailwindcss执行上述指令,报如下错误 npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本。 有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_…...
AI软件栈:LLVM分析(一)
文章目录 AI 软件栈后端编译LLVM IRLLVM的相关子项目AI 软件栈后端编译 AI软件栈的后端工作通常与硬件架构直接相关,为了实现一个既能适配现代编程语言、硬件架构发展的目标,所以提出了LLVM具备多阶段优化能力提供基础后端描述,便于进行编译器开发兼容标准编译器的行为LLVM …...
【Elasticsearch】 Intervals Query
Elasticsearch Intervals Query 返回基于匹配术语的顺序和接近度的文档。 intervals 查询使用 匹配规则,这些规则由一小组定义构建而成。这些规则然后应用于指定 field 中的术语。 这些定义生成覆盖文本中术语的最小间隔序列。这些间隔可以进一步由父源组合和过滤…...
Ansys Maxwell:采用对称性的双转子轴向磁通电机
轴向磁通电机因其功率密度高于相同重量的传统径向磁通电机而变得非常受欢迎,并且在电动汽车和航空应用中非常高效且具有成本效益。功率密度是输出功率与机器体积的比率。对于给定尺寸的机器,轴向磁通电机提供更大的扭矩和功率,或者对于给定的…...
你的连接不是专用连接
当你打开网站看到如下提示,说明SSL证书到期了。 攻击者可能试图www窃取你的信息(例如、密码、消息或信用卡)。详细了解此警告 NET::ERR_CERT_DATE_INVALID 此服务器无法证明它是WWW ;它的安全证书已于2天前到期。这可能是错误配置或攻击者…...
CSS核心
CSS的引入方式 内部样式表是在 html 页面内部写一个 style 标签,在标签内部编写 CSS 代码控制整个 HTML 页面的样式。<style> 标签理论上可以放在 HTML 文档的任何地方,但一般会放在文档的 <head> 标签中。 <style> div { color: r…...
AI常见的算法和例子
人工智能(AI)中常见的算法分为多个领域,如机器学习、深度学习、强化学习、自然语言处理和计算机视觉等。以下是一些常见的算法及其用途: 例子代码:纠结哥/pytorch_learn 1. 机器学习 (Machine Learning) 监督学习 (S…...
无公网IP 外网访问 本地部署夫人 hello-algo
hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式,为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo,并结合路由侠内网穿透实现外网访问本地部署…...
【QT】 控件 -- 显示类
🔥 目录 [TOC]( 🔥 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 🔥 1. 前言 之前我在上一篇文章【QT】…...
AI语言模型竞争加剧:新秀崛起 格局生变
标题:AI语言模型竞争加剧:新秀崛起 格局生变 文章信息摘要: AI语言模型领域呈现加速发展和分化态势。在LMSYS排行榜上,Claude 3 Opus超越GPT-4 Turbo,DBRX超越Mixtral成为最佳开源模型,显示领先位置更替频…...
RK3568使用opencv(使用摄像头捕获图像数据显示)
文章目录 一、opencv相关的类1. **cv::VideoCapture**2. **cv::Mat**3. **cv::cvtColor**4. **QImage**5. **QPixmap**总结 二、代码实现 一、opencv相关的类 1. cv::VideoCapture cv::VideoCapture 是 OpenCV 中用于视频捕捉的类,常用于从摄像头、视频文件、或者…...
leetcode——排序链表(java)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5] 示例 3: …...
Windows安装Miniconda和PySide6以及配置PyCharm
目录 1. 选择Miniconda 2. 下载Miniconda 3. 安装Miniconda 4. 在base环境下创建pyside6环境 5. 安装pyside6环境 6. 配置PyCharm环境 7. 运行第一个程序效果 1. 选择Miniconda 选择Miniconda而没有选择Anaconda,是因为它是一个更小的Anaconda发行版&#x…...
floodfill算法(6题)
本质就是找出性质相似的连通块 目录 1.图像渲染 2.岛屿数量 3.岛屿的最大面积 4.被围绕的区域 5.太平洋大西洋水流问题 6.扫雷游戏 1.图像渲染 733. 图像渲染 - 力扣(LeetCode) 我们使用深度优先遍历去遍历即可,也不需要返回值。 值得…...
Spring集成Redis|通用Redis工具类
一、基础使用 概述 在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis。那么使用SpringBoot整合Redis需要 那些步骤呢。 1、 JedisPoolConfig (这个是配置连接池) 2、 RedisConnectionFactory 这个是配置连接信息,这里的RedisConnectionFactory是一个接 …...
python:洛伦兹变换
洛伦兹变换(Lorentz transformations)是相对论中的一个重要概念,特别是在讨论时空的变换时非常重要。在四维时空的背景下,洛伦兹变换描述了在不同惯性参考系之间如何变换时间和空间坐标。在狭义相对论中,洛伦兹变换通常…...
题单:插入排序
题目描述 给定 n 个元素的数组(下标从1开始计),请使用插入排序对其进行排序(升序)。 输入格式 两行,第一行为一个整数 n,表示元素的个数。 第二行 n 个空格分隔的整数,表示数组的…...
【Spring】Spring启示录
目录 前言 一、示例程序 二、OCP开闭原则 三、依赖倒置原则DIP 四、控制反转IOC 总结 前言 在软件开发的世界里,随着项目的增长和需求的变化,如何保持代码的灵活性、可维护性和扩展性成为了每个开发者必须面对的问题。传统的面向过程或基于类的设计…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.30 性能巅峰:NumPy代码优化全攻略
1.30 性能巅峰:NumPy代码优化全攻略 目录 #mermaid-svg-CMVXy3CN2tNmW8RJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CMVXy3CN2tNmW8RJ .error-icon{fill:#552222;}#mermaid-svg-CMVXy3CN2tNmW8RJ …...
C#方法(练习)
1.定义一个函数,输入三个值,找出三个数中的最小值 2.定义一个函数,输入三个值,找出三个数中的最大值 3.定义一个函数,输入三个值,找出三个数中的平均值 4.定义一个函数,计算一个数的 N 次方 Pow(2, 3)返回8 5.传入十一…...
Node.js 的底层原理
Node.js 的底层原理 1. 事件驱动和非阻塞 I/O Node.js 基于 Chrome V8 引擎,使用 JavaScript 作为开发语言。它采用事件驱动和非阻塞 I/O 模型,使其轻量且高效。通过 libuv 库实现跨平台的异步 I/O,包括文件操作、网络请求等。 2. 单线程事…...
react native在windows环境搭建并使用脚手架新建工程
截止到2024-1-11,使用的主要软件的版本如下: 软件实体版本react-native0.77.0react18.3.1react-native-community/cli15.0.1Android Studio2022.3.1 Patch3Android SDKAndroid SDK Platform 34 35Android SDKAndroid SDK Tools 34 35Android SDKIntel x…...
实战:如何快速让新网站被百度收录?
本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/22.html 要让新网站快速被百度收录,可以采取以下实战策略: 一、网站基础优化 网站结构清晰:确保网站的结构简洁清晰,符合百度的抓取规则。主…...
Nuxt:利用public-ip这个npm包来获取公网IP
目录 一、安装public-ip包1.在Vue组件中使用2.在Nuxt.js插件中使用public-ip 一、安装public-ip包 npm install public-ip1.在Vue组件中使用 你可以在Nuxt.js的任意组件或者插件中使用public-ip来获取公网IP。下面是在一个Vue组件中如何使用它的例子: <template…...
572. 另一棵树的子树
前导题:100. 相同的树 回顾一下 判断两棵二叉树相同,根结点相同 且 左子树相同 且 右子树相同。 于是判断如下: 根结点都为null,返回true根结点不都为null,返回false根结点都不为null,但是值不相同&#…...