注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

Vector2d的GetAngleTo函数  

2013-04-25 16:14:34|  分类: ObjectARX |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近写一个插件,但是返回结果并不是很理想,时不时有不想要的结果产生,仔细检查发现是使用到了这个函数带来的问题,对于其返回值,并不是我一开始预料的那样,下面是测试和结果的分析。
选取几个很有代表性的数据:
[CommandMethod("GATT",CommandFlags.UsePickSet)]    
public static void GetAngleToTest()
{
    Vector2d v_X = new Vector2d(1, 0);
    Vector2d v1 = new Vector2d(1, 1);
    Vector2d v2 = new Vector2d(-1, 1);
    Vector2d v3 = new Vector2d(-1, -1);
    Vector2d v4 = new Vector2d(1, -1);
    Document doc = Application.DocumentManager.MdiActiveDocument;
    doc.Editor.WriteMessage(v1.GetAngleTo(v_X).ToString() + "\n");
    doc.Editor.WriteMessage(v2.GetAngleTo(v_X).ToString() + "\n");
    doc.Editor.WriteMessage(v3.GetAngleTo(v_X).ToString() + "\n");
    doc.Editor.WriteMessage(v4.GetAngleTo(v_X).ToString() + "\n");
    doc.Editor.WriteMessage(v_X.GetAngleTo(v1).ToString() + "\n");
    doc.Editor.WriteMessage(v_X.GetAngleTo(v2).ToString() + "\n");
    doc.Editor.WriteMessage(v_X.GetAngleTo(v3).ToString() + "\n");
    doc.Editor.WriteMessage(v_X.GetAngleTo(v4).ToString() + "\n");
}
这八次显示的结果如下:
0.785398163397448
2.35619449019234
2.35619449019234
0.785398163397448
0.785398163397448
2.35619449019234
2.35619449019234
0.785398163397448
即:
Pi/4
3Pi/4
3Pi/4
Pi/4
Pi/4
3Pi/4
3Pi/4
Pi/4
下面是分析结果。
1)该函数的返回值,介于0到Pi之间。
2)v1.GetAngleTo(v2)和v2.GetAngleTo(v1)的返回值相同。
另外一个猜想是,该函数的实现,应该是使用到了如下数学公式:
cos<v1,v2>=v1·v2/|v1||v2|,然后再求其反余弦值。当然,具体的实施,还得看别人的源代码是怎么写的。
现在,修改一下,得到我自己的函数:
        private static double Vector2dAngleToXAxis(Vector2d v)
        {
            double x=v.X;
            double y=v.Y;
            if (y == 0)
            {
                if (x >= 0) return 0;
                return Math.PI;
            }
            double d = v.GetAngleTo(new Vector2d(1, 0));
            if (y > 0)
                return d;
            else
                return 2 * Math.PI - d;
        }
将会根据向量的分量所处的象限,返回从0到2Pi之间的值,这样一修改,问题就解决了
  评论这张
 
阅读(1218)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016