with (_mc) {
clear();
lineStyle(0, 0x000000, 100);
moveTo(yuandian._x, yuandian._y);
kongzhidian1_x=(yuandian._x+zhongxindian._x)/2-tx;
kongzhidian1_y=(yuandian._y+zhongxindian._y)/2+pianyi/2-ty;
//以上语句就是
定位控制点1的坐标,先简单的用前面例1中的算法.
curveTo(kongzhidian1_x,kongzhidian1_y,zhongxindian._x, zhongxindian._y);
kongzhidian2_x=(zhongxindian._x+shubiaodian._x)/2-tx;
kongzhidian2_y=(zhongxindian._y+shubiaodian._y)/2+pianyi/2-ty;
curveTo(kongzhidian2_x,kongzhidian2_y,shubiaodian._x, shubiaodian._y);
//以上语句就是
定位控制点2的坐标,先简单的用前面例1中的算法.
}
这样算出来的结果有瑕疵,很明显中心点不是一个圆角,而显现出了棱角的特点,这和软力绳的样子不符合.这时需要回到例1中去分析.这里不去分析贝塞尔曲线的公式,这里简单的把结论说一下.很显然当一条曲线画完后,接着的第二曲线的切线应该和前一个曲线相切,也就是说,第二条曲线的控制点应该与前一条曲线的控制点以及中心点在一条直线上,或者说他们斜率相同.(看图上呈一条直线的3个点)
OK,到例4中,相关的代码换了一下.
http://space.flash8.net/bbs/attachment.
php?aid=321430
http://space.flash8.net/bbs/attachment.
php?aid=321431
with (_mc) {
clear();
lineStyle(0, 0x000000, 100);
moveTo(yuandian._x, yuandian._y);
kongzhidian1_x=(yuandian._x+zhongxindian._x)/2-tx*2;
kongzhidian1_y=(yuandian._y+zhongxindian._y)/2+pianyi/2-ty;
//kongzhidian1._x=kongzhidian1_x;
//kongzhidian1._y=kongzhidian1_y;
//lineTo(kongzhidian1_x,kongzhidian1_y);
//moveTo(yuandian._x, yuandian._y);
curveTo(kongzhidian1_x,kongzhidian1_y,zhongxindian._x, zhongxindian._y);
len2_x=zhongxindian._x-shubiaodian._x;
len2_y=zhongxindian._y-shubiaodian._y;
len2=Math.sqrt(len2_x*len2_x+len2_y*len2_y);
lent_x=kongzhidian1_x-zhongxindian._x;
lent_y=kongzhidian1_y-zhongxindian._y;
lent=Math.sqrt(lent_x*lent_x+lent_y*lent_y);
kongzhidian2_x=zhongxindian._x-len2*lent_x/lent*p1;
kongzhidian2_y=zhongxindian._y-len2*lent_y/lent*p1;;
//kongzhidian2._x=kongzhidian2_x;
//kongzhidian2._y=kongzhidian2_y;
//lineTo(kongzhidian2_x,kongzhidian2_y);
//moveTo(zhongxindian._x, zhongxindian._y);
curveTo(kongzhidian2_x,kongzhidian2_y,shubiaodian._x, shubiaodian._y);
}
没时间解释代码了,简单的来说就是延着延长线放置第二个控制点.这样一个简单的软力绳就出来了.大概修整一下相关参数,最后的结果例5.