• AutoCAD中实现不等比例缩放


    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是不支持的,

    于是采用变换直线端点的方式,

    这种方式恰好能满足我的需求。

  • 相关阅读:
    减少mysql存储列的方法
    Installation of Munin node/master ¶
    they're hiring
    减少mysql存储列的方法
    linux munin 服务器监控 安装配置«海底苍鹰(tank)博客
    用C写apache模块编译教程(经验证)
    SDUT——Kbased Numbers
    【人在运维囧途_06】 借助 sniffer 诊断 Linux 网络故障
    iOS 企业证书发布app 流程
    警告: 隐式声明与内建函数‘exit’不兼容
  • 原文地址:https://www.cnblogs.com/myzw/p/15903057.html
Copyright © 2020-2023  润新知