3阶以下贝塞尔曲线轨迹库和任意轨迹库

来源:互联网 发布:spf最短路径算法 编辑:程序博客网 时间:2024/06/05 15:36
20130521:任意轨迹库中添加19条轨迹。按屏幕矩形边界上有16个点,连接起点P_i和终点P_j的轨迹平均有3条计算,任意轨迹库最多约有240*3=720条轨迹。
20130522-20130523:用MFC开发3阶以下贝塞尔曲线轨迹编辑工具供策划使用,3阶以下贝塞尔曲线轨迹编辑工具Bezier3Tool开发完成。

一阶贝赛尔曲线(线段):B(t)=(1-t)P_0+tP_1,t∈[0,1]
意义:由起点P_0到终点P_1的连续点,描述一条线段。
没有控制点。
二阶贝塞尔曲线(抛物线):B(t)=(1-t)^2P_0+2t(1-t)P_1+t^2P_2,t∈[0,1]
有1个控制点P_1。
三阶贝塞尔曲线:B(t)=(1-t)^3P_0+3t(1-t)^2P_1+3t^2(1-t)P_2+P_3t^3,t∈[0,1]
有2个控制点P_1、P_2。

轨迹大类5:起点为右边界上的点,终点为上边界上的点
构造轨迹起点为P_9(w,0.25h)=(1024,162.5),轨迹终点为P_16(w/6,h)=(170.7,650)的第一种轨迹Trace_9_16_1、第二种轨迹Trace_9_16_2、第三种轨迹Trace_9_16_3、第四种轨迹Trace_9_16_4的LUA代码:
function Trace_9_16_1(t)
          --轨迹起点为P_9(w,0.25h)=(1024,162.5),轨迹终点为P_16(w/6,h)=(170.7,650)的第一种轨迹
          --local P_9=ccp(1024,162.5)
          local a=1100
          local x=1024-a*t
          local y=0.00047*(x-1200)*(x-1200)+147.94
          return ccp(x,y)
end
function Trace_9_16_2(t)
          --轨迹起点为P_9(w,0.25h)=(1024,162.5),轨迹终点为P_16(w/6,h)=(170.7,650)的第二种轨迹
          --local P_9=ccp(1024,162.5)
          local a=1100
          local x=1024-a*t
          local y=-0.00048*x*x+663.986
          return ccp(x,y)
end
function Trace_9_16_3(t)
          --轨迹起点为P_9(w,0.25h)=(1024,162.5),轨迹终点为P_16(w/6,h)=(170.7,650)的第三种轨迹
          local P_9=ccp(1024,162.5)
          local P_16=ccp(170.7,650)
          local tempx=(P_9.x-P_16.x)*(P_9.x-P_16.x);
          local tempy=(P_9.y-P_16.y)*(P_9.y-P_16.y);
          local r=math.sqrt(tempx+tempy);--r=nT=2npiA,n=1,1.5,2,2.5,……
          local A=r/(math.pi*2)--200
          local arg=math.atan2(P_16.y-P_9.y,P_16.x-P_9.x);       
          --轨迹起点为P_9=(350,300),振幅为A,周期为T=2piA,“辐角为arg的反正弦波”曲线轨迹
          --将2调大为2.5
          local x=A*2.5*math.pi*t
          local y=A*math.sin(-2.5*math.pi*t)--+表示"正正弦波",-表示“反正弦波”
          local Pt=ccp(x*math.cos(arg)-y*math.sin(arg),x*math.sin(arg)+y*math.cos(arg))--(x,y)逆时针旋转a=arg之后变为(xcosa-ysina,xsina+ycosa)
          return ccp(P_9.x+Pt.x,P_9.y+Pt.y)       
end
--实际上从上边界出来后又从上边界进来了,最后从左边界出来
function Trace_9_16_4(t)
          --轨迹起点为P_9(w,0.25h)=(1024,162.5),轨迹终点为P_16(w/6,h)=(170.7,650)的第三种轨迹
          local P_9=ccp(1024,162.5)
          local P_16=ccp(170.7,650)
          local tempx=(P_9.x-P_16.x)*(P_9.x-P_16.x);
          local tempy=(P_9.y-P_16.y)*(P_9.y-P_16.y);
          local r=math.sqrt(tempx+tempy);--r=nT=2npiA,n=1,1.5,2,2.5,……
          local A=r/(math.pi*2)--200
          local arg=math.atan2(P_16.y-P_9.y,P_16.x-P_9.x);       
          --轨迹起点为P_9=(350,300),振幅为A,周期为T=2piA,“辐角为arg的正正弦波”曲线轨迹
          --将2调大为2.5
          local x=A*2.5*math.pi*t
          local y=A*math.sin(2.5*math.pi*t)--+表示"正正弦波",-表示“反正弦波”,与Trace_9_16_3不同的地方
          local Pt=ccp(x*math.cos(arg)-y*math.sin(arg),x*math.sin(arg)+y*math.cos(arg))--(x,y)逆时针旋转a=arg之后变为(xcosa-ysina,xsina+ycosa)
          return ccp(P_9.x+Pt.x,P_9.y+Pt.y)       
