这是一个有点冗长的解决方案,至少给出了一些可接受的结果。
它基于来自here 的代码。
该代码将创建一个包含三次贝塞尔曲线参数的表格。
如果有更简单的解决方案,请告诉我。
代码:
### plot smoothed curve through given points
reset session
set size ratio -1
$Data <<EOD
0 0
2 3
4 2
9 3
5 7
3 6
4 5
5 5
4 4
1 6
1 4
3 10
EOD
set angle degrees
Angle(dx,dy) = (_l=sqrt(dx**2 + dy**2), _l==0 ? NaN : dy/_l >= 0 ? acos(dx/_l) : -acos(dx/_l) )
# get points and angles of segments
set table $PointsAndAngles
array Dummy[1]
plot x1=x2=y1=y2=NaN $Data u (x0=x1,x1=x2):(y0=y1,y1=y2):(x2=$1):(y2=$2): \
(dx1=x1-x0, dy1=y1-y0, dx2=x2-x1, dy2=y2-y1, \
dx2==dx2 && dy2==dy2 && dx1==dx1 && dy1==dy1 ? \
(d1=sqrt(dx1**2+dy1**2), d2=sqrt(dx2**2+dy2**2), \
a2=Angle(dx2,dy2), a3=Angle(dx1/d1+dx2/d2,dy1/d1+dy2/d2)) : \
(d2=sqrt(dx2**2+dy2**2), a2=Angle(dx2,dy2))) : (d2) w table
plot Dummy u (x2):(y2):(NaN):(NaN):(a2):(NaN) w table
unset table
# create table with smooth parameters
# Cubic Bézier curves function with t[0:1] as parameter
# p0: start point, p1: 1st ctrl point, p2: 2nd ctrl point, p3: endpoint
# a0, a3: angles
# r0, r3: radii
#n p0x p0y a0 r0 p3x p3y a3 r3 color
set print $SmoothLines
do for [i=1:|$PointsAndAngles|-1] {
p0x = word($PointsAndAngles[i],1)
p0y = word($PointsAndAngles[i],2)
a0 = word($PointsAndAngles[i],5)
r0 = 0.3
p3x = word($PointsAndAngles[i],3)
p3y = word($PointsAndAngles[i],4)
a3 = word($PointsAndAngles[i+1],5)
r3 = 0.3
color = 0x0000ff
print sprintf("%d %s %s %s %g %s %s %s %g %d %d", \
i, p0x, p0y, a0, r0, p3x, p3y, a3, r3, color)
}
set print
p0v(n,v) = word($SmoothLines[n],2+v) # v=0 --> x, v=1 --> y
a0(n) = word($SmoothLines[n],4)
r0(n) = word($SmoothLines[n],5)
p3v(n,v) = word($SmoothLines[n],6+v) # v=0 --> x, v=1 --> y
a3(n) = word($SmoothLines[n],8)
r3(n) = word($SmoothLines[n],9)
color(n) = int(word($SmoothLines[n],10))
Length(x0,y0,x1,y1) = sqrt((x1-x0)**2 + (y1-y0)**2)
d03(n) = Length(p0v(n,0),p0v(n,1),p3v(n,0),p3v(n,1))
p1v(n,v) = p0v(n,v) + (v==0 ? r0(n)*d03(n)*cos(a0(n)) : r0(n)*d03(n)*sin(a0(n)) )
p2v(n,v) = p3v(n,v) - (v==0 ? r3(n)*d03(n)*cos(a3(n)) : r3(n)*d03(n)*sin(a3(n)) )
# parametric cubic Bézier:
pv(n,v,t) = t**3 * ( -p0v(n,v) + 3*p1v(n,v) - 3*p2v(n,v) + p3v(n,v)) + \
t**2 * ( 3*p0v(n,v) - 6*p1v(n,v) + 3*p2v(n,v) ) + \
t * (-3*p0v(n,v) + 3*p1v(n,v) ) + p0v(n,v)
set key noautotitles
set ytics 1
plot $Data u 1:2 w lp pt 7 lc "red" dt 3 ti "data", \
for [i=2:|$SmoothLines|] [0:1] '+' u (pv(i,0,$1)):(pv(i,1,$1)) w l lc rgb color(i), \
keyentry w l lc "blue" ti "Cubic Bézier through points"
### end of code
结果: