原创:项道德(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日