OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2918|回复: 1

心形算法计算坐标

[复制链接]

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
发表于 2018-6-26 00:25:43 | 显示全部楼层 |阅读模式
本帖最后由 xcc521 于 2018-6-26 00:25 编辑

心形坐标的计算
直接看程序:
public Point getHeartPoint(float angle) {
  float t = (float) (angle / Math.PI);
  float x = (float) (19.5 * (16 * Math.pow(Math.sin(t), 3)));
  float y = (float) (-20 * (13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t)));
   return new Point(offsetX + (int) x, offsetY + (int) y);
}





没错是java,没关系我们转换一下
void getHeartPoint(int angle)
{
  float t = (float) ((float)angle / app_pi);
  float x_ = (float) (19.5 * (16 * pow(sin(t), 3)));
  float y_ = (float) (-20 * (13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)));
}

好,我们首先看一下它的输出值,好像超出我们的屏幕分辨率
没关系,我们先移动一下,再缩放一下

void getHeartPoint(int angle)
{
  float t = (float) ((float)angle / app_pi);
  float x_ = (float) (19.5 * (16 * pow(sin(t), 3)));
  float y_ = (float) (-20 * (13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)));
        x_ += 350;y_ += 350;
        x_ /= 2;y_ /= 2;
}

最后再画一下
LCD_Draw_Circle((int)x_,(int)y_,3);
再加一个循环画360度
void draw_heart(void)
{
        int ang = 0;
        int aa = 0;
        for(ang = 0;ang < 360;ang ++)
        {
                getHeartPoint(aa);
                aa += 1;
        }
        
}

我们看一下效果
IMG_20180622_210634.jpg
可以看到效果还不错
我的对话框明显有点小了,心形也不居中,嗯,可以这样子,先算一下计算出来的最大X和Y值,然后以平均就知道中心坐标了,再拿中心坐标加上半倍的屏幕宽高就偏移到中间了

好了,你们自己计算吧,我先就大概随便试一个值吧,自动计算后面有时间在写


void getHeartPoint(int angle)
{
  float t = (float) ((float)angle / app_pi);
  float x_ = (float) (19.5 * (16 * pow(sin(t), 3)));
  float y_ = (float) (-20 * (13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)));
        x_ += 350;y_ += 350;
        x_ /= 2;y_ /= 2;
        x_ += 50;
        y_ += 200;
//        heart_data[angle][0] = x_;
//        heart_data[angle][1] = y_;
        LCD_Draw_Circle((int)x_,(int)y_,3);
}

void draw_heart(void)
{
        int ang = 0;
        int aa = 0;
        for(ang = 0;ang < 360;ang ++)
        {
                getHeartPoint(aa);
                aa += 1;
        }
        
}

u8 appplay_heart(u8* caption)
{
        u8 rval=0;
        
        u16 sx=(lcddev.width-440)/2;
        u16 sy=(lcddev.height-600)/2;
        
         _window_obj* twin=0;        //窗体
         twin=window_creat(sx,sy,440,600,0,1<<6|1<<0,16);//创建窗口
        if(0||(!twin))rval=1;
        if(rval==0)
        {
                twin->caption=caption;                                         
                 twin->windowbkc=BLACK;                                        //窗体主色
                window_draw(twin);                                                                                                        //画窗体
                BACK_COLOR=BLACK;        //背景色为窗体主色
                POINT_COLOR=RED;                                //红色的字
                draw_heart();
                while(1)
                {
                        
                        if(system_task_return)break;//TPAD返回
                        delay_ms(10);
                }
        }
        window_delete(twin);
        return rval;
}


我们再看一下效果
IMG_20180622_211616.jpg


IMG_20180622_211623.jpg


IMG_20180622_211649.jpg

还不错吧,你也试试,后续更新ing...
PIC20180626001253 [原始大小].jpg



天然懒,天然呆
能吃会睡,未来可期
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-6-26 01:14:31 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 08:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表