菲涅尔曲线的拓展与应用

                              原创:项道德(daode1212,daode3056)

前言:

    多项式或有理式可以产生大家熟知的曲线,微分与积分也都可以产生不同的曲线,级数的一部分也可以产生曲线,在AGV或其他机器人演示中,可增添技艺与运动品质。本文着重于微积分、多项式等产生的18类曲线,供各位同仁鉴赏。

关键字:微分曲线,各分曲线,菲涅尔曲线

1,先看几个简单的参数方程的图案,如太极螺旋线:{x=t*cos(t2),  y=t*sin(t2)}

2,台风眼

3,中华太极图

4,典型的菲涅尔曲线

5,Sin前面乘上个t,变成猫眼曲线

6,Cos前面乘上个(1-t2),变成雷电曲线

7,用双曲函数缩小,是天边云曲线

 

8,取平方高倍缩小,趋于双纽线

 

9,再配合三角函数作因子,生成兔耳曲线

10,再配合三角函数平方作因子,生成字母“И”曲线

11,三角函数与双曲函数配合,生成种子瓶曲线

12,使用三角函数的无理式,生成字母“S”曲线

13,使用三角函数的无理式,生成数字“6”曲线

以上几乎都是参数方程,下面加入些二元高次方程:

14,有时,我们想要用个容器装点什么的,可以用多项式生成:

15,在我另一篇介绍里侧重推出了互锁迂回路径的生成:

16,迂回路径的生成完全依赖于六个参数的设计,如这曲肠迂回曲线

在GPU中,用OpenCL程序高速并行运算,可以生成以下各图:

(d=7)(d=27)  (d=37)

OpenCL程序源代码如下:

kernel void myCurve( float left, float top, float right, float bottom, int stride, global uchar4* pOutput )

{

  size_t width = get_global_size(0);//width

  size_t height = get_global_size(1);//height

  size_t cx = get_global_id(0);//Current X

  size_t cy = get_global_id(1);//Current Y

  float dx = (right-left)/(float)width; 

  float dy = (bottom-top)/(float)height;

  float x0 = left+dx*(float)cx;

  float y0 = top+dy*(float)cy;

  float x = 0.0f;

  float y = 0.0f;

  int red = 0.0f;

  int grn = 0.0f;

  int blu = 0.0f;

  float u = 0.0f;

  float v = 0.0f;

 u=12.0*(cx - width/2.0)/(float)width;

 v=12.0*(cy - height/2.0)/(float)height;

 x=u*(u*u-1.0)*(u*u-6.0)*(u*u-13.0);

 y=v*(v*v-1.0)*(v*v-5.0)*(v*v-9.0);

  if( abs((int)(x-y)) <= 37) // d=37

  {

     red=0;//(int)(10*x)%255;

     grn=0;

     blu=0;//(int)(10*y)%255;

  }else{

     red=255;

     grn=255;

     blu=255;

  }

  //Output RGBA:

  pOutput[stride*cy+cx] =(uchar4)(red,grn,blu, 255);

}

17,武士头像两例:

在GPU中,用OpenCL程序高速并行运算,可以生成以下各图:

(d=7)(d=17)(d=37)

OpenCL程序源代码如下:

kernel void myCurve( float left, float top, float right, float bottom, int stride, global uchar4* pOutput )

{

  size_t width = get_global_size(0);//width

  size_t height = get_global_size(1);//height

  size_t cx = get_global_id(0);//Current X

  size_t cy = get_global_id(1);//Current Y

  float dx = (right-left)/(float)width; 

  float dy = (bottom-top)/(float)height;

  float x0 = left+dx*(float)cx;

  float y0 = top+dy*(float)cy;

  float x = 0.0f;

  float y = 0.0f;

  int red = 0.0f;

  int grn = 0.0f;

  int blu = 0.0f;

  float t = 0;

  float u = 0.0f;

  float v = 0.0f;

 u=12.0*(cx - width/2.0)/(float)width;

 v=12.0*(cy - height/2.0)/(float)height;

 x=(u*u-1.0)*(u*u-3.0)*(u*u-13.0);

 y=v*(1.0-v*v)*(v*v-6.0)*(v*v-11.0);

  if( abs((int)(x-y)) <= 7) // d=7

  {

     red=0;//(int)(10*x)%255;

     grn=0;

     blu=0;//(int)(10*y)%255;

  }else{

     red=255;

     grn=255;

     blu=255;

  }

  //Output RGBA:

  pOutput[stride*cy+cx] =(uchar4)(red,grn,blu, 255);

}

       较为复杂的数学问题,大多要用OpenCL程序语言在GPU中解决,如大矩阵,N元线性方程组,N次方程的根,作者电脑显卡的型号是P5200。

所有的数学与算法、编程接口,都是可以做探索与研究的,这是做大工程技能储备与前期练兵。

在GPU中处理RGB是很方便的,如下图:

(d=25)

配置彩色后的源代码如下:

kernel void myCurve( float left, float top, float right, float bottom, int stride, global uchar4* pOutput )

{

  size_t width = get_global_size(0);//width

  size_t height = get_global_size(1);//height

  size_t cx = get_global_id(0);//Current X

  size_t cy = get_global_id(1);//Current Y

  float dx = (right-left)/(float)width; 

  float dy = (bottom-top)/(float)height;

  float x0 = left+dx*(float)cx;

  float y0 = top+dy*(float)cy;

  float x = 0.0f;

  float y = 0.0f;

  int red = 0.0f;

  int grn = 0.0f;

  int blu = 0.0f;

  float t = 0;

  float u = 0.0f;

  float v = 0.0f;

 u=12.0*(cx - width/2.0)/(float)width;

 v=12.0*(cy - height/2.0)/(float)height;

 x=(u*u-1.0)*(u*u-3.0)*(u*u-13.0);

 y=v*(1.0-v*v)*(v*v-6.0)*(v*v-11.0);

  if( abs((int)(x-y)) <= 25) // d=25

  {

     red=(int)(u*u+v*v)%255;

     grn=0;

     blu=(int)(x*x+y*y)%255;

  }else{

     red=255;

     grn=(int)(x/5.0)^(int)(y/3.0);

     blu=255;

  }

  //Output RGBA:

  pOutput[stride*cy+cx] =(uchar4)(red,grn,blu, 255);

}

18,这次用七、八次幂的二元方程生成梳状曲线

19,使用六、七次幂的二元方程,可以生成如下叠物曲线

20,又回到参数方程,将利用菲涅尔曲线复合,生成折弯双弹簧的平滑曲线:

算法设计:项道德(悍匠机器人(浙江)有限公司软件部)

2022年9月20日

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值