两相交的直线段夹角平分的直线上过交点距离为d的另一点求解公式
问题描述:
已知p0,p1,pN三个点,p0到p1走向直线段,pN到p0走向直线段,相交于p0点,
则pN到p0到p1夹角为a,平分夹角为a/2,求经过p0点方向角为平分线上距离p0点距离为d的点p(x,y)坐标值。

平分线点斜式方程为:
y-y0=k(x-x0)

两点距离公式为:
(y-y0)^2 +
(x-x0)^2
=d^2

斜率k=tg(a)

联合解方程组:
y-y0=k(x-x0)
(y-y0)^2 +
(x-x0)^2
=d^2

Mathematica 9 解公式表达式:

In[4]:= Solve[{d^2==(x-x0)^2+(y-y0)^2,(y-y0)==k*(x-x0)},{x,y}]

解结果:

文本公式:

In[4]:= Solve[{d^2==(x-x0)^2+(y-y0)^2,(y-y0)==k*(x-x0)},{x,y}]2    2  2          2-Sqrt[d  + d  k ] + x0 + k  x0
Out[4]= {{x -> ------------------------------, 21 + k2       2                       3k Sqrt[d  (1 + k )]            k x0    k  x0
>     y -> -(-------------------) - k x0 + ------ + ------ + y0}, 2                       2        21 + k                   1 + k    1 + k2    2  2          2                  2       2                      3Sqrt[d  + d  k ] + x0 + k  x0       k Sqrt[d  (1 + k )]           k x0    k  x0
>    {x -> -----------------------------, y -> ------------------- - k x0 + ------ + ------ + y0}}2                              2                      2        21 + k                          1 + k                  1 + k    1 + kIn[5]:=

