代码之家  ›  专栏  ›  技术社区  ›  Scott Chamberlain

一条线是由两个大于45度的点形成的

  •  2
  • Scott Chamberlain  · 技术社区  · 15 年前

    我试图找出一条由两点定义的线与水平线相比是否大于或等于90度。这是我用的密码

    bool moreThan90 = false;
    double angle = Math.Atan((double)(EndingLocation.Y - Location.Y) / (double)(EndingLocation.X - Location.X));
    if (angle >= Math.PI / 2.0 || angle <= -Math.PI / 2.0)
        moreThan90 = true;
    

    我是否正确执行了此操作,或者.NET中是否有更好的内置函数可以找到它?

    编辑——事实上,我把我的问题搞砸了,我想说45是水平的,而不是90。然而,这些答案使我达到了一个我能理解的程度(实际上我只是需要被指向atan2)。

    3 回复  |  直到 7 年前
        1
  •  7
  •   pheelicks    15 年前

    与水平面成90度以上的线的终点位置.x的x值将小于location.x。

    所以你不需要所有的胡说八道,这就足够了:

    if (EndingLocation.X < Location.X)
        moreThan90 = true;
    

    编辑:

    似乎OP意味着45度而不是90度,这意味着上述简化不再适用。为此,最好使用atan2(正如slaks指出的那样),但本着不使用tan的精神:

    if (Math.Abs(EndingLocation.X - Location.X) > Math.Abs(EndingLocation.Y - Location.Y) && 
        EndingLocation.X < Location.X)
        moreThan45 = true;
    

    请注意,如果只需要指向右侧的行,则只需要进行第二次检查。

        2
  •  3
  •   SLaks    15 年前

    你应该打电话 Math.Atan2 ,像这样:

    double angle = Math.Atan2(EndingLocation.Y - Location.Y, 
                              EndingLocation.X - Location.X);
    
    if (Math.Abs(angle) >= Math.PI / 2.0)
        moreThan90 = true;
    
        3
  •  3
  •   msarchet    15 年前

    我不认为有一个库方法可以找到两个向量之间的角度,你做得正确(数学是正确的),快速浏览一下msdn和google并没有提供任何东西。我会用Slaks版本的 Math.Atan 方法。

    一件有趣的事情需要注意,因为你使用“水平”作为你的平面来确定角度是否大于90度。如果从正x轴测量,那么endinglocation.x<location.x的角度将始终大于90度。

    编辑: 原始问题改为45度检查。

    下面的部分讨论了如何在不进行浮点除法的情况下根据操作人员的评论进行除法。

    如果你有一个45度的角度,我们知道一些事情,而不必打电话给你。 ATan 关于要点。

    首先,45度角的斜率是1。所以如果

    Math.Abs((EndLocation.y - location.y)/(EndLocation.X - Location.X)) > 1

    您的角度是45度,但是45度角的排列在一个圆中出现4次。我们需要检查一些东西。

    如果 EndLocation.X < Location.X 然后角度大于45度。这表示Y轴(90-270)左侧的所有角度。为了确定角度是否大于45度,我们只需要知道斜率的绝对值是否大于1。以下情况永远是这样的。

    Math.Abs(EndLocation.Y - Location.Y) > Math.Abs(EndLocation.X - Location.X) .

    所以如果一个if语句跟在

    If (EndLocation.X < Location.X) OrElse (Math.Abs(EndLocation.Y - Location.Y) > Math.Abs(EndLocation.X - Location.X) Then AngleGreaterThan45 = True.

    我们可以确定角度是否大于45度,而无需进行任何浮点计算。

    推荐文章