c语言实现玫瑰花

浅浅跟波风

1.效果图

2.代码实现

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <math.h>const int max_iterations = 128;
const float stop_threshold = 0.01f;
const float grad_step = 0.01f;
const float clip_far = 10.0f;const float PI = 3.14159265359f;
const float PI2 = 6.28318530718f;
const float DEG_TO_RAD = PI / 180.0f;typedef struct { float x, y; } vec2;
typedef struct { float x, y, z; } vec3;
typedef struct { float m[9]; } mat3;const vec3 light_pos = { 20.0f, 50.0f, 20.0f };float min(float a, float b) { return a < b ? a : b; }
float max(float a, float b) { return a > b ? a : b; }
float clamp(float f, float a, float b) { return max(min(f, b), a); }
vec2 make2(float x, float y) { vec2 r = { x, y }; return r; }
vec2 add2(vec2 a, vec2 b) { vec2 r = { a.x + b.x, a.y + b.y }; return r; }
vec2 sub2(vec2 a, vec2 b) { vec2 r = { a.x - b.x, a.y - b.y }; return r; }
float dot2(vec2 a, vec2 b) { return a.x * b.x + a.y * b.y; }
float length2(vec2 v) { return sqrt(dot2(v, v)); }
vec3 make3(float x, float y, float z) { vec3 r = { x, y, z }; return r; }
vec3 add3(vec3 a, vec3 b) { vec3 r = { a.x + b.x, a.y + b.y, a.z + b.z }; return r; }
vec3 sub3(vec3 a, vec3 b) { vec3 r = { a.x - b.x, a.y - b.y, a.z - b.z }; return r; }
vec3 mul3(vec3 a, vec3 b) { vec3 r = { a.x * b.x, a.y * b.y, a.z * b.z }; return r; }
vec3 scale3(vec3 v, float s) { vec3 r = { v.x * s, v.y * s, v.z * s }; return r; }
float dot3(vec3 a, vec3 b) { return a.x * b.x + a.y * b.y + a.z * b.z; }
float length3(vec3 v) { return sqrt(dot3(v, v)); }
vec3 normalize3(vec3 v) { return scale3(v, 1.0f / length3(v)); }
vec3 mul(mat3 m, vec3 v) {return make3(m.m[0] * v.x + m.m[3] * v.y + m.m[6] * v.z,m.m[1] * v.x + m.m[4] * v.y + m.m[7] * v.z,m.m[2] * v.x + m.m[5] * v.y + m.m[8] * v.z);
}mat3 rotationXY(float x, float y) {vec2 c = { cos(x), cos(y) }, s = { sin(x), sin(y) };mat3 m = {c.y      , 0.0f, -s.y,s.y * s.x,  c.x,  c.y * s.x,s.y * c.x, -s.x,  c.y * c.x};return m;
}float opI(float d1, float d2) { return max(d1, d2); }
float opU(float d1, float d2) { return min(d1, d2); }
float opS(float d1, float d2) { return max(-d1, d2); }float sdPetal(vec3 p, float s) {p = add3(mul3(p, make3(0.8f, 1.5f, 0.8f)), make3(0.1f, 0.0f, 0.0f));vec2 q = make2(length2(make2(p.x, p.z)), p.y);float lower = length2(q) - 1.0f;lower = opS(length2(q) - 0.97f, lower);lower = opI(lower, q.y);float upper = length2(sub2(q, make2(s, 0.0f))) + 1.0f - s;upper = opS(upper, length2(sub2(q, make2(s, 0.0f))) + 0.97f - s);upper = opI(upper, -q.y);upper = opI(upper, q.x - 2.0f);float region = length3(sub3(p, make3(1.0f, 0.0f, 0.0f))) - 1.0f;return opI(opU(upper, lower), region);
}float map(vec3 p) {float d = 1000.0f, s = 2.0f;mat3 r = rotationXY(0.1f, PI2 * 0.618034f);r.m[0] *= 1.08f;  r.m[1] *= 1.08f;  r.m[2] *= 1.08f;r.m[3] *= 0.995f; r.m[4] *= 0.995f; r.m[5] *= 0.995f;r.m[6] *= 1.08f;  r.m[7] *= 1.08f;  r.m[8] *= 1.08f;for (int i = 0; i < 21; i++) {d = opU(d, sdPetal(p, s));p = mul(r, p);p = add3(p, make3(0.0, -0.02, 0.0));s *= 1.05f;}return d;
}vec3 gradient(vec3 pos) {const vec3 dx = { grad_step, 0.0, 0.0 };const vec3 dy = { 0.0, grad_step, 0.0 };const vec3 dz = { 0.0, 0.0, grad_step };return normalize3(make3(map(add3(pos, dx)) - map(sub3(pos, dx)),map(add3(pos, dy)) - map(sub3(pos, dy)),map(add3(pos, dz)) - map(sub3(pos, dz))));
}float ray_marching(vec3 origin, vec3 dir, float start, float end) {float depth = start;for (int i = 0; i < max_iterations; i++) {float dist = map(add3(origin, scale3(dir, depth)));if (dist < stop_threshold)return depth;depth += dist * 0.3;if (depth >= end)return end;}return end;
}float shading(vec3 v, vec3 n, vec3 eye) {vec3 ev = normalize3(sub3(v, eye));vec3 vl = normalize3(sub3(light_pos, v));float diffuse = dot3(vl, n) * 0.5f + 0.5f;vec3 h = normalize3(sub3(vl, ev));float rim = pow(1.0f - max(-dot3(n, ev), 0.0f), 2.0f) * 0.15f;float ao = clamp(v.y * 0.5f + 0.5f, 0.0f, 1.0f);return (diffuse + rim) * ao;
}vec3 ray_dir(float fov, vec2 pos) {vec3 r = { pos.x, pos.y, -tan((90.0f - fov * 0.5f) * DEG_TO_RAD) };return normalize3(r);
}float f(vec2 fragCoord) {vec3 dir = ray_dir(45.0f, fragCoord);vec3 eye = { 0.0f, 0.0f, 4.5f };mat3 rot = rotationXY(-1.0f, 1.0f);dir = mul(rot, dir);eye = mul(rot, eye);float depth = ray_marching(eye, dir, 0.0f, clip_far);vec3 pos = add3(eye, scale3(dir, depth));if (depth >= clip_far)return 0.0f;elsereturn shading(pos, gradient(pos), eye);
}int main() {puts("\033[91m");for (int y = 0; y < 80; y++) {for (int x = 0; x < 160; x++)putchar("  .,-:;+=*#@"[(int)(f(make2((x / 160.0f - 0.5f) * 2.0f, (y / 80.0f - 0.5f) * -2.0f)) * 12.0f)]);putchar('\n');}
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣第 365 场周赛虚拟参赛

有序三元组中的最大值 I class Solution { public:long long maximumTripletValue(vector<int>& nums) {vector<long long> num;for (auto &item:nums) {num.push_back(item*1ll);}long long z 0,f 1000000;long long ans 0;long long maxx num[0],mi…

pytest自动化框架运行全局配置文件pytest.ini

还记得在之前的篇章中有讲到Pytest是目前主要流行的自动化框架之一&#xff0c;他有基础的脚本编码规则以及两种运行方式。 pytest的基础编码规则是可以进行修改&#xff0c;这就是今日文章重点。 看到这大家心中是否提出了两个问题&#xff1a;pytest的基础编码规则在哪可以…

【题库】咸鱼之王答题挑战题库大全

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] [{name: , value: 未匹配到内容},# 第一期{name: 《三国演义》中&#xff0c;「大意失街亭」的是马谩&#xff1f;, value: 对},{name: 《三国演义》中&#xff0c;「挥泪斩马谩」的是孙权&#xff1f;, value: 错…

ElementUI之动态树+数据表格+分页

目录 一、动态树 1.1 定义 1.2 导航菜单绑定 1.3 面板内容 1.4 效果展示 二、动态表格 2.1 定义 2.2 搜索框 2.3 数据表格 2.4 分页条 2.5 功能实现 一、动态树 1.1 定义 动态树通常是指在网页或应用程序中创建可展开和折叠的树形结构&#xff0c;其中树的节点是动…

蓝桥杯每日一题2023.10.4

双向排序 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 六十分解法如下&#xff1a;按照题意简单排序 #include<bits/stdc.h> using namespace std; const int N 2e5 10; int n, m, p, q, a[N]; bool cmp(int x, int y) {return x > y; } int main() {cin >&g…

Ubuntu22.04 交叉编译gcc9.5 for arm

一、准备 环境&#xff1a;ubuntu22.04为刚刚安装&#xff0c;未安装gcc等包 vi ~/.bashrc输入 export PATH$PATH:/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin 保存,reboot 安装&#xff1a; sudo apt install cmake sudo apt install gawk sudo apt instal…

公众号突破2个限制技巧

许多用户在注册公众号时可能会遇到“公众号显示主体已达上限”的问题。这是因为在2018年11月16日对公众号注册数量进行了调整&#xff0c;具体调整如下&#xff1a;1、个人主体注册公众号数量上限从2个调整为1个。2、企业主体注册公众号数量上限从5个调整为2个。这意味着&#…

WebSocket实战之六心跳重连机制

一、前言 WebSocket应用部署到生产环境&#xff0c;我们除了会碰到因为经过代理服务器无法连接的问题&#xff08;注&#xff1a;该问题可以通过搭建WSS来解决&#xff0c;具体配置请看 WebSocket实战之四WSS配置 &#xff09;&#xff0c;另外一个问题就是外网环境不稳定经常…

Windows安装Docker并创建Ubuntu环境及运行神经网络模型

目录 前言在Windows上安装Docker在Docker上创建Ubuntu镜像并运行容器创建Ubuntu镜像配置容器&#xff0c;使其可以在宿主机上显示GUI 创建容器并运行神经网络模型创建容器随便找一个神经网络模型试试 总结 前言 学生党一般用个人电脑玩神经网络&#xff0c;估计很少有自己的服…

linux入门---信号的保存和捕捉

目录标题 信号的一些概念信号的保存pending表block表handler表 信号的捕捉内核态和用户态信号的捕捉 信号的一些概念 1.进程会收到各种各样的信号&#xff0c;那么程序对该信号进行实际处理的动作叫做信号的递达。 2.我们之前说过当进程收到信号的时候可能并不会立即处理这个信…

视频讲解|基于DistFlow潮流的配电网故障重构代码

目录 1 主要内容 2 视频链接 1 主要内容 该视频为基于DistFlow潮流的配电网故障重构代码讲解内容&#xff0c;对应的资源下载链接为基于DistFlow潮流的配电网故障重构(输入任意线路)&#xff0c;对该程序进行了详尽的讲解&#xff0c;基本做到句句分析和讲解&#xff08;讲解…

速看:免费领取4台阿里云服务器_申请入口及领取流程

注册阿里云账号&#xff0c;免费领云服务器&#xff0c;最高领取4台云服务器&#xff0c;每月750小时&#xff0c;3个月免费试用时长&#xff0c;可快速搭建网站/小程序&#xff0c;部署开发环境&#xff0c;开发多种企业应用。阿里云服务器网分享阿里云服务器免费领取入口、免…