【matlab】震撼!只能用这两个字了,真是奇女子

2024-09-05 00:48

本文主要是介绍【matlab】震撼!只能用这两个字了,真是奇女子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一千个圆零一个姑娘http://www.withparadox2.com/archives/90#comments

我参考Hanson在1960年发表的一篇论文(点击这里查看)做了这个动画。如果你看过我之前的一篇名为《图片迷宫》的文章,便不会对下面这位女同学感到陌生。与上次不一样,这一次我先征得了她的同意方才对照片进行了大刀阔斧的处理,由于手艺不好,勾勒出的人物效果也不尽人意,在此对她表达深深的歉意。

这个动画实际是一套行星圆系统,设想太阳不动,地球绕着太阳转,月球绕着地球转,XX绕着月球转……圆越多,得出的形状也就越复杂。Hanson在论文中论证了,如果给出的圆足够多,理论上是可以得出任何形状的轨迹线。下面简要介绍一下基本的制作步骤。

1,处理图片
首先需要勾勒出线条图,最好能够一笔从头画到尾。但在这个图里,由于人物的眉毛、嘴巴的存在,没办法一笔画出来,我采取的办法是加上辅助线,最后作图时将辅助线抹掉。

然后通过下面这段代码将上面的位图转化为坐标,但这里线段的顺序是乱的,需要很大的耐心去手动调整。目前没找到好的方法。

pic = Import["location of your picture"];
lcp = ListCurvePathPlot@Position[ImageData[Thinning@Binarize[ColorNegate@pic]], 1];
lines = Cases[lcp[[1, 1, 3]], _Line] /. {x_Real, y_Real} :> {y, -x};

2,复数及傅里叶变换
下面仅简单介绍一下与本文有关的知识,更具体的内容参看其他资料。
对于平面上的一点,可以用复数 z=x+iy 来表示,极坐标形式为 z=reiθ 。对于一个以坐标 c=x+iy 为圆心,以 ρ 为半径,以 T 为周期,以 α 为初始角的圆周运动,可用下式表示(其中t代表时间):

z=c+ρei(2πt/T+α)

例如当 t=t0 时,点的坐标为:
z=c+ρei(2πt0/T+α)=x+iy+ρcos(2πt/T+α)+iρsin(2πt/T+α)=(x+ρcos(2πt/T+α)+i(y+ρsin(2πt/T+α)))

f(t) 表示运动的点的轨迹,那么以此点为圆心做圆周运动的点可以表示为:
z=f(t)+ρ1ei(2πt/T1+α1)

对于N个圆,除了第一个圆心是固定点( c=x+iy )外,还剩下N个运动的点(除了N-1个运动的圆心,第N个圆上还有一个运动的点),由上可得出第N个圆上点的轨迹:
z=c+k=1N1ρkei(2πt/Tk+αk)

事实上,这已经和复数的离散傅里叶变换有了绝大部分的相似,下面就越来越简单了。首先,将之前得到的图片坐标转化为复数坐标,即: (x,y)x+iy ,然后对这N个复数进行傅里叶变换,得到 X[k] ,然后再用逆变换通过另一种形式得到原来的坐标:
x[n]=k=0N1X[k]ej2πkn/N

n/N=t k=1/Tk 。上面 ρk 为实数,这里 X[k] 为复数,好像不一样。那是因为 X[k] 中既包括了半径,也包括了初始角,进一步变换可知:
x[t]=k=0N1X[k]ej2πt/Tk=X[0]+k=1N1|X[k]|X[k]|X[k]|ej2πt/Tk=X[0]+k=1N1|X[k]|ejαkej2πt/Tk=X[0]+k=1N1|X[k]|ej(2πt/Tk+αk)=X[0]+k=1N1|X[k]|ej(2πt/Tk+αk)

这里的 |X[k]| 便是圆的半径,通过求和得到圆心坐标,当改变 t(0t1) ,圆心坐标就会得到更新,从而生成连续动画。

在作图时,可以根据半径大小排序,将半径小的作为“笔尖”,并且可以去掉一些半径太小的圆。

3,一千个圆零一个姑娘【看原址,辣鸡CSDN传不上】


这篇关于【matlab】震撼!只能用这两个字了,真是奇女子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137507

相关文章

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征

两个长数字相加

1.编程题目 题目:要实现两个百位长的数字直接相加 分析:因为数字太长所以无法直接相加,所以采用按位相加,然后组装的方式。(注意进位) 2.编程实现 package com.sino.daily.code_2019_6_29;import org.apache.commons.lang3.StringUtils;/*** create by 2019-06-29 19:03** @autho

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;