autocad中大多数对象都是不支持non-uniform scale的,
但我这两天却遇到了类似的需求,
需要将线、多段线等对象进行不等比例缩放,
比如x方向放大2倍,y方向放大0.4倍,
于是就想着自己写代码实现,
但转换矩阵怎么计算却被难住了,
(自己看的书还是远远不够啊!)
从书架上翻出的第一本书中有类似的公式,
但怎么用代码实现没有,
于是又找到一本《计算机图形学》(影印版,C语言版,第二版,清华大学出版社),
11-5节(P424)里面有现成的代码,
于是就照着书中的代码进行测试,
在敲代码的时候,
居然忘了接小孩放学......
为了备忘,
将代码分享在此。
测试代码,
非常简单,
权当抛砖引玉。
Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; double sx = 2, sy = 3,sz = 1; var ppr = ed.GetPoint("\n拾取点"); if (ppr.Status != PromptStatus.OK) return; Point3d refPt = ppr.Value; //Matrix3d m = Matrix3d.Scaling(2, new Point3d(5,3,1)); //ed.WriteMessage("\nThe scaleAroundPoint matrix is: \n{0}\n", m); double[] ds = new double[] { sx, 0, 0, (1-sx)*refPt.X, 0, sy, 0, (1 - sy) * refPt.Y, 0, 0,sz, (1 - sz) * refPt.Z, 0, 0, 0, 1 }; Matrix3d m = new Matrix3d(ds); PromptEntityResult per = ed.GetEntity("\n拾取需要缩放的直线"); if (per.Status != PromptStatus.OK) return; using (Transaction tr = doc.TransactionManager.StartTransaction()) { var line = per.ObjectId.GetObject(OpenMode.ForWrite) as Line; line.StartPoint = line.StartPoint.TransformBy(m); line.EndPoint = line.EndPoint.TransformBy(m); tr.Commit(); }
直接变换直线是不行的,
autocad是不支持的,
于是采用变换直线端点的方式,
这种方式恰好能满足我的需求。