第二篇 阿基米德螺旋线 小Demo 简单 易懂 实现 vc++8.0

偶然间发现了一个图形感觉挺有意思的!写个Demo计算图形坐标!

小编半路入行两年了,利用闲暇时间利用写的求阿基米德螺旋线点的坐标,欢迎各位的大神批评指正!
index 点的下标
step 步长相邻两个点的间隔(根据自己的画布选择,小编这里取60px)
x,y 原点的坐标
direction 方向(4个方向一个方向两种 共8种)
下左上 下右上
左上右 右上左
上右下 上左下
右下左 左下右

POINT FindNextPosByAHMDSpiral(int index, int step = 50, int x = 0, int y = 0,int direction = 0)//默认方向 下左上
{
    POINT nextPos,lastPos;
    if(index < 1)
    {
        //第一个点默认原点
        nextPos.x = x,nextPos.y = y;
    }
    else
    {
        lastPos.x = x,lastPos.y = y;//最后一个点的坐标
        int count = 1;//找第几个点
        while(count <= index)
        {
            if(count != 1)
            {
                lastPos.x = nextPos.x;
                lastPos.y = nextPos.y;
            }
            int sum = 1;
            int n = 0;
            while(count > sum)
            {
                sum += n + 1;
                n++;
            }
            int nextDir = n % 4;// 0:左下 1:左上 2:右上 3:右下
            if(direction < 4)//顺时针4种
            {
                nextDir += direction;
            }
            else if (direction < 8)//逆时针的4种
            {
                int d = direction - 4;
                nextDir = abs(nextDir - 3); //取相反值
                nextDir += d;
            }
            nextDir = nextDir >= 4 ? nextDir - 4 : nextDir;
            switch(nextDir)
            {
                case 0:
                    {
                        nextPos.x = lastPos.x - step / 2;
                        nextPos.y = lastPos.y + step / 2;
                        break;
                    }
                case 1:
                    {
                        nextPos.x = lastPos.x - step / 2;
                        nextPos.y = lastPos.y - step / 2;
                        break;
                    }
                case 2:
                    {
                        nextPos.x = lastPos.x + step / 2;
                        nextPos.y = lastPos.y - step / 2;
                        break;
                    }
                case 3:
                    {
                        nextPos.x = lastPos.x + step / 2;
                        nextPos.y = lastPos.y + step / 2;
                        break;
                    }
            }
            count++;
        }
    }
    return nextPos;
}

然后调用即可求出下个点的坐标。

POINT nextPos = FindNextPosByAHMDSpiral(index, 60, 512, 384, type);

下面是两张同一方向的两种图:
第二篇 阿基米德螺旋线 小Demo 简单 易懂 实现 vc++8.0_第1张图片
第二篇 阿基米德螺旋线 小Demo 简单 易懂 实现 vc++8.0_第2张图片

你可能感兴趣的:(搞事,平凡)