MATLAB | 龙年大吉,使用MATLAB绘制会动的中国风神龙

hey各位好久不见,龙年到了,这期画一期配色非常中国风的龙,这个造型的龙参考了某些html绘制龙的视频,但是由于html版全网都是也不咋给代码和代码出处,因此自己写了个MATLAB版本:

在这里插入图片描述

可以看到还是非常酷炫的!


五年前的贪吃蛇

代码原理非常简单,就是龙跟着鼠标走嘛,不就是加强版的贪吃蛇嘛,于是直接翻出我五年前写的贪吃蛇代码进行一通改进,当时写的贪吃蛇长这样:

在这里插入图片描述

注意:这段是贪吃蛇代码

再注:中国龙代码见文末

function snake
%axis set..............................................................
axis equal
len=40;
axis(0.5+[0,len,0,len])
set(gca,'xtick',[],'ytick',[],'xcolor','w','ycolor','w')
set(gca,'color','k')
hold on
%snake and food begining set...........................................
snaketop=[5,5;4.5,5];
body=[5,5;4.5,5;4,5;3.5,5;3,5;2.5,5];
food=[10,10];
direction=[1,0];
long=6;
plotsnake=scatter(gca,body(:,1),body(:,2),120,'w','filled');
plotfood=scatter(gca,food(1),food(2),120,'w','filled');
%timer set.............................................................
set(gcf,'WindowButtonMotionFcn',@snakefcn)
fps = 4;
game = timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @snakegame);
start(game)
%..................................................................................
set(gcf,'tag','co','CloseRequestFcn',@clo);function clo(~,~)stop(game);delete(findobj('tag','co'));clf;closeendfunction snakegame(~,~)snaketop=[body(1,:)+direction;body(1,:)+1/2*direction];snaketop(snaketop>len)=snaketop(snaketop>len)-len;snaketop(snaketop<1)=snaketop(snaketop<1)+len;body=[snaketop;body];body(long+1:end,:)=[];if (snaketop(1,1)-food(1))^2+(snaketop(1,2)-food(2))^2<1long = long + 2;food = randi(len, [1, 2]);endset(plotfood,'XData',food(1),'YData',food(2))set(plotsnake,'XData',body(:,1),'YData',body(:,2))endfunction snakefcn(~,~)xy=get(gca,'CurrentPoint');x=xy(1,1);y=xy(1,2);dir=[x-body(1,1),y-body(1,2)];dis=sqrt((x-body(1,1))^2+(y-body(1,2))^2);direction=dir/dis;end
end

中国龙

在给出完整代码前,还是有点要说的地方,代码有个参数N可以自己动手改,数值需要大于15的整数,数值越大龙越长,比如改到60:

N=60;


而龙的颜色是通过矩阵CList来设置的,它是一个三行三列的矩阵,每一行代表一个颜色,每个数值都是[0,1]范围,可以自行设置,比如:

% CList=bone(4);CList=CList(2:4,:);% CList=flipud(bone(3));% CList=lines(3);% CList=colorcube(3);

当然也可以直接完全随机,万一有惊喜呢:

CList=rand(3)


完整代码

function dragon24
% Copyright (c) 2024, Zhaoxu Liu / slandarer
baseV=[ -.016,.822; -.074,.809; -.114,.781; -.147,.738; -.149,.687; -.150,.630;-.157,.554; -.166,.482; -.176,.425; -.208,.368; -.237,.298; -.284,.216;-.317,.143; -.338,.091; -.362,.037;-.382,-.006;-.420,-.051;-.460,-.084;-.477,-.110;-.430,-.103;-.387,-.084;-.352,-.065;-.317,-.060;-.300,-.082;-.331,-.139;-.359,-.201;-.385,-.262;-.415,-.342;-.451,-.418;-.494,-.510;-.533,-.599;-.569,-.675;-.607,-.753;-.647,-.829;-.689,-.932;-.699,-.988;-.639,-.905;-.581,-.809;-.534,-.717;-.489,-.642;-.442,-.543;-.393,-.447;-.339,-.362;-.295,-.296;-.251,-.251;-.206,-.241;-.183,-.281;-.175,-.350;-.156,-.434;-.136,-.521;-.128,-.594;-.103,-.677;-.083,-.739;-.067,-.813;-.039,-.852];
% 基础比例、上色方式数据
baseV=[0,.82;baseV;baseV(end:-1:1,:).*[-1,1];0,.82];
baseV=baseV-mean(baseV,1);
baseF=1:size(baseV,1);
baseY=baseV(:,2);
baseY=(baseY-min(baseY))./(max(baseY)-min(baseY));
N=30;
baseR=sin(linspace(pi/4,5*pi/6,N))./1.2;
baseR=[baseR',baseR'];baseR(1,:)=[1,1];
baseR(5,:)=[2,.6];
baseR(10,:)=[3.7,.4];
baseR(15,:)=[1.8,.6];
baseT=[zeros(N,1),ones(N,1)];
baseM=zeros(N,2);
baseD=baseM;
ratioT=@(Mat,t)Mat*[cos(t),sin(t);-sin(t),cos(t)];
% 配色数据
CList=[211,56,32;56,105,166;253,209,95]./255;
% CList=bone(4);CList=CList(2:4,:);
% CList=flipud(bone(3));
% CList=lines(3);
% CList=colorcube(3);
% CList=rand(3)
baseC1=CList(2,:)+baseY.*(CList(1,:)-CList(2,:));
baseC2=CList(3,:)+baseY.*(CList(1,:)-CList(3,:));
% 构建图窗
fig=figure('units','normalized','position',[.1,.1,.5,.8],...'UserData',[98,121,32,115,108,97,110,100,97,114,101,114]);
axes('parent',fig,'NextPlot','add','Color',[0,0,0],...'DataAspectRatio',[1,1,1],'XLim',[-6,6],'YLim',[-6,6],'Position',[0,0,1,1]);
% 构造龙每个部分句柄
dragonHdl(1)=patch('Faces',baseF,'Vertices',baseV,'FaceVertexCData',baseC1,'FaceColor','interp','EdgeColor','none','FaceAlpha',.95);disp(char(fig.UserData))
for i=2:NdragonHdl(i)=patch('Faces',baseF,'Vertices',baseV.*baseR(i,:)-[0,i./2.5-.3],'FaceVertexCData',baseC2,'FaceColor','interp','EdgeColor','none','FaceAlpha',.7);
end
set(dragonHdl(5),'FaceVertexCData',baseC1,'FaceAlpha',.7)
set(dragonHdl(10),'FaceVertexCData',baseC1,'FaceAlpha',.7)
set(dragonHdl(15),'FaceVertexCData',baseC1,'FaceAlpha',.7)
for i=N:-1:1,uistack(dragonHdl(i),'top');end
for i=1:NbaseM(i,:)=mean(get(dragonHdl(i),'Vertices'),1);
end
baseD=diff(baseM(:,2));Pos=[0,2];
% 主循环及旋转、运动计算
set(gcf,'WindowButtonMotionFcn',@dragonFcn)
fps=8;
game=timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @dragonGame);
start(game)
% Copyright (c) 2023, Zhaoxu Liu / slandarer
set(gcf,'tag','co','CloseRequestFcn',@clo);function clo(~,~)stop(game);delete(findobj('tag','co'));clf;closeendfunction dragonGame(~,~)Dir=Pos-baseM(1,:);Dir=Dir./norm(Dir);baseT=(baseT(1:end,:)+[Dir;baseT(1:end-1,:)])./2;baseT=baseT./(vecnorm(baseT')');theta=atan2(baseT(:,2),baseT(:,1))-pi/2;baseM(1,:)=baseM(1,:)+(Pos-baseM(1,:))./30;baseM(2:end,:)=baseM(1,:)+[cumsum(baseD.*baseT(2:end,1)),cumsum(baseD.*baseT(2:end,2))];for ii=1:Nset(dragonHdl(ii),'Vertices',ratioT(baseV.*baseR(ii,:),theta(ii))+baseM(ii,:))endendfunction dragonFcn(~,~)xy=get(gca,'CurrentPoint');x=xy(1,1);y=xy(1,2);Pos=[x,y];Pos(Pos>6)=6;Pos(Pos<-6)=6;end
end

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

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

相关文章

vuex和pinia区别

Vuex 和 Pinia 都是用于状态管理的库&#xff0c;但它们在一些方面有所不同。 1. 架构设计&#xff1a; - Vuex 是 Vue.js 官方提供的状态管理库&#xff0c;采用集中式的架构&#xff0c;所有的状态都存储在一个单一的全局状态树中。 - Pinia 是一个由 Vue Store 创建的…

你的BGE模型用对了吗?

众所周知Embedding模型可以将任何文本映射到低维密集向量,该向量可用于检索、分类、聚类或语义搜索等任务,也可以用于LLM的矢量数据库。 智源研究院开源的BGE(BAAI general embedding)模型已经屠榜多时了,且有力推动了知识库检索、聚类、分类等多种下游场景的发展。尤其是在…

前端面试Vue部分补充(详细)

1、vue的基本原理 Vue的基本原理是基于MVVM&#xff08;Model-View-ViewModel&#xff09;模式的前端框架。它通过数据绑定和响应式系统来实现数据和视图的自动同步更新。 Vue的基本原理可以概括为以下几个步骤&#xff1a; 1). 解析模板&#xff1a;Vue通过解析模板来生成虚…

【LabVIEW FPGA入门】使用数字IO卡实现计数器输入功能

方法1&#xff1a; 1.首先需要用一个数字IO的输入FPGA端口&#xff0c;并将其拖入程序框图中&#xff0c;同时创建一个循环。 2.如果想要在循环中实现累加功能&#xff0c;就可以使用移位寄存器。 数字输入的当前值和历史值进行比较&#xff0c;用于一个判断大于&#xff0c;来…

【算法分析与设计】跳跃游戏

题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - …

阿里云高性能云服务器_云主机_云服务器详解

阿里云高性能云服务器60%单实例最大性能提升&#xff0c;35Gbps内网带宽&#xff0c;网络增强&通用型云服务器、本地SSD型云服务器、大数据型云服务器、GPU异构型云服务器&#xff0c;阿里云百科aliyunbaike.com分享阿里云高性能云服务器&#xff1a; 阿里云高性能云服务器…

Nacos:通过Dockerfile构建自定义Nacos镜像

简介&#xff1a; Docker已经成为容器化的标准&#xff0c;它允许开发者将应用及其依赖打包到一个可移植的容器中&#xff0c;然后轻松地发布到任何Docker环境中。Nacos&#xff0c;作为阿里巴巴开源的服务发现、配置和服务管理平台&#xff0c;为微服务架构提供了关键的支持。…

基于STM32的温湿度传感器

一、创新实践实习内容 一:指导老师给我们介绍了广州粤嵌通信科技股份有限公司的企业文化与企业环境&#xff0c;简要地介绍了本行业的发展历史及未来发展趋势。讲解了Keil5的功能与应用。指导我们搭建STM32F407驱动环境以及学习相关芯片包的安装使用方法。并且带着我们对C语言…

力扣热题100

排序 快速排序 #include <iostream> #include <vector> using namespace std;// 快速排序函数&#xff0c;传入引用&#xff0c;以便修改原始数组 void quick_sort(vector<int>& q, int l, int r) {// 边界条件&#xff1a;如果左边界大于等于右边界&am…

Java缓存优化

缓存优化 环境配置 配置yml文件中的redismaven导入redis 缓存菜品数据 先从redis获取数据&#xff0c;如果有直接返回;没有的话从数据库中找&#xff0c;把数据放入到redis中。更新菜品数据时(或者数据库中的数据变化时)&#xff0c;需要清理缓存数据。 Spring Cache 在启…

力扣(leetcode)第657题机器人能否返回顶点(Python)

657.机器人能否返回顶点 题目链接&#xff1a;657.机器人能否返回顶点 在二维平面上&#xff0c;有一个机器人从原点 (0, 0) 开始。给出它的移动顺序&#xff0c;判断这个机器人在完成移动后是否在 (0, 0) 处结束。 移动顺序由字符串 moves 表示。字符 move[i] 表示其第 i 次…

第十讲_css2d转换

css2d转换 1. 移动2. 旋转3. 缩放4. 组合转换5. 设置原点 1. 移动 translate() &#xff1a;参照元素原位置&#xff0c;在X轴和Y轴方向上移动。 <html><style>.container1:hover {width: 200px;height: 200px;background-color: red;/* 在X轴方向移动50px */tra…

基于SpringBoot+Vue实现的二手交易系统

系统介绍 校园二手交易网站是一种专门针对有二手物品交易需求用户的二手交易的网站。它的设计和开发主要是为了满足用户之间的二手物品交易需求&#xff0c;方便大家在线买卖二手物品。近年来&#xff0c;随着互联网技术的发展&#xff0c;人们越来越喜欢在线购物&#xff0c;…

NMEA0183协议相关笔记

协议基本知识 参考以前的文章 <北斗/GPS模块的使用-基于正点原子ATK-1218-BD>&#xff0c;文章链接&#xff0c;或者野火相关资料整理。 1、协议格式 2、地址段指令 1、标识 2、语句类型 二、指令内容 1、 GGA 2、GLL 3、GSA 4、GSV 5、RMC 6、VTG 7、ZDA 8、TXT

码牛课堂首推——鸿蒙南北双向开发学习路线图标准版~

鸿蒙&#xff01;鸿蒙&#xff01;鸿蒙&#xff01; 要说2023-2024年IT圈最火爆的名词&#xff0c;一定是鸿蒙&#xff01; 2023年9月25日&#xff0c;华为发布会正式宣布2024年第一季度将推出HarmonyOS NEXT版本&#xff0c;这意味着鸿蒙原生应用开发将彻底摆脱Android手机系…

Vue2-子传父和父传子的基本用法

在Vue 2中&#xff0c;可以使用props和$emit来实现子组件向父组件传值&#xff08;子传父&#xff09;和父组件向子组件传值&#xff08;父传子&#xff09;。 子传父&#xff08;子组件向父组件传值&#xff09;的基本用法如下&#xff1a; 在父组件中定义一个属性&#xff…

C# Chart控件

// 定义图表区域 this.chart1.ChartAreas.Clear(); ChartArea chartArea1 new ChartArea("C1"); this.chart1.ChartAreas.Add(chartArea1); //定义存储和显示点的容器 this.chart1.Series.Clear(); Series series1 new Series("OK"); //series1.ChartAre…

Java实现在线编辑预览office文档

文章目录 1 在线编辑1.1 PageOffice简介1.2 前端项目1.2.1 配置1.2.2 页面部分 1.3 后端项目1.3.1 pom.xml1.3.2 添加配置1.3.3 controller 2 在线预览2.1 引言2.2 市面上现有的文件预览服务2.2.1 微软2.2.2 Google Drive查看器2.2.3 阿里云 IMM2.2.4 XDOC 文档预览2.2.5 Offic…

【simple-admin】FMS模块如何快速接入阿里云oss 腾讯云cos 服务 实现快速上传文件功能落地

让我们一起支持群主维护simple-admin 社群吧!!! 不能加入星球的朋友记得来点个Star!! https://github.com/suyuan32/simple-admin-core 一、前提准备 1、goctls版本 goctls官方git:https://github.com/suyuan32/goctls 确保 goctls是最新版本 v1.6.19 goctls -v goct…

在el-dialog编辑界面el-upload跳动问题

el-dialog中有子组件el-upload&#xff0c;并且做了只能显示一个文件的限制 1.在第一次打开后&#xff0c;关闭dialog&#xff0c;再打开dialog会有跳动 这是因为之前打开的dialog中&#xff0c;文件仍旧在&#xff0c;新一次的打开的文件把上一次顶掉了&#xff0c;所以产生…