明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4317|回复: 10

在C#中如计算两点之间的距离和相对点

[复制链接]
发表于 2010-10-31 18:03:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2010-11-2 22:02:34 编辑

请教在C#中如计算两点之间的距离和相对点来完成以下图示的图形!

 

 楼主| 发表于 2010-10-31 18:24:00 | 显示全部楼层

自己先顶一下。。。

发表于 2010-10-31 19:14:00 | 显示全部楼层
 楼主| 发表于 2010-11-1 12:45:00 | 显示全部楼层
多谢孤哥的指点,我先去看看,然后研究一下...
 楼主| 发表于 2010-11-1 23:28:00 | 显示全部楼层
狐哥,我刚结束C#,还是看不懂你所说的那个向量如何用,你能否帮我写个简单的事例阿,我想这样我就可以通过在调试的过程中去理解
发表于 2010-11-2 09:18:00 | 显示全部楼层
  1.             Point3d pt1 = Point3d.Origin, pt2 = new Point3d(10, 5, 0);
  2.             //距离
  3.             double dist1 = pt2.DistanceTo(pt1);
  4.             double dist2 = (pt2 - pt1).Length;
  5.             double ang = Math.Atan(1) / 45 * 30;
  6.             double dist = 10;
  7.             //极轴
  8.             Point3d pt3 = pt1 + Vector3d.XAxis.RotateBy(ang, Vector3d.ZAxis) * dist;
复制代码

 楼主| 发表于 2010-11-2 20:01:00 | 显示全部楼层

狐哥,

   我按你提供的例子试着写了一下,可以绘出图形,但是我还是不知如何做到按任意两点来绘图,

我实际上是想达到以下效果,请看以下图片中效果,请再帮我按以下动画写个简单的例子,先谢了。

 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2010-11-2 20:10:00 | 显示全部楼层

先把你的代码贴上吧?

看看能不能帮你简单改下

 楼主| 发表于 2010-11-2 20:17:00 | 显示全部楼层
[CommandMethod("Cc")] //CAD命令行名称
        public void YTest()
        {
            using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
            {
                Autodesk.AutoCAD.EditorInput.Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
                PromptPointOptions proOne = new PromptPointOptions("\n请选取第一个点:");
                //定义第一个点
                Point3d ptOne = new Point3d();
                //定义第二个点
                Point3d ptTwo = new Point3d();
                PromptPointResult resOne = ed.GetPoint(proOne);
                if (resOne.Status == PromptStatus.OK)
                {
                    ptOne = resOne.Value;
                    PromptPointOptions proTwo = new PromptPointOptions("\n请选取第二个点:");
                    proTwo.BasePoint = ptOne;
                    proTwo.UseBasePoint = true;
                    PromptPointResult resTwo = ed.GetPoint(proTwo);
                    if (resTwo.Status == PromptStatus.OK)
                    {
                        ptTwo = resTwo.Value;
                        Database db = HostApplicationServices.WorkingDatabase;
                        using (Transaction trans = db.TransactionManager.StartTransaction())
                        {
                            BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead, false);
                            BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);
                            Line lineObject = new Line(ptOne, ptTwo);
                            double douLineAngle = lineObject.Angle;
                            #region
                            //----------------------------------------------------------------------------------------------
                            //double douDis = 0.5;
                            Point3d ptLineBen1 = new Point3d(ptOne.X + douDis / 2 * Math.Cos(douLineAngle + Math.PI / 2),
                                                                ptOne.Y + douDis / 2 * Math.Sin(douLineAngle + Math.PI / 2),
                                                                ptOne.Z);
                            Point3d ptLineEnd1 = new Point3d(ptTwo.X + douDis / 2 * Math.Cos(douLineAngle + Math.PI / 2),
                                                                ptTwo.Y + douDis / 2 * Math.Sin(douLineAngle + Math.PI / 2),
                                                                ptTwo.Z);
                            Point3d ptLineBen2 = new Point3d(ptOne.X + douDis / 2 * Math.Cos(douLineAngle - Math.PI / 2),
                                                                ptOne.Y + douDis / 2 * Math.Sin(douLineAngle - Math.PI / 2),
                                                                ptOne.Z);
                            Point3d ptLineEnd2 = new Point3d(ptTwo.X + douDis / 2 * Math.Cos(douLineAngle - Math.PI / 2),
                                                                ptTwo.Y + douDis / 2 * Math.Sin(douLineAngle - Math.PI / 2),
                                                                ptTwo.Z);
                            //---这是你提供的代码
                            Point3d pt1 = Point3d.Origin, pt2 = new Point3d.ptOne;
                            //距离
                            double dist1 = pt2.DistanceTo(pt1);
                            double dist2 = (pt2 - pt1).Length;
                            //double ang = Math.Atan(1) / 45 * 30;
                            double dist = 10;
                            //极轴
                            Point3d pt3 = pt1 + Vector3d.XAxis.RotateBy(douLineAngle, Vector3d.XAxis) * dist;
                           //---这是你提供的代码

                            //----------------------------------------------------------------------------------------------
                            #endregion
                            Line lineObject1 = new Line(ptLineBen1, ptLineEnd1);
                            Line lineObject2 = new Line(ptLineBen2, ptLineEnd2);

                            Line lineObject3 = new Line(ptLineBen2, pt3);
                           
                            btr.AppendEntity(lineObject1);
                            btr.AppendEntity(lineObject2);

                            btr.AppendEntity(lineObject3);

                            trans.AddNewlyCreatedDBObject(lineObject1, true);

                            trans.AddNewlyCreatedDBObject(lineObject2, true);

                            trans.AddNewlyCreatedDBObject(lineObject3, true);

                            lineObject.Dispose();
                            trans.Commit();
                        }
                    }
                }
            }
        }
