1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 在unity向量空间内绘制几何(1):通过将极坐标转换为直角坐标 绘制阿基米德螺线 对数

在unity向量空间内绘制几何(1):通过将极坐标转换为直角坐标 绘制阿基米德螺线 对数

时间:2024-06-20 05:42:54

相关推荐

在unity向量空间内绘制几何(1):通过将极坐标转换为直角坐标 绘制阿基米德螺线 对数

一些基础几何图形的极坐标公式

极坐标内的每个点都有两个参数: r, 与 θ\thetaθ。r为此点到极点(中心点)的距离,θ\thetaθ 为此点到极点的线段与极轴(类似x轴)的夹角。

很多几何图形公式都可以用极坐标简洁的表示,例如:

阿基米德螺旋线:(公式1) r=a+b*θ\thetaθ

对数螺旋线:(公式2)r=a∗eb∗θr=a*e^{b*\theta}r=a∗eb∗θ

心脏线:(公式3)r=a(1−sin⁡∗θ)r=a(1-\sin*\theta)r=a(1−sin∗θ)

玫瑰线:(公式4)r=cos⁡(k∗θ)+cr=\cos(k*\theta)+cr=cos(k∗θ)+c

以上公式中的a,b,c,k都是常数,可以用来控制图形的形状。

已知了r 与 θ\thetaθ 的关系,那么只要依次算出θ\thetaθ从0至2π\piπ相对应的r值,我们就能得出一个连续的极坐标(r, θ\thetaθ)数组。

极坐标与直角坐标的转换函数

直角坐标xy与r,θ\thetaθ的关系:

公式5:

x=r∗cos⁡(θ)x=r*\cos(\theta)x=r∗cos(θ)

y=r∗sin⁡(θ)y=r*\sin(\theta)y=r∗sin(θ)

尝试将公式5与各极坐标公式结合:

public Vector3[] GeneratePolarRoses(int points,Vector3 centre,float k,float c,float scale){Vector3[] coordinates=new Vector3[points]; //将2π均分为points份,并依次赋予thetafloat 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可以设置图形整体大小。

下面生成阿基米德螺旋线与对数螺旋线的函数的思路与玫瑰线基本相同,唯一不同的是增加了一个参数circles可以设置螺旋的圈数:

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++){//公式1radius=a+b*theta;//公式5coordinates[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++){//公式2radius=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;}

GenerateLogarithmicSpirals效果图,a为0.1,b为0.1,共13圈的对数螺线,每个坐标点放置了不同scale的UI图。

在unity向量空间内绘制几何(1):通过将极坐标转换为直角坐标 绘制阿基米德螺线 对数螺线与玫瑰线等几何图形

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。