在unity向量空间内绘制几何(1):通过将极坐标转换为直角坐标,绘制阿基米德螺线,对数螺线与玫瑰线等几何图形
2016-05-20 00:38
701 查看
极坐标内的每个点都有两个参数: r, 与 θ。r为此点到极点(中心点)的距离,θ 为此点到极点的线段与极轴(类似x轴)的夹角。
很多几何图形公式都可以用极坐标简洁的表示,例如:
阿基米德螺旋线:(公式1) r=a+b*θ
对数螺旋线:(公式2)r=a∗eb∗θ
心脏线:(公式3)r=a(1−sin∗θ)
玫瑰线:(公式4)r=cos(k∗θ)+c
以上的a,b,c,k都是常数,用来控制图形的形状。
已知了r 与 θ 的关系,只要依次算出θ从0至2π相应的r的值,我们就能得出一个连续的极坐标(r, θ)数组。
极坐标与直角坐标的转换
公式:(公式5)x=r∗cos(θ) y=r∗sin(θ)
将以上信息转化为代码既是:
以上函数将会返回一个玫瑰线坐标点数组,参数points为数组长度,centre为图形中心点坐标。参数k必须为整数,当为奇数时,花瓣数量为k,当为偶数时,花瓣数量为2k。参数c也会影响图形形状,当为0-1之间时,将会产生类似花蕊的效果。参数scale可以设置图形整体大小。
阿基米德螺旋线与对数螺旋线的思路基本相同,唯一不同的是,需要增加一个参数设置螺旋的圈数。
对数螺线
上图:一个a为0.1,b为0.1,共13圈的对数螺线。
很多几何图形公式都可以用极坐标简洁的表示,例如:
阿基米德螺旋线:(公式1) r=a+b*θ
对数螺旋线:(公式2)r=a∗eb∗θ
心脏线:(公式3)r=a(1−sin∗θ)
玫瑰线:(公式4)r=cos(k∗θ)+c
以上的a,b,c,k都是常数,用来控制图形的形状。
已知了r 与 θ 的关系,只要依次算出θ从0至2π相应的r的值,我们就能得出一个连续的极坐标(r, θ)数组。
极坐标与直角坐标的转换
公式:(公式5)x=r∗cos(θ) y=r∗sin(θ)
将以上信息转化为代码既是:
public Vector3[] GeneratePolarRoses(int points,Vector3 centre,float k,float c,float scale){ Vector3[] coordinates=new Vector3[points]; //将2π均分为points份,并依次赋予theta float theta=2f*Mathf.PI/points; float radius; for(int t=0;t<points;t++){ //公式4转换为代码,算出theta从0至2π每个角度的r值 radius=Mathf.Cos(k*theta)+c; //公式5转换为代码,既是将极坐标转换为直角坐标 coordinates[t]=new Vector3(scale*radius*Mathf.Cos(theta)+centre.x,scale*radius*Mathf.Sin(theta)+centre.y,0f); theta+=2f*Mathf.PI/points; } return coordinates; }
以上函数将会返回一个玫瑰线坐标点数组,参数points为数组长度,centre为图形中心点坐标。参数k必须为整数,当为奇数时,花瓣数量为k,当为偶数时,花瓣数量为2k。参数c也会影响图形形状,当为0-1之间时,将会产生类似花蕊的效果。参数scale可以设置图形整体大小。
阿基米德螺旋线与对数螺旋线的思路基本相同,唯一不同的是,需要增加一个参数设置螺旋的圈数。
public Vector3[] GenerateArchimedeanSpirals(int points,Vector3 centre,int circles,float a,float b){ Vector3[] coordinates=new Vector3[points]; float radius; //调整角度的分配模式,circles为螺旋的圈数 float theta=2f*Mathf.PI/points*circles; for(int t=0;t<points;t++){ //公式1 radius=a+b*theta; //公式5 coordinates[t]=new Vector3(radius*Mathf.Cos(theta)+centre.x,radius*Mathf.Sin(theta)+centre.y,0f); theta+=2f*Mathf.PI/points*circles; } return coordinates; }
对数螺线
public Vector3[] GenerateLogarithmicSpirals(int points,Vector3 centre,int circles,float a,float b){ Vector3[] coordinates=new Vector3[points]; float radius; float theta=2f*Mathf.PI/points*circles; for(int t=0;t<points;t++){ //公式2 radius=a*Mathf.Exp(b*theta); coordinates[t]=new Vector3(radius*Mathf.Cos(theta)+centre.x,radius*Mathf.Sin(theta)+centre.y,0f); theta+=2f*Mathf.PI/points*circles; scales[t]=radius; } return coordinates; }
上图:一个a为0.1,b为0.1,共13圈的对数螺线。
相关文章推荐
- 用批处理解决数学问题的代码第1/4页
- C#实现图形位置组合转换的方法
- C#实现判断图形文件格式的方法
- C#实现图形路径变换的方法
- php生成图形验证码几种方法小结
- CentOS的图形安装及初始环境设置教程
- C#实现图形区域组合操作的方法
- php实现图形显示Ip地址的代码及注释
- Oracle数学相关函数小结
- php常用数学函数汇总
- Java Web开发之图形验证码的生成与使用方法
- 基于Echarts 3.19 制作常用的图形(非静态)
- android中图形图像处理之drawable用法分析
- Android编程开发之在Canvas中利用Path绘制基本图形(圆形,矩形,椭圆,三角形等)
- Android开发之图形图像与动画(五)LayoutAnimationController详解
- C++实现图形界面时钟表盘代码
- unity实现多点触控代码
- C++实现二维图形的傅里叶变换
- Java在Linux下 不能处理图形的解决办法 分享
- 在Unity中实现动画的正反播放代码