end
轨迹大类4:起点为右边界上的点,终点为左边界上的点
构造轨迹起点为P_9(w,0.25h)=(1024,162.5),轨迹终点为P_1(0,0.75h)=(0,487.5)的第一种轨迹Trace_9_1_1、第二种轨迹Trace_9_1_2、第三种轨迹Trace_9_1_3、第四种轨迹Trace_9_1_4
的LUA代码:
function Trace_9_1_1(t)
          --轨迹起点为P_9(w,0.25h)=(1024,162.5),轨迹终点为P_1(0,0.75h)=(0,487.5)的第一种轨迹
          --local P_9=ccp(1024,162.5)
          local a=1100
          local x=1024-a*t--与Trace_1_9_1(t)不同的地方
          local y=-0.31738*x+487.5
          return ccp(x,y)
end
--顶点在左边界上、开口向右的抛物线,暂时不采用该轨迹
function Trace_9_1_2(t)
          --轨迹起点为P_9(w,0.25h)=(1024,162.5),轨迹终点为P_1(0,0.75h)=(0,487.5)的第二种轨迹
          --local P_9=ccp(1024,162.5)
          local a=400
          local y=162.5+a*t--与Trace_1_9_2(t)不同的地方
          local x=0.00969*(y-487.5)*(y-487.5)
          return ccp(x,y)
end
function Trace_9_1_3(t)
          --轨迹起点为P_9(w,0.25h)=(1024,162.5),轨迹终点为P_1(0,0.75h)=(0,487.5)的第三种轨迹
          --local P_1=ccp(0,487.5)
          local a=400
          local y=162.5+a*t--与Trace_1_9_3(t)不同的地方
          local x=-0.00485*y*y+1152.63
          return ccp(x,y)
end
--顶点在右边界上、开口向左的抛物线
function Trace_9_1_4(t)
          --轨迹起点为P_9(w,0.25h)=(1024,162.5),轨迹终点为P_1(0,0.75h)=(0,487.5)的第三种轨迹
          --local P_9=ccp(1024,162.5)
          local a=400
          local y=162.5+a*t--与Trace_1_9_4(t)不同的地方
          local x=-0.00969*(y-162.5)*(y-162.5)+1024
          return ccp(x,y)
end
轨迹大类3:起点为左边界上的点,终点为右边界上的点
构造轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_9(w,0.25h)=(1024,162.5)的第一种轨迹Trace_1_9_1、第二种轨迹Trace_1_9_2、第三种轨迹Trace_1_9_3、第四种轨迹Trace_1_9_4的LUA代码:
function Trace_1_9_1(t)
          --轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_9(w,0.25h)=(1024,162.5)的第一种轨迹
          --local P_1=ccp(0,487.5)
          local a=1100
          local x=a*t
          local y=-0.31738*x+487.5
          return ccp(x,y)
end
function Trace_1_9_2(t)
          --轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_9(w,0.25h)=(1024,162.5)的第二种轨迹
          --local P_1=ccp(0,487.5)
          local a=400
          local y=487.5-a*t
          local x=0.00969*(y-487.5)*(y-487.5)
          return ccp(x,y)
end
function Trace_1_9_3(t)
          --轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_9(w,0.25h)=(1024,162.5)的第三种轨迹
          --local P_1=ccp(0,487.5)
          local a=400
          local y=487.5-a*t
          local x=-0.00485*y*y+1152.63
          return ccp(x,y)
end
--顶点在右边界上、开口向左的抛物线,暂时不采用该轨迹
function Trace_1_9_4(t)
          --轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_9(w,0.25h)=(1024,162.5)的第三种轨迹
          --local P_1=ccp(0,487.5)
          local a=400
          local y=487.5-a*t
          local x=-0.00969*(y-162.5)*(y-162.5)+1024
          return ccp(x,y)
end
轨迹大类2:起点为左边界上的点,终点为上边界上的点
问:构造轨迹起点为P_1,轨迹终点为P_12时的第一种轨迹Trace_1_12_1、第二种轨迹Trace_1_12_2?
构造轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_12(5w/6,h)=(853.3,650)的第一种轨迹Trace_1_12_1、第二种轨迹Trace_1_12_2、第三种轨迹Trace_1_12_3、第四种轨迹Trace_1_12_4的LUA代码:
function Trace_1_12_1(t)
          --轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_12(5w/6,h)=(853.3,650)的第一种轨迹
          --local P_1=ccp(0,487.5)
          local a=950
          local x=a*t
          local y=0.19044*x+487.5
          return ccp(x,y)
end
function Trace_1_12_2(t)
          --轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_12(5w/6,h)=(853.3,650)的第二种轨迹
          --local P_1=ccp(0,487.5)
          local a=950
          local x=a*t
          local y=0.00075*(x-300)*(x-300)+420
          return ccp(x,y)
