控件样条线类型,二维的样条曲线,非均匀有理的B样条曲线
[ object, uuid(6494AA43-E0E6-4C5A-A7B2-9AB6014E5996), dual, nonextensible, helpstring("IMxDrawSpline interface"), pointer_default(unique) ]
interface IMxDrawSpline : IMxDrawCurve;MxDrawSpline.idl
例如: JS 绘制一个带宽度的样条线。
function DrawSpline() {
var param = mxOcx.NewResbuf();
mxOcx.SendStringToExecuteFun("_DrawSpline",param);
var retparam = mxOcx.GetEntitysLastCmd();
if (retparam == null)
return;
if (retparam.Count == 0)
return;
var spline = retparam.AtObject(0);
if(spline == null)
{
return;
}
var aryPoints = spline.GetSamplePoints(0.1);
if (aryPoints == null) {
return;
}
if (aryPoints.Count < 2)
return;
var pt = aryPoints.Item(0);
mxOcx.PathMoveTo(pt.x, pt.y);
for(var i = 1; i < aryPoints.Count;i++)
{
pt = aryPoints.Item(i);
mxOcx.PathLineTo(pt.x,pt.y)
}
mxOcx.LineWidth = 10;
mxOcx.DrawPathToPolyline();
}
例如: 离形样条线
pEnt.QueryInterface(IMxDrawSpline, spl);
if spl <> nil then
begin
// 对象是个样条线。
// 得到样条线的外包
points := spl.GetBoundingBox2();
// dApproxEps样条线的离形精度
dApproxEps := 0.01;
// 根据样条线的大小,动态确定离线精度。
if points.Count > 1 then
begin
// 外包的最小点,和最大点
minPt := points.Item(0);
maxPt := points.Item(1);
// dApproxEps取外包最短边长的 1/20
if abs(minPt.x - maxPt.x) < abs(minPt.y - maxPt.y)then
begin
dApproxEps := abs(minPt.x - maxPt.x) / 20;
end
else
begin
dApproxEps := abs(minPt.y - maxPt.y) / 20;
end;
// 如果为 dApproxEps零,就默认取 0.01
if dApproxEps < 0.0000001 then
dApproxEps := 0.01;
end;
// showmessage(Format('dApproxEps:%g',[dApproxEps]) );
// 离散样条线.
points := spl.GetSamplePoints(dApproxEps);
// 遍历样条线上的所有点,可以把这些点,做为样条线的拟合点,用来重生样条线。
for jj := 1 to points.Count -1 do
begin
pt := points.Item(jj);
showmessage(Format('X:%g,Y:%g',[pt.x,pt.y]) );
end;
end;
例如:得到startTangent
MxDrawResbuf retT = spline.GetProp("startTangent");
vx = retT.AtDouble(0);
vy = retT.AtDouble(1);
vz = retT.AtDouble(1);
例如:得到endTangent
MxDrawResbuf retT = spline.GetProp("endTangent");
vx = retT.AtDouble(0);
vy = retT.AtDouble(1);
vz = retT.AtDouble(1);