基于测地线的楦面自动测量方法
技术领域
本发明涉及一般的计算机辅助几何设计,尤其涉及一种基于测地线的楦面自动测量方法。
背景技术
传统的制鞋工艺一般包括量脚做楦、帮样设计、底部件设计和模具设计等几道工序。鞋样设计师以鞋楦为依据,设计出各种款式各种风格的鞋子。在设计前,要先用带子尺、游标卡尺、划盘针等工具对鞋楦的基本参数进行测量,然后根据测量的结果在鞋楦上定出基本的关键点,并描出基本的关键线。鞋楦测量的工作效率很低,而且精度不高,这直接影响到后期跷度设计和样片设计的精度,使得鞋子的试样成功率不高,浪费设计材料。所以,如何应用计算机技术和数字几何处理技术,让计算机自动地对鞋楦进行全方位的精确测量,已经成为制鞋CAD/CAM技术必须突破的关键难题之一。
将楦面上的关键点用测地线连接形成关键线,就可以实时地对鞋楦进行各种测量。测地线也称为短程线,在楦面上连接两点的测地线具有最短距离。所以要解决的关键问题是:任意给定网格曲面上的两点,如何求出一条离散的测地线刚好连接这两点。Mitchell首先提出了一种复杂度为O(n2 log n)的MMP算法(MITCHELL J.,MOUNT D.M.,PAPADIMITRIOU C.H.:The discrete geodesicproblem.SIAM J.Comput.16,1987,647-668)。但算法过于复杂,很难实现。随后,Chen提出了复杂度为O(n2)的算法(CHEN J.,HAN Y.:Shortest paths ona polyhedron;part i:computing shortest paths.Int.J.Comput.Geom.& Appl.6,2,1996,127-144)。1998年,Kimmel提出了复杂度仅为O(nlogn)的算法(KIMMEL R.,SETHIAN J.A.:Computing geodesic paths on manifolds.Proc.National.Academy of Sciences 95,15,1998,8431-8435),但求出的测地线不精确。其它的测地线算法还有扩展的Dijsktra算法(KANAI T.,SUZUKI H.:Approximate shortest path on a polyhedral surface and itsapplications.Computer Aided Design 33,11,2001,801-811),以及最近的MMP改进算法(Kirsanov D.,Gortler S.J.,Hoppe H.:Fast Exact andApproximate Geodesic Paths on Meshes,2004,Harvard University ComputerScience TR 10-04,May 2004),算法在最快的时候复杂度仅为O(nlogn)。遗憾的是,扩展的Dijsktra算法要生成大量的辅助边,MMP改进算法要生成大量的辅助区间,内存消耗都过大。
发明内容
本发明的目的在于针对现有技术的不足,提出一种基于测地线的楦面自动测量方法。
方法的步骤如下:
1)数字鞋楦的网格表示
用规则的三维网格表示鞋楦的整个外表面;
2)楦面的参数化
将数字鞋楦的帮面、底面和统口面分别进行参数化,建立楦面与参数域之间的一一对应关系;
3)楦面上测地线的生成
给定楦面上两点,在楦面上自动生成过这两点的测地线,并计算其长度;
4)楦面的自动测量
对鞋楦的基本长度、宽度、高度和围长进行自动测量。
用规则的三维网格表示鞋楦的整个外表面:是将鞋楦外表面划分成帮面、底面和统口面三片,每一片都由经线和纬线来表示,经线和纬线相交形成规则的四边形网格。
将数字鞋楦的帮面、底面和统口面分别进行参数化,建立楦面与参数域之间的一一对应关系:是在平面上生成三个规则网格作为参数域,分别与表示帮面、底面和统口面的三维网格建立一一对应关系。
给定楦面上两点,在楦面上自动生成过这两点的测地线,并计算其长度:是对楦面上的任意两点,首先生成一条连接这两点的初始路径,然后通过逐步优化,沿着楦面的三维网格自动生成这两点间的最短路径。
对鞋楦的基本长度、宽度、高度和围长进行自动测量:是利用脚型规律定出所需测量长度的楦面位置,然后计算出它的直线距离或曲线距离。其中基本长度包括:楦全长、楦面长、楦斜长、楦底样长、后容差、放余量;宽度包括:拇趾里宽、小趾外宽、第一跖趾里宽、第五跖趾外宽、腰窝外宽、踵心全宽;高度包括:前跷高、后跷高、统口后高、楦体后身高;围长包括跖趾围长、前跗骨围长、兜跟围长。
本发明的优点:本发明很好地结合了鞋楦的传统手工测量方法和数字几何处理技术,提出了一种测地线的快速自动生成算法,算法复杂度仅为O(n)。将楦面上的关键点用测地线连接形成关键线,本方法能对鞋楦的各种技术参数进行测量,如长度、宽度和围长,而且测量方法自动准确,适用于所有头型和款式的鞋楦。这不仅是制鞋CAD/CAM技术必须突破的关键难题之一,而且也是进行鞋楦自动检验,鞋楦CAD/CAM的必备技术。
附图说明
下面结合附图和实施例对本发明作进一步说明。
图1是本发明方法的流程图;
图2是鞋楦的分片和中线示意图;
图3是鞋楦帮面的网格示意图,图3a是帮面经线示意图,图3b是帮面纬线示意图,图3c是帮面三维网格示意图;
图4是鞋楦底面的网格示意图,图4a是底面经线示意图,图4b是底面纬线示意图,图4c是底面三维网格示意图;
图5是鞋楦帮面网格的参数化示意图;
图6是鞋楦底面网格地参数化示意图;
图7是跗腰楦面内宽的初始路径示意图,图7a是参数域上的初始路径示意图,图7b是帮面上的初始路径示意图;
图8是跗腰楦面内宽的优化迭代示意图,图8a是第一次逐步优化示意图,图8b是最后一次优化示意图;
图9是测量时的鞋楦纵剖面示意图;
图10是楦面测量示意图,图10a是楦面测量的内怀示意图,图10b是楦面测量的外怀示意图,图10c是楦面测量的底面示意图。
具体实施方式
本发明提出的一种基于测地线的楦面自动测量方法,包括数字鞋楦的网格表示方法、楦面的参数化方法、楦面上测地线的自动生成算法和楦面的自动测量技术四个部分。流程如图1所表示:首先读取鞋楦数据,将鞋楦表面表示成规则网状结构,并参数化此网格得到二维参数化网格。然后根据楦的脚型规律,自动计算出鞋楦帮面和底面的部分关键点,再运用测地线技术在某些关键点间用测地线连接,得到鞋楦的关键线,测出鞋楦的各种基本长度、宽度和围长。
现具体介绍本方法的四个步骤:
1.数字鞋楦的网格表示
为了后面参数化的方便,本发明采用规则的三维网格来表示鞋楦表面。首先,如图2所示,沿着统口楞线和底边楞线,把整个楦面分成帮面、底面和统口面三片,然后分别将每一片用规则网格表示。
帮面的网格由经线和纬线组成。帮面经线的起点在底边楞线上,然后沿着帮面向上,其终点在统口楞线上,如图3a所示。帮面经线之间互不相交,背中线和后弧中线都是其中的一条经线。帮面纬线的起点在后弧中线上,沿着帮面经过背中线再绕回到后弧中线上,终点与起点重合,如图3b所示。帮面纬线之间也互不相交,底边楞线是最下面的一条帮面纬线,而统口楞线是最上面的一条帮面纬线。将帮面的经线和纬线相交,就形成了表示帮面的四边形网格。
鞋楦底面的网格也由经线和纬线组成。底面纬线的起点在楦底前端点,终点在楦底后端点。底面中线是最中间的一条底面纬线,底边楞线被底面中线分成两段,形成最边上的两条底面纬线。底面纬线在底面中线两边的条数相等,除了在起点和终点外,互不相交,如图4b所示。底面经线的端点由帮面经线的起点组成,列在底面中线两边。底面经线也互不相交,如图4a所示。
鞋楦统口面的网格表示方法与底面一样,以统口中线作为最中间的一条统口纬线,把统口楞线分成两条最边上的统口纬线。以帮面经线的终点作为统口经线的端点。统口经线和统口纬线相交形成统口网格。
在上述的网格表示中,帮面、底面和统口面的网格其实也是连成一体的。整个鞋楦网格可以分成两组截面圈。相连的帮面经线,底面经线和统口经线组成第一组截面圈。其中背中线,统口中线,后弧中线和底面中线形成了一个特殊的截面圈,即鞋楦的纵剖面。而第二组截面圈由帮面的纬线组成。
注意,为了说明方便,附图中的网格比较稀疏,而实际应用中网格要密得多。鞋楦表面的这种网格表示方法,不仅可以有效刻画楦面的局部特征,而且可以精确地描述整个鞋楦,没有盲区。
2.楦面的参数化
基于鞋楦的网格表示具有一定的规律性,可以很容易的将鞋楦网格直接参数化到平面的规则网格上。为了方便说明,把鞋楦头部朝左尾部朝右摆放,将面对我们的一面称为正面,背对我们的一面称为反面。
首先参数化鞋楦的帮面网格。将帮面经线按图3a所示进行编号,从后弧中线开始编号为0,按逆时针方向把反面的帮面经线依次编号为1,2,…,n,其中背中线编号为n,然后将正面的帮面经线依次编号为n+1,n+2,…,2n-1,最后绕回到编号为0的后弧中线,为方面参数化,也可以把它编号为2n。同样把帮面纬线也进行编号,从底边楞线开始编号为0,依次向上编号,到统口楞线编号为m。
现在把编号后的帮面网格映射到二维矩形网格。将编号为i的帮面经线映射到线段[(i,0),(i,m)],将编号为j的帮面纬线映射到线段[(0,j),(2n,j)],如图5所示。这样,帮面的每一个四边形网格都有一个唯一的二维矩形与之对应。
用同样的方法参数化鞋楦的底面网格。如图4a所示,将底面经线从楦头到楦尾依次编号为1,2,…,n-1。并按图4b所示,将底面纬线从下到上依次编号为0,1,…,l。底面网格参数化后的二维网格与帮面略有不同,如图6所示,编号为i的底面经线映射到线段[(i,0),(i,l)],编号为j的底面纬线除首末端点外映射到线段[(1,j),(n-1,j)],底面纬线的首点映射到(0,l/2),末点映射到(n,l/2)。由于底面纬线在底面中线两边的条数相等,l必为偶数,l/2必为整数。同理可以对统口网格编号然后参数化,除了统口纬线条数与底面纬线条数不一样,其它都一样。
参数化后,除了底面和统口面头尾两处的网格为三角网格外,其余的网格均是四边形网格。为统一起见,把所有的四边形网格沿着对角线剖分成三角形网格。这样楦面的每一个三角形网格(或网格点),都有一个唯一的二维三角形网格(或网格点)与之对应。现在,对楦面上的任意一点P,总存在一个三维网格上的三角形包含住它,设为ΔABC,并设与之相对应的二维三角形为Δabc。可以计算出P在ΔABC中的重心坐标(u,v,w):
u=Area(PBC)/Area(ABC),v=Area(PCA)/Area(ABC),w=Area(PAB)/Area(ABC)其中Area()表示三角形的面积。这样,Δabc中与P相对应的点p为
p=u·a+v·b+w·c
反过来,对二维网格中某一三角形Δabc中的任意一点p,设它在Δabc中的重心坐标为(u,v,w),那么与Δabc对应的三角形ΔABC中与p相对应的点P为
P=u·A+v·B+w·C。
这样,对鞋楦上的任意一点,都有参数域网格中的点与之一一对应。
3.楦面上测地线的自动生成
要进行全方位的鞋楦测量,最关键的是如何计算楦面上任意两点间的最短曲线距离。即任意给定楦面上两点P,Q,算法的目标是在鞋楦三维网格上寻找一条从P到Q的最短路径。根据鞋楦测量的基本要求,只需要考虑P,Q两点在同一片网格上的情况即可,也就说P,Q要么都在帮面上,要么都在底面上,要么都在统口面上。所以本发明采用的方法是:先利用鞋楦的参数化,求出一条从P到Q的初始路径,然后通过迭代逐步优化初始路径,求出精确的最短路径。算法的计算复杂度仅为O(n),实时高效。
初始路径的求法很简单,设P,Q两点在二维参数化网格上的对应点为p,q,用直线段连接pq,与参数化网格相交得到一系列交点ci(i=1,2,…,k),那么在参数域上的初始路径即为(p,c1,c2,…,ck,q)。把交点{c1}映射回鞋楦的三维网格上得到{C1},即得到P,Q之间的一条初始路径{P,C1,C2,…,Ck,Q)。图7显示了跗腰楦面内宽的初始路径,P为背中线上的跗骨标志点,Q为内怀底边楞线上的腰窝边沿点。
得到初始路径后,通过迭代逐步优化来求出精确的最短路径。记第j(j≥1)次迭代后得到的参数域上的路径为 l j = ( c 0 j , c 1 j , · · · , c k j j ) , ]]>鞋楦三维网格上的相应路径为 L j = ( C 0 j , C 1 j , · · · , C k j j ) , ]]>那么
l 0 = ( c 0 0 , c 1 0 , · · · , c k 0 0 ) = ( p , c 1 , c 2 , · · · , c k , q ) , ]]>
L 0 = ( C 0 0 , C 1 0 , · · · , C k 0 0 ) = { P , C 1 , C 2 , · · · , C k , Q } , ]]>
再记Lj所经过的楦面三角形带为Tj,将Tj展开得到的平面三角形带为tj。那么第j(j≥1)次迭代可分四步完成。
步1:将Tj-1依次展开到平面上得到tj-1;
步2:在tj-1形成的带状区域内求出最短路径lj;
步3:计算lj的长度,如果它大于等于lj-1的长度,结束迭代,Lj-1即为最终所求的最短路径,否则进行下一步;
步4:根据lj更改三角形带tj-1得到tj,并删除lj中的相重路径点,然后把tj和lj映射回鞋楦的三维网格上得到Tj和Lj。
三角形带展平时,首先把Tj中的第一个三角形放置到平面上的任意位置,然后把Tj中的后续三角形根据与前一三角形的相邻边依次展平,展平时保持三角形的边长和内角不变。
三角形带展平后,在其形成的带状区域内求出最短路径lj是本发明的核心算法。设tj中两三角形的共享边依次为e0,e1,…,er。令lj最初只有两个路径点(p,q),把共享边作为lj的约束边,通过调用递归算法MinPath(0,r,p,q)不断插入新的路径点就可以算出lj。算法中产生的新路径点一定位于某一约束边上,使得lj一定位于带状区域tj内,从而保证Lj一定贴在楦面上,不超出边界。算法MinPath可以用c++语言伪代码表述为:
//输入参数begin和end表示约束边的起始编号和末尾编号 //输入参数cb和ce表示两路径点,算法求出新的路径点插到这两点之间 MinPath(int begin,int end,Point cb,Point ce) { //如果cb与ce之间已经没有约束边,则返回 if(begin>end)return; //初始化cmax,dmax,imax<!-- SIPO <DP n="6"> --><dp n="d6"/> if(ebegin与线段cbce不相交) { cmax=ebegin两端点中离线段cbce最近的一点; dmax=cmax到cbce的距离; } else { cmax=ebegin与线段cbce的交点; dmax=0; } imax=begin; //求出与线段cbegin cend距离最远的约束边 for(i=begin+1;i<=end;i++) { if(ei与线段cbce不相交) { ti=ei两端点中离线段cbce最近的一点; d=ti到cbce的距离; if(d>dmax) { dmax=d; cmax=ti; imax=i; } } } if(dmax=0)//如果所有的约束边都与cbce相交 { tbegin=cmax; for(i=begin;i<=end;i++) {<!-- SIPO <DP n="7"> --><dp n="d7"/> 把交点ti作为路径点插入到路径点cb与ce之间; } } else//否则,在cbcmax之间与cmaxce之间分别寻找路径点并插入 { 把cmax作为路径点插入到路径点cb与ce之间; MinPath(begin,imax-1,cb,cmax); MinPath(imax+1,end,cmax,ce); } }
l
j只是在带状区域t
j内的最短路径,为求出全局最短路径,还必须调整t
j。对于l
j的路径点c
ij,如果它位于s(s≥1)个约束边的端点上,那么它在l
j中将是s重的,在s>1时我们将删除其余的s-1个路径点,使其成为单重路径点。然后考虑线段c
i-1jc
i+1j,如果c
i-1jc
i+1j与这s个约束边不相交,那么调整t
j在c
ij处的三角形,设t
j中拥有点c
ij的三角形序列为…,t
b,t
1,…,t
s-1,t
e,…,其中t
b和t
e分别为拥有线段c
i-1jc
ij和线段c
ijc
i+1j的三角形,那么调整的方法就是删除三角形t
1至t
s-1,并在t
b和t
e之间加入参数域上拥有c
ij的其它三角形连接t
b和t
e。
仍以跗腰楦面内宽为例,图7b显示了T
0,图8左边一列显示了其第一次迭代过程,从上到下分别是把T
0展开后得到的t
0,在t
0中求出的最短路径l
1,以及更改t
0后得到的T
1,而图8右边一列显示了其最后一次迭代,从上到下分别为t
6,l
7,以及最终结果L
7。l
7是一条直线,这也说明了L
7已是最短路径。
4.楦面的自动测量
基于鞋楦的网格表示方法和楦面的测地线算法,就可以很容易地对鞋楦进行全方位的自动测量。不失一般性,假设所要测量的鞋楦是右脚楦,鞋楦的纵剖面位于平面z=0上,楦头朝x轴负方向,楦尾朝x轴正方向,前掌凸度部位点正好位于x轴上,如图9所示。
记楦底前端点为J,楦底后端点为A,统口后端点为A
0,那么鞋楦的基本高度可以这样计算:
前跷高=|J
v|,
后跷高(后跟高)=|A
y|,
统口后高=|A
0y|,
楦体后身高=‖AA
0‖,其中J
y表示J的y坐标,‖·‖表示两点间的欧氏距离。
在后弧中线上,通过脚型规律或者搜索x坐标最大的点定出后跟突点,记为A
3,那么鞋楦的基本长度为:
楦全长=|A
3x-J
x|,
楦面长=<JA
3>,
楦上斜长=<JA
0>,楦下斜长=<JA>,
楦底长=|A
0x-J
x|,
楦底样长=底面中线的长度,
后容差=|A
3x-A
x|,
放余量=楦底样长-脚长+后容差,其中<·>表示两点在楦帮面上的最短距离。由于内外怀的差别,楦面长、楦上斜长、楦下斜长在内怀和外怀的长度是不一样的,需分别计算,如图10a,b所示。
在鞋楦底部,在底面中线上,利用脚型规律和下面的计算公式依次定出拇趾外突部位点,小趾端部位点,第一跖趾部位点,第五跖趾部位点,跗骨突度部位点,腰窝部位点和踵心部位点,分别记为H,G,F,E,D,C,B。
部位长度=脚长×部位规律系数-后容差,比如脚长为250mm,后容差为5mm时,
拇趾外突部位长度=250×90%-5=220mm,然后从A点开始沿着底面中线走过220mm,即为拇趾外突部位点处。接着在各部位点处定义一平行于x=0的平面,此平面与底边楞线相交,得到与部位点相对应的边沿点,与背中线相交,得到与部位点相对应的标志点,如图10所示,分别记为H
1,G
2,F
1,E
2,D
0,C
0,C
1,C
2,其中下标为0表示与背中线的交点,下标为1表示与内怀底边楞线的交点,下标为2表示与外怀底边楞线的交点。那么楦底的基本宽度为:
拇趾里宽=<HH
1>,
小趾外宽=<GG
2>,
第一跖趾里宽=<FF
1>,
第五跖趾外宽=<EE
2>,
腰窝外宽=<CC
2>。其中<·>表示两点在楦底面上的最短距离。然后在测地路径EE
2上定出分踵点R,使得<RE
2>=<FF
1>。在B点以向量RA为法向作平面分别交内外怀底边楞线于B
1,B
2。那么