两相交的直线段夹角平分的直线上过交点距离为d的另一点求解公式
两相交的直线段夹角平分的直线上过交点距离为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. 掌握中点分割直线段裁剪算法的基本原理和步骤. 3. 使用C++.OpenGL编程实现如下内容:输入直线段的起始点和终止点坐标位置.用四边形模拟 ...
- 【数学计算】判断两条线段是否相交+计算两条线段的交点和夹角
序言 还是那句话,学习是为了应用.书到用时方恨"用得少" 1. 计算两条直线的交点 直线一般式方程 A x + B y + C = 0 Ax+By+C = 0 Ax+By+C=0 ...
- 用神经网络分类两条夹角为θ的直线
分类两条直线y=0和y=x*tanθ, 设r为0到1之间的随机数,两个训练集为 A:[[r][r*tanθ] B:[r][0] 训练集有5000个,测试集初始化方式相同,有1000个. 网络结构为 ( ...
- solid works 插入两两相交直线确定的基准面作图
Solid works插入基准面作图 首先要思考的是:如何确定一个平面? 两相交直线.三个互相不共线的点.一条直线与一个不与他共线的点等 等. 现在我们以两个非常规的不同轴不同内径圆管为例 文件--- ...
- 空间两条直线段的最短距离及最近点计算
如果这两条直线段不共线,假设直线段l0的两端点为:P0.P1:直线段l1的两端点为Q0.Q1,:求两直线段的最短距离? 直线段l0我们可以用方程表示为: (1) 直线段l1我们也可以用方程表示 ...
- 【转】 LSD(Line Segment Detector) 直线段检测算法学习~
论文回顾之一 一种新的直线段检测算法---LSD:a Line Segment Detector 原文地址:http://blog.csdn.net/polly_yang/article/detail ...
- 计算机图形学:Cohen-Sutherland直线段剪裁算法及梁友栋-Barsky裁剪算法(算法原理及代码实现)
一.算法实现原理 Cohen-Sutherland直线段剪裁算法: 算法原理: (1)判断线段两端是否都落在窗口内,如果是,则线段完全可见,否则进行下一步 (2)判断线段两端是否都落在窗口外,如果是, ...
- 直线段检测算法---LSD
直线段检测算法---LSD:a Line Segment Detector LSD的核心是像素合并于误差控制.利用合并像素来检测直线段并不是什么新鲜的方法,但是合并像素的方法通常运算量较大.LSD号称 ...
最新文章
- 冒号课堂§4.3:汇总范式
- C++语言程序设计之关联容器类型
- 出色性能服务器,浪潮服务器:演绎出色传输与存储性能
- 台式机计算机操作系统怎么看,电脑操作系统是32位还是64位的怎么查看
- 推荐一款好工具:16进制字节搜索工具 C#的效率
- python自己的模块_Python--构建发布自己的模块
- 阿里云 MaxCompute 2020-4 月刊
- 【https】keystore was tampered with or password was incorrect
- python出现Unresolved import:库名,已解决
- bat中冒号的作用(注释 ,跳转, 截取、替换字符串)
- 使用Python的Arcpy.mapping 模块自动化制图
- MySQL-快速入门(11)用户管理
- ghost for linux 教程,今天解决了ghost for linux的问题
- 解决edge可以访问github,谷歌却无法访问的问题
- 微博、QQ、微信第三方登录 Java 实现实录
- 伊斯坦布尔之旅第一天:蓝色清真寺和圣索菲亚博物馆
- 面试题之心理测试题及答案
- C++ 基本编程工具 DevCpp5.4.0 + 经典 VC6.0 | 软件分享 |
- 为什么你的孩子拼命做题,成绩还总是上不去?
- Need和Want有何不同?
热门文章
- Cadence软件包工具及功能介绍
- android 网易云音乐上滑动画,Android 仿网易云音乐 音轨跳动效果
- PHP打出来的数字和成语,数字成语一到十大全从一到十成语顺口溜
- 【javascript】clientHeight,offsetHeight,scrollHeight,scrollTop的理解,以及触底函数
- SolidWorks三维助手(二)
- AD软件中,如何解决同一局域网下license冲突问题
- HFSS平面倒F(PIFA)天线
- mysql 创建索引的三种方式
- 如何获取apk的签名信息?
- [Excel.VBA常用代码实战大全].袁竹平.扫描版百度云