zoukankan      html  css  js  c++  java
  • 三角形相关算法--求解线段端点坐标

    问题描述:

      已知线段一个顶点p1的坐标(x1,y1),p1与p2的距离len,p1-p2与正北方向的夹角angle,计算p2的坐标(x2,y2)。

    求解思路:

      1、根据p1、p2的距离可以列出一个等式:

    (p2.x-p1.x)2+(p2.y-p1.y)2=len2

      2、根据p1-p2与正北方向的夹角可以列出一个等式:

    tan(angle)=(p2.x-p1.x)/(p2.y-p1.y)

      根据这两个等式,可推导出p2.x、p2.y的值。

      3、在推导过程中,p2.y-p1.y被用作分母,因此,在实际计算中,需要单独考虑angle=90度和270度的情况(即p1-p2水平的情况)。

    C#算法:

    /// <summary>
    /// 已知线段的一个端点坐标、线段长度、线段与正北的夹角(0-359度),夹角的顶点为已知点
    /// 求解另一个端点的坐标
    /// </summary>
    /// <param name="p1">已知端点坐标</param>
    /// <param name="len">线段长度</param>
    /// <param name="angle">与正北的夹角(单位:弧度)</param>
    /// <returns>另一个端点坐标</returns>
    public static TwoDimPoint GetVertex(TwoDimPoint p1, double len, double angle)
    {
        TwoDimPoint result = new TwoDimPoint();
    
        angle %= 2 * Math.PI;//限制角度在0到359之间
    
        if (angle == Math.PI / 2 || angle == Math.PI * 3 / 2)//角度为90或270度
        {
            result.Y = p1.Y;
            if (angle < Math.PI)
                result.X = p1.X + len;
            else
                result.X = p1.X - len;
        }
        else
        {
            double A = len / Math.Sqrt(Math.Tan(angle) * Math.Tan(angle) + 1);
            if (angle > Math.PI / 2 && angle < Math.PI * 3 / 2)
                result.Y = p1.Y - A;
            else
                result.Y = p1.Y + A;
            result.X = (result.Y - p1.Y) * Math.Tan(angle) + p1.X;
        }
    
        return result;
    }

    其他相关算法:

    三角形相关算法--求解三角形顶点坐标

  • 相关阅读:
    Java里if...else语句
    Java里for循环和增强版循环;break语句:跳出循环;continue:跳转循环
    Java里while循环和do...while循环
    static 修饰符
    Java类变量(静态变量)
    Java实例变量
    Java局部变量
    Java访问实例变量和调用成员方法
    Java里import语句使用
    声明式服务调用
  • 原文地址:https://www.cnblogs.com/hibernation/p/3438624.html
Copyright © 2011-2022 走看看