发表于 2010-11-2 20:48:00 | 显示全部楼层
重写了一次,还没完,后面的自己试着写下
  1.         [CommandMethod("CTest")]
  2.         public void test()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Editor ed = doc.Editor;
  6.             Database db = doc.Database;
  7.             using (doc.LockDocument())
  8.             {
  9.                 PromptPointOptions optPt1 = new PromptPointOptions("\n请选取第一个点:");
  10.                 PromptPointResult resPt1 = ed.GetPoint(optPt1);
  11.                 if (resPt1.Status != PromptStatus.OK)
  12.                     return;
  13.                 Point3d pt1 = resPt1.Value;
  14.                 PromptPointOptions optPt2 = new PromptPointOptions("\n请选取第二个点:");
  15.                 optPt2.BasePoint = pt1;
  16.                 optPt2.UseBasePoint = true;
  17.                 PromptPointResult resPt2 = ed.GetPoint(optPt2);
  18.                 if (resPt2.Status != PromptStatus.OK)
  19.                     return;
  20.                 Point3d pt2 = resPt2.Value;
  21.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  22.                 {
  23.                     BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false);
  24.                     BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);
  25.                     //pt1->pt2方向的单位矢量
  26.                     Vector3d vec1 = (pt2 - pt1).GetNormal();
  27.                     //垂直方向的向量,长度为5
  28.                     Vector3d vec2 = 5 * vec1.RotateBy(Math.PI / 2, Vector3d.ZAxis);
  29.                     List<Line> lines = new List<Line>();
  30.                     lines.Add(new Line(pt1 - 2 * vec1, pt2 + 2 * vec1));
  31.                     lines.Add(new Line(pt1 + vec2, pt2 + vec2));
  32.                     lines.Add(new Line(pt1 - vec2, pt2 - vec2));
  33.                     foreach (Line line in lines)
  34.                     {
  35.                         btr.AppendEntity(line);
  36.                         tr.AddNewlyCreatedDBObject(line, true);
  37.                     }
  38.                     tr.Commit();
  39.                 }
  40.             }
  41.         }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 00:35 , Processed in 0.181813 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表