转自 百度贴吧
无锯齿,从左到右纵向画线,高效率,边数可随意调节

ddx.jpg

ddx2.jpg


ddx3.jpg



//放代码
#include "SDL2/SDL.h"
#include<math.h>
#define N 9

int w,h;
SDL_Window *win = NULL;//窗口
SDL_Renderer *render = NULL;//渲染器

int main(int,char**)
{
SDL_Init (SDL_INIT_EVERYTHING);
win=SDL_CreateWindow
("SDL_Window",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, 400,
240, SDL_WINDOW_SHOWN);
render=SDL_CreateRenderer
(win, -1, NULL); //初始化

SDL_GetWindowSize (win,&w,&h);
//获取屏幕宽高

float x=w/2,y=h/2;//多边形坐标
float r=200;//多边形半径
float i;//计步循环体(从左至右绘图)
float t=tan((180-360/(float)N)
/2/180*3.14),
rx=r,b=0,ta,tb,tc;
//主要实现:t为一半的顶角的正切,
//rx为变化半径
//b与i同步以计算rx
int times=0;//控制变化周期次数

SDL_SetRenderDrawColor(render,
0x9f,0x9f,0x9f,0xff);
SDL_RenderClear(render);
SDL_SetRenderDrawColor(render,
0x64,0xff,0x64,0xff);

tc=cos((180-360/(float)N)/2/180*3.14)
*r*2*
cos((180-360/(float)N)/2/180*3.14);
tb=tc;
ta=r;
for (i=-r+1;;i++)
{
b=(ta+i)/tb*tc;
rx=sqrt ((t*b)*(t*b)+(r-b)*(r-b));
//设置变化半径

SDL_RenderDrawLine(render,
i+x,sqrt(rx*rx-i*i)+y,
i+x,-sqrt(rx*rx-i*i)+y);

/*变化一个周期*/
if (b>=tc)
{
b=0;
times+=1;
if (times==(int )N/2)
break;//结束运算
ta=cos(times*(360/N)/180.0*3.14)*r;
tb=ta-cos((times+1)*(360/N)
/180.0*3.14)*r;
}
}

SDL_RenderPresent(render);
SDL_Delay(1000000);
}