金牌会员
 
- 积分
- 2285
- 金钱
- 2285
- 注册时间
- 2017-8-24
- 在线时间
- 375 小时
|
本帖最后由 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;
}
}
我们看一下效果
可以看到效果还不错
我的对话框明显有点小了,心形也不居中,嗯,可以这样子,先算一下计算出来的最大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;
}
我们再看一下效果
还不错吧,你也试试,后续更新ing...
|
|