end
function Trace_1_12_3(t)
          --轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_12(5w/6,h)=(853.3,650)的第三种轨迹
          --local P_1=ccp(0,487.5)
          local a=950
          local x=a*t
          local y=0.00204*(x-380)*(x-380)+192.924
          return ccp(x,y)
end
--与x轴有两个交点、开口向上的抛物线,暂时不采用该轨迹
function Trace_1_12_4(t)
          --轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_12(5w/6,h)=(853.3,650)的第四种轨迹
          --local P_1=ccp(0,487.5)
          local a=950
          local x=a*t
          local y=0.00357*(x-400)*(x-400)-83.7
          return ccp(x,y)
end
轨迹大类1:起点为左边界上的点,终点为下边界上的点
问:构造轨迹起点为P_1、轨迹终点为P_8的第一种轨迹Trace_1_8_1、第二种轨迹Trace_1_8_2、第三种轨迹Trace_1_8_3?
不妨取:
y=a/(x-c)+b=11840/(x-877)+500
y=-ax^2+b=-0.00067x^2+487.5
y=ce^(-ax)-b=500e^(-0.0043x)-12.5
【连接P_1(0,0.75h)=(0,487.5)和P_8(5w/6,0)=(853.3,0)线段的中点为(5w/12,0.375h),则该双曲线的上凸关键点为?该抛物线的上凸关键点为?该指数曲线的下凸关键点为?】

代数曲线的单值化:
直线y=kx+b的一个参数方程为:x=at,y=kat+b,t∈[0,1]
双曲线y=a/(x-c)+b=11840/(x-877)+500的一个参数方程为:x=at,y=11840/(at-877)+500,t∈[0,1],这里a>=x(P_8)-x(P_1)=5w/6=853.3

构造轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_8(5w/6,0)=(853.3,0)的第一种轨迹Trace_1_8_1、第二种轨迹Trace_1_8_2、第三种轨迹Trace_1_8_3的LUA代码:
function Trace_1_8_1(t)
          --轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_8(5w/6,0)=(853.3,0)的第一种轨迹
          --local P_1=ccp(0,487.5)
          local a=854
          local x=a*t
          local y=11840/(x-877)+500
          return ccp(x,y)
end
function Trace_1_8_2(t)
          --轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_8(5w/6,0)=(853.3,0)的第二种轨迹
          --local P_1=ccp(0,487.5)
          local a=854
          local x=a*t
          local y=-0.00067*x*x+487.5
          return ccp(x,y)
end
function Trace_1_8_3(t)
          --轨迹起点为P_1(0,0.75h)=(0,487.5),轨迹终点为P_8(5w/6,0)=(853.3,0)的第三种轨迹
          --local P_1=ccp(0,487.5)
          local a=854
          local x=a*t
          local y=500*math.exp(-0.0043*x)-12.5
          return ccp(x,y)
end
参数:
屏幕矩形的宽和高
w=1024
h=650
轨迹起点和轨迹终点
左边界上3个点
P_1=ccp(0,0.75h)
P_2=ccp(0,0.5h)
P_3=ccp(0,0.25h)
下边界5个点
P_4=ccp(w/6,0)
P_5=ccp(w/3,0)
P_6=ccp(w/2,0)
P_7=ccp(2w/3,0)
P_8=ccp(5w/6,0)
右边界3个点
P_11=ccp(w,0.75h)
P_10=ccp(w,0.5h)
P_9=ccp(w,0.25h)
上边界5个点
P_16=ccp(w/6,h)
P_15=ccp(w/3,h)
P_14=ccp(w/2,h)
P_13=ccp(2w/3,h)
P_12=ccp(5w/6,h)
一款实用的绘制函数图象的小工具http://www.oschina.net/code/snippet_585649_13831
一般平面曲线轨迹测试用例,用于自定义轨迹库和轨迹编辑器的前期工作
y=x+sinx
y=x^3/8
圆锥曲线Ax^2+Bxy+Cy^2+Dx+Ey+F=0
双曲余弦曲线y=(e^x+e^(-x))/2
蔓叶线x^3+y^3=3axy
y^2=x^3
x^3-y^3=2x^2
3x^2-10y^2=17
指数曲线y=ax^x(a>0且a≠1)
x^3-4x-2y=0<=>y=x^3/2-2x
定理:过原点的代数曲线,令曲线中的一次项之和等于0,就得到了曲线在原点的切线方程。这个结论对任何过原点的代数曲线都是有效的。
x^2-y^2+x^3=0
4x^2-2y^2+x^3=0
抛物线y=ax^2
阿基米德螺线r=aθ
星形线x^(2/3)+y^(2/3)=a^(2/3),这一方出现于莱布尼兹于1715年的信函中。
y=lnx
心脏线r=2a(1±cosθ)
卡西尼卵形线
贝努里双纽线
悬链线y=ach(x/a)
摆线,第一篇关于摆线的论文是伽利略的学生托里拆利在1644年写的。
等角螺线或对数螺线r=aexp(θcotρ)
费马螺线或抛物螺线