在Unity向量空间内绘制几何图形:绘制阿基米德螺线,对数螺线与玫瑰线

发表于2018-10-31
评论0 3k浏览
极坐标内的每个点都有两个参数: r, 与 θ。r为此点到极点(中心点)的距离,θ 为此点到极点的线段与极轴(类似x轴)的夹角。

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

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

对数螺旋线:


心脏线:(公式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圈的对数螺线。
来自:https://blog.csdn.net/liu_if_else/article/details/51458603

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: