如何实现可局部调整的光滑闭合曲线 ( 积分: 50 )

  • 主题发起人 主题发起人 loveness
  • 开始时间 开始时间
L

loveness

Unregistered / Unconfirmed
GUEST, unregistred user!
如图所示:http://www.sharesky.com/pic.jpg
这是一张预先设置好的脸的轮廓,是用若干点连城的光滑曲线,用户可根据这些点做局部调整,每拖动一个红色方块,就会和上下相邻的两点组成的两个弧线一起做微调,找了很长时间都不得其法,以下几点注意
1.这是一个图层,图中着色部分是半透明的,因为下面图层还有真实的人像
2.这是界面的一部分,希望不要对整个界面重画,只对这个脸轮廓部分重画,否则会引起界面抖动
3.光化曲线
 
效果是否类似 Photoshop 的钢笔?
用样条不能满足要求吗?
 
对,类似Photoshop 的钢笔,是不是b样条?
我需要光滑曲线经过这几点,b样条曲线光滑后的曲线需要经过原始离散点。
B样条函数(PolyBezierTo,PolyBezier)不符合这个条件。
常用的方法叫5点光滑法,这个算法不是很明白,有没有类似控件?
 
Delphi自代是贝塞尔曲线。不经过原始点的。看来不能满足你要求了。
这个问题我研究过。但是我的需求没你这么复杂。只要能经过一些点后组成平滑曲线就可以了。我有个算法,给你发过来。
希望你做可编辑节点的后,能发个 Demo 给我。coscka@tom.com
 
type TPointArray = array of TPoint;

//二次B样条画曲线
procedure byangtiao(toCanvas:TCanvas;p:TPointArray;n{个数},k{复杂程度}:integer);
var i,j:integer;
t,t1,t2,a,b,c,tx,ty:double;
begin
toCanvas.MoveTo(p[0].X,p[0].Y);
t:=1.0/k;
for i:=0 to n-3 do
begin
for j:=1 to k+1 do
begin
t1:=j*t;
t2:=t1*t1;
a:=(t2-2*t1+1)/2;
b:=t1-t2+1/2;
c:=t2/2;
tx:=a*p.X+b*p[i+1].X+c*p[i+2].X;
ty:=a*p.Y+b*p[i+1].Y+c*p[i+2].Y;
toCanvas.LineTo(round(tx),round(ty));
end;//end for j;
end;//end for i
toCanvas.LineTo(p[n-1].x,p[n-1].y);
end;
 
我的BLOG
HTTP://NIUWENCHAI.BLOGCHINA.COM.CN

上面有几种样条的源码,包括过控制点的,闭合的,你可以看一下。好像五点法不能做任意方向的曲线,必须沿一个方向递增。
 
to楼上的兄弟。打开你的blog。显示错误页面
错误信息
--------------------------------------------------------------------------------

产生错误的可能原因:

错误:无此blog用户!
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部