网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月02日漏签0天
easyx吧 关注:10,937贴子:46,976
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 3回复贴,共1页
<<返回easyx吧
>0< 加载中...

多芒星的实现?

  • 只看楼主
  • 收藏

  • 回复
  • 天空之鸿鹄
  • 五年级
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
从C语言吧看到的一个关于多芒星的帖子,不过貌似用的是穷举法。。。
求教大神,怎么直接得出多芒星的绘图函数,先上图:


  • 天空之鸿鹄
  • 五年级
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
那几个坐标一定可以用通用公式表示,所以我们就来找出公式,由图和式子可以看出,这几个坐标的最大不同之处就是角度,每个相差2*a,也就是4*PI/5,所以推出公式如下
start5crood[2*n]=(int)(sin(4*n*PI/5)*r+320);
start5crood[2*n+1]=(int)(-1*cos(4*n*PI/5)*r+240);n为0到5;如果把它那么完整的代码如下
void graph8()//多芒星的画法,貌似的用穷举发,具体方法参考贴吧,主要是那个坐标公式中的n前面的数字不确定
{
initgraph(640,480);
setbkcolor(0x0000ff);
cleardevice();
int start5crood[10]={0};
int r = 500;
POINT p[150];
for(int n=0;n<150;++n)//这个多芒星的内部是什么,我真的不确定。。
{
p[n].x=(int)(sin(142*n*PI/150)*r+320);
p[n].y=(int)(-1*cos(142*n*PI/150)*r+240);
}
//setcolor(0x0000ff);
setfillcolor(0xffffff);
fillpolygon(p,150);
getch();
closegraph();
}


2025-07-02 10:26:40
广告
  • 天空之鸿鹄
  • 五年级
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
五角星讲完了,再来个十二芒星,

坐标算法都是一样的,我就不再赘述了,直接给出公式
for(int n=0;n<12;++n)
{
pt[2*n]=(int)(sin(10*n*PI/12+a)*r+x);
pt[2*n+1]=(int)(cos(10*n*PI/12+a)*r+y);
}
现在我们来找多芒星的通用公式,对比下两个公式,哪些是关键要素,他们的共同点是什么,如下
int pt[顶点数*2]={0}
for(int n=0;n<顶点数;++n)
{
pt[2*n]=(int)(sin(某个数*n*PI/顶点数+a)*r+x);
pt[2*n+1]=(int)(cos(某个数*n*PI/顶点数+a)*r+y);
}
那个某个数怎么算呢,用最笨的方法,枚举,所以把函数做如下修改
bool pentagram(int x,int y, unsigned int bianshu, double r,double a, int i)
{
if(r<0)
{
return false;
}
setbkcolor(0x0000ff);
int *bian = (int *)malloc(2*bianshu*sizeof(int));
char s[3]={0};
for(int n=0;n<bianshu;++n)
{
bian[2*n]=(int)(sin(i*n*PI/bianshu+a)*r+x);
bian[2*n+1]=(int)(cos(i*n*PI/bianshu+a)*r+y);
}
setcolor(0x0000ff);
setfillcolor(0xffffff);
fillpoly(bianshu,bian);
setcolor(0xff0000);
sprintf(s, "%d", i);
outtextxy(10, 10, s);
}
int main(void)
{
initgraph(640,480);
setrendermode(RENDER_MANUAL);
for(int i = 0;is_run();delay_fps(60))
{
cleardevice();
pentagram(320, 240, 12, 100,0.0, i);
getch();
++i;
} getch();
closegraph();
return 0;
}


  • 天空之鸿鹄
  • 五年级
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
问题来了,这样是通过穷举法得到的参数(某个数),那么怎么样直接得到参数,或者直接有多芒星的绘图算法


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 3回复贴,共1页
<<返回easyx吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示