明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: chengw

求方位角

  [复制链接]
发表于 2011-11-2 19:59:12 | 显示全部楼层
VBALISPER 发表于 2011-11-2 12:51
请问cabinsummer你写这句(cvunit (vla-get-angle (vlax-ename->vla-object (car (entsel)))) ...

没有任何区别,就是最后一步把弧度转换为角度的方法不同。我用的是cvunit函数,可读型好些,他用的是计算。
发表于 2011-11-2 20:01:04 | 显示全部楼层
VBALISPER 发表于 2011-11-2 12:16
一点建议,这个量出来的角度不是传统意义上的方位角,是CAD的角度.传统的方位角,0度是在正北方.应该还要加上一 ...

AutoCAD是可以定义0度角方向的
发表于 2011-11-2 20:13:49 | 显示全部楼层
本帖最后由 mrhvslisp 于 2011-11-2 20:33 编辑

  1. #region//求取坐标方位角
  2.         [CommandMethod("NorthAngle")]
  3.         public void NorthAngle()
  4.         {
  5.             Document doc = Application.DocumentManager.MdiActiveDocument;
  6.             Database db = doc.Database;
  7.             Editor ed = doc.Editor;
  8.             PromptEntityOptions options = new PromptEntityOptions("");
  9.             options.Message = "\n请选取直线";
  10.             options.SetRejectMessage("\n该实体不是直线,请重新选择");
  11.             options.AddAllowedClass(typeof(Line), true);
  12.             options.AllowNone = false;
  13.             PromptEntityResult result=ed.GetEntity(options);
  14.             if (result.Status == PromptStatus.OK)
  15.             {
  16.                 using (Transaction trans = db.TransactionManager.StartTransaction())
  17.                 {
  18.                     Line line = (Line)trans.GetObject(result.ObjectId, OpenMode.ForRead);
  19.                     Point3d pt1 = line.StartPoint;
  20.                     Point3d pt2 = line.EndPoint;
  21.                     double angle;
  22.                     double x = pt2.X - pt1.X;
  23.                     double y = pt2.Y - pt1.Y;
  24.                     if (y == 0)
  25.                     {
  26.                         if (x > 0)
  27.                         {
  28.                             angle = 90;
  29.                             ed.WriteMessage("\n坐标方位角为{0}°", angle);
  30.                         }
  31.                         else
  32.                         {
  33.                             angle = 270;
  34.                             ed.WriteMessage("\n坐标方位角为{0}°", angle);
  35.                         }
  36.                     }
  37.                     else
  38.                     {
  39.                         angle = Math.Atan(Math.Abs(x) / Math.Abs(y)) * 360 / (2 * Math.PI);
  40.                     }

  41.                     if (x >=0)
  42.                     {
  43.                         if (y > 0)
  44.                         {
  45.                             ed.WriteMessage("\n坐标方位角为{0}°", angle);
  46.                         }
  47.                         else if (y < 0)
  48.                         {
  49.                             angle = 180 - angle;
  50.                             ed.WriteMessage("\n坐标方位角为{0}°", angle);
  51.                         }
  52.                     }
  53.                     else if (x < 0)
  54.                     {
  55.                         if (y < 0)
  56.                         {
  57.                             angle = 180 + angle;
  58.                             ed.WriteMessage("\n坐标方位角为{0}°", angle);
  59.                         }
  60.                         else if (y > 0)
  61.                         {
  62.                             angle = 360 - angle;
  63.                             ed.WriteMessage("\n坐标方位角为{0}°", angle);
  64.                         }
  65.                     }

  66.                 }
  67.                   
  68.             }
  69.         }

  70.         #endregion


发表于 2011-11-2 20:19:26 | 显示全部楼层
cabinsummer 发表于 2011-11-2 20:01
AutoCAD是可以定义0度角方向的

请问CAD如何定义零方向呢?正想学习这个
发表于 2011-11-2 20:48:39 | 显示全部楼层

.

本帖最后由 VBALISPER 于 2011-11-2 21:02 编辑

哦,这个定义倒是可以.但是我们习惯性不改动这个设置,如果将0度设到上方后,当画坡度时,又要换算了,向右的20度坡度就相当于北方为0度的70度.这个设置只能顾得了一边.所以我一般都不动,总结了一下方位的角度.就是如果<90度,=90-X,如果>90,=450-X.

另外,你用cvunit转换为度的我搞懂了,谢谢
有时间帮我看看9楼写的,我用IF写的判断,怎么不能实现呢.是不是计算过程中有格式不对呀.谢谢了哈
发表于 2011-11-2 21:11:32 | 显示全部楼层
VBALISPER 发表于 2011-11-2 12:46
说干就干,写的这个出错了.没看出原因来.
(if (< (* (/ (vla-get-angle (vlax-ename->vla-object (ca ...

(* (/ (vla-get-angle (vlax-ename->vla-object (car (entsel)))) pi) 180.0)并不保存返回值到变量,所以你需要不停的选直线。改成下面的就可以了
(setq a (* (/ (vla-get-angle (vlax-ename->vla-object (car (entsel)))) pi) 180.0))
(if (<= a 90.0)(- 90.0 a)(- 450.0 a))
发表于 2011-11-2 22:19:47 | 显示全部楼层
哦,我就是觉得一句话代码比较有意思,想一句话完成.看来是保存不了返回值,所以失败了哈.
发表于 2011-11-3 00:33:59 | 显示全部楼层
VBALISPER 发表于 2011-11-2 22:19
哦,我就是觉得一句话代码比较有意思,想一句话完成.看来是保存不了返回值,所以失败了哈.

一句话也能保存
(if (<= (setq a (* (/ vla-get-angle (vlax-ename->vla-object (car (entsel)))) pi) 180.0)) 90.0)(- 90.0 a)(-450.0 a))
发表于 2011-11-3 08:56:15 | 显示全部楼层
个人观点,要想彻底解决,我的思路是:
获取line两个端点p1、p2
判断
p1 p2 水平向右则角度为90
反之角度为270
竖直向上则角度为0
反之角度为180
不符合上述条件可以大胆地求得(y2-y1)/(x2-x1)
然后判断象限利用反正切函数取得角度值
发表于 2011-11-3 09:48:15 | 显示全部楼层
mrhvslisp 发表于 2011-11-2 20:19
请问CAD如何定义零方向呢?正想学习这个

CAD的单位设置里,手动设置
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-24 01:30 , Processed in 0.171158 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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