//创建界址点注记  宗地 如:J1,J2private void createZJ_JZD_JX(ZHFeaturePolyLine from_zhFeat, IFeatureClass toFc){IGeometry geo = from_zhFeat.pFeature.ShapeCopy;if (geo != null && geo is IPolygon){IPolygon pn = geo as IPolygon;IPoint[] pointArray = zjTool.getPoints(pn).ToArray();if (pointArray != null && pointArray.Length <= 2){   //跳过 不能构面的线return;}string jNR = "";IPoint p0 = null;IPoint p1 = null;IPoint pN = null;//长度注记for (int i = 0; i < pointArray.Length; i++){//int lastIndex = i + 1;if (lastIndex >= pointArray.Length-1){break;}if(i==0){p0 = pointArray[i];p1 = pointArray[i + 1];pN= pointArray[pointArray.Length-2];}else if(i== pointArray.Length-2){p0 = pointArray[i];p1 = pointArray[0];pN = pointArray[i - 3];}else{p0 = pointArray[i];p1 = pointArray[i + 1];pN = pointArray[i-1];}                    double A_P0_1 = zjTool.getAngleOfLine(p0, p1);double A_PN_0= zjTool.getAngleOfLine(pN, p0);double A_delta = zjTool.getAngleLine2Line(p0, pN, p1);// Math.Atan(Math.Abs(Math.Tan(A_PN_0) - Math.Tan(A_P0_1))/1+ Math.Tan(A_PN_0)* Math.Tan(A_P0_1));double A_delta_2 = A_delta / 2.0;//平分线方向角a               double A_lineMid = A_PN_0 + A_delta_2;  //凸多边形if(Math.Abs(A_PN_0- A_P0_1)<0.0001){//三点共线 //凸多边形}else{double Area_delta = zjTool.getAreaLine2Line(p0, pN, p1);if (Area_delta < 0){   //凹多边形A_lineMid = A_PN_0 - A_delta_2;}}//修正角度                 if (A_lineMid>=360){   A_lineMid = A_lineMid - 360;   }if (A_lineMid<0){A_lineMid = A_lineMid + 360;}//jNR = "J" + (i + 1).ToString();//double newAngleZJ = zjTool.newAngleZJ(AofLine);//获取注记文字长度ITextSymbol txtSymbol = zjTool.getTestTextSymbol(this.zjFontName, this.zjFontSize);double zj_width = zjTool.getTextSize(txtSymbol, jNR, true);//获取注记起始点IPoint zjPoint = zjTool.getZJPoint_JZP(p0, A_lineMid, this.zjDistance, zj_width);double A_P0_Pzj = zjTool.getAngleOfLine(p0, zjPoint);if (Math.Abs(A_lineMid - A_P0_Pzj) < 0.0001){   //注记方向与线走向一致                        }else{   //注记方向与线走向 相反zjPoint = zjTool.getZJPoint_JZP_1(p0, A_lineMid, this.zjDistance, zj_width);}//this.writeZJPoint(zjPoint, jNR, 0, from_zhFeat, toFc);this.writeZJPoint(zjPoint, ".", 0, from_zhFeat, toFc);}//}}//-----
/// <summary>  /// 根据余弦定理求两个线段夹角  /// </summary>  /// <param name="o">端点</param>  /// <param name="s">start点</param>  /// <param name="e">end点</param>  /// <returns></returns>  public static double getAngleLine2Line(IPoint o, IPoint s, IPoint e){double cosfi = 0, fi = 0, norm = 0;double dsx = s.X - o.X;double dsy = s.Y - o.Y;double dex = e.X - o.X;double dey = e.Y - o.Y;cosfi = dsx * dex + dsy * dey;norm = (dsx * dsx + dsy * dsy) * (dex * dex + dey * dey);cosfi /= Math.Sqrt(norm);if (cosfi >= 1.0) return 0;if (cosfi <= -1.0) return Math.PI;fi = Math.Acos(cosfi);if (180 * fi / Math.PI < 180){return 180 * fi / Math.PI;}else{return 360 - 180 * fi / Math.PI;}}//计算三角形面积(负数表示逆时针,正数表示顺时针方向)public static double getAreaLine2Line(IPoint o,IPoint s,IPoint e){List<IPoint> tList = new List<IPoint>();tList.Add(s);tList.Add(o);tList.Add(e);tList.Add(s);IPolygon pn = CreatePolygonNoSimplify(tList.ToArray(),null);return (pn as IArea).Area;}//public static IPoint getZJPoint_JZP(IPoint p0, double A_lineMid, double d, double zj_width){            if (A_lineMid < 1e-13){    //与X轴重叠IPoint pp = new PointClass();pp.X = p0.X + d;   //-dpp.Y = p0.Y;return pp;}double K = Math.Tan(A_lineMid*Math.PI/180.0);  //转为弧度角double KK = K * K;double KKK = KK * K;double KK_1 = 1 + KK;double sqrt_1_kk = Math.Sqrt(1 + KK);//p在直线上p0+A_lineMiddouble x = (-d * sqrt_1_kk + p0.X + KK * p0.X) / KK_1;double y = -1 * K * d * sqrt_1_kk / KK_1  - K * p0.X +(K * p0.X) / KK_1 + (KKK * p0.X) / KK_1+ p0.Y;//IPoint p = new PointClass();p.X = x;p.Y = y;return p;//          }public static IPoint getZJPoint_JZP_1(IPoint p0, double A_lineMid, double d, double zj_width){if (A_lineMid < 1e-13){    //与X轴重叠IPoint pp = new PointClass();pp.X = p0.X + d;   //-dpp.Y = p0.Y;return pp;}double K = Math.Tan(A_lineMid * Math.PI / 180.0);double KK = K * K;double KKK = KK * K;double KK_1 = 1 + KK;double sqrt_1_kk = Math.Sqrt(1 + KK);//p在直线上p0+A_lineMiddouble x = (d * sqrt_1_kk + p0.X + KK * p0.X) / KK_1;double y = K * d * sqrt_1_kk / KK_1 - K * p0.X + (K * p0.X) / KK_1 + (KKK * p0.X) / KK_1 + p0.Y;//IPoint p = new PointClass();p.X = x;p.Y = y;return p;//          }
public static IPolygon CreatePolygonNoSimplify(IPoint[] exteriorRingPoints, IPoint[][] interiorRingPoints){IPolygon r = new PolygonClass();IGeometryCollection geos = r as IGeometryCollection;//添加外环IPointCollection exRing = new RingClass();for(int i=0;i< exteriorRingPoints.Length;i++)// (IPoint p in exteriorRingPoints){IPoint p = exteriorRingPoints[i];exRing.AddPoint(p);}               geos.AddGeometry(exRing as IGeometry);//如果有内环,添加内环if (interiorRingPoints != null){foreach (IPoint[] pc in interiorRingPoints){IPointCollection inRing = new RingClass();foreach (IPoint inP in pc)inRing.AddPoint(inP);geos.AddGeometry(inRing as IGeometry);}}            return r;}

两相交的直线段夹角平分的直线上过交点距离为d的另一点求解公式相关推荐

  1. 计算机图形学(三):三维图形观察及应用(矩形窗直线段的裁剪算法)

    裁剪:使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是图形的一部分.因此需要确定图形哪些部分落在显示区内,哪些落在显示区外.这个选择的过程就称为裁剪. 最简单的裁剪方法是把各 ...

  2. 实验二 实现中点分割直线段裁剪算法

    一.目的 1. 了解直线裁剪的基本原理和常用方法. 2. 掌握中点分割直线段裁剪算法的基本原理和步骤. 3. 使用C++.OpenGL编程实现如下内容:输入直线段的起始点和终止点坐标位置.用四边形模拟 ...

  3. 【数学计算】判断两条线段是否相交+计算两条线段的交点和夹角

    序言 还是那句话,学习是为了应用.书到用时方恨"用得少" 1. 计算两条直线的交点 直线一般式方程 A x + B y + C = 0 Ax+By+C = 0 Ax+By+C=0 ...

  4. 用神经网络分类两条夹角为θ的直线

    分类两条直线y=0和y=x*tanθ, 设r为0到1之间的随机数,两个训练集为 A:[[r][r*tanθ] B:[r][0] 训练集有5000个,测试集初始化方式相同,有1000个. 网络结构为 ( ...

  5. solid works 插入两两相交直线确定的基准面作图

    Solid works插入基准面作图 首先要思考的是:如何确定一个平面? 两相交直线.三个互相不共线的点.一条直线与一个不与他共线的点等 等. 现在我们以两个非常规的不同轴不同内径圆管为例 文件--- ...

  6. 空间两条直线段的最短距离及最近点计算

    如果这两条直线段不共线,假设直线段l0的两端点为:P0.P1:直线段l1的两端点为Q0.Q1,:求两直线段的最短距离? 直线段l0我们可以用方程表示为:     (1) 直线段l1我们也可以用方程表示 ...

  7. 【转】 LSD(Line Segment Detector) 直线段检测算法学习~

    论文回顾之一 一种新的直线段检测算法---LSD:a Line Segment Detector 原文地址:http://blog.csdn.net/polly_yang/article/detail ...

  8. 计算机图形学:Cohen-Sutherland直线段剪裁算法及梁友栋-Barsky裁剪算法(算法原理及代码实现)

    一.算法实现原理 Cohen-Sutherland直线段剪裁算法: 算法原理: (1)判断线段两端是否都落在窗口内,如果是,则线段完全可见,否则进行下一步 (2)判断线段两端是否都落在窗口外,如果是, ...

  9. 直线段检测算法---LSD

    直线段检测算法---LSD:a Line Segment Detector LSD的核心是像素合并于误差控制.利用合并像素来检测直线段并不是什么新鲜的方法,但是合并像素的方法通常运算量较大.LSD号称 ...

最新文章

  1. 冒号课堂§4.3:汇总范式
  2. C++语言程序设计之关联容器类型
  3. 出色性能服务器,浪潮服务器:演绎出色传输与存储性能
  4. 台式机计算机操作系统怎么看,电脑操作系统是32位还是64位的怎么查看
  5. 推荐一款好工具:16进制字节搜索工具 C#的效率
  6. python自己的模块_Python--构建发布自己的模块
  7. 阿里云 MaxCompute 2020-4 月刊
  8. 【https】keystore was tampered with or password was incorrect
  9. python出现Unresolved import:库名,已解决
  10. bat中冒号的作用(注释 ,跳转, 截取、替换字符串)
  11. 使用Python的Arcpy.mapping 模块自动化制图
  12. MySQL-快速入门(11)用户管理
  13. ghost for linux 教程,今天解决了ghost for linux的问题
  14. 解决edge可以访问github,谷歌却无法访问的问题
  15. 微博、QQ、微信第三方登录 Java 实现实录
  16. 伊斯坦布尔之旅第一天:蓝色清真寺和圣索菲亚博物馆
  17. 面试题之心理测试题及答案
  18. C++ 基本编程工具 DevCpp5.4.0 + 经典 VC6.0 | 软件分享 |
  19. 为什么你的孩子拼命做题,成绩还总是上不去?
  20. Need和Want有何不同?

热门文章

  1. Cadence软件包工具及功能介绍
  2. android 网易云音乐上滑动画,Android 仿网易云音乐 音轨跳动效果
  3. PHP打出来的数字和成语,数字成语一到十大全从一到十成语顺口溜
  4. 【javascript】clientHeight,offsetHeight,scrollHeight,scrollTop的理解,以及触底函数
  5. SolidWorks三维助手(二)
  6. AD软件中,如何解决同一局域网下license冲突问题
  7. HFSS平面倒F(PIFA)天线
  8. mysql 创建索引的三种方式
  9. 如何获取apk的签名信息?
  10. [Excel.VBA常用代码实战大全].袁竹平.扫描版百度云