这个专题讨论用解析几何的方法解决线段,直线和点的计算问题。

默认使用笛卡尔直角坐标系。

计算点到线段的最近点。

已知线段P1P2((x1,y1),(x2,y2)),点Q(x0,y0),求点Q到线段P1P2的 最近坐标。

存在两种情况:

1.情况一:y1=y2&&x1!=x2时,直线P1P2的方程为y=y1,则Q到P1P2的垂线方程为x=x0,垂足坐标为(x0,y1)。

直线AB,下面是Q的三种不同的位置。最近的点的坐标很明显分别对应的三个红色的点。

同理x1=x2时:

直线AB,左右时Q的三种不同的位置。最近点的坐标对应的三个红点。

2.情况二:当y1=y2&&x1=x2时,该线段不平行于x轴&&不平行于y轴,斜率存在但不为0,则可设线段的两端点分别为P1,P2,斜率k=(y2-y1)/(x2-x1)。

该直线方程为:y=k(x-x1)+y1;

垂线方程为y=(-1/k)(x-x0)+y0;连立公式,解得x=(x1*k^2+k(y0-y1)+x0)/(1+k^2);y=k(x-x1)+y1;

同理可以求出点到折线,矩形,多边形的最近点。

计算点到圆的最近距离及最近点的坐标。

已知圆心坐标O=(xr,yr)及半径r,点P=(x0,y0),求点P到最近点的坐标分为以下几种情况:

1. P=A,则点到圆的最近距离为r,点位圆上任意一点的坐标。

2. P=C||P=C',y轴相等,则为:(xr+r,yr) || (x-r,yr)。

3. P=D||P=D',x轴相等,则为:(xr,yr+r) || (xr,yr-r)。

4. P=G||P=G',没有什么关系,存在一个斜率不为0的直线,则斜率为:k=(y0-yr)/(x0-xr)。

直线AG的方程为:y=k(x-Gx)+Gy。圆的方程为:(x-Ax)^2+(y-Ay)^2=r^2;连立求出交点(注意有两个)即可。

计算两条共线的线段的交点。

对于两条共线的线段,位置关系有以下几种情况:

分别是,没交点,有一个,无穷,无穷。

计算线段与线段的交点。

虽然感觉不太实用,但是姑且还是写出来吧,向量大法好!

首先判断两线段是否相交,

一般情况:k1=(y2-y1)/(x2-x1),k2=(y4-y3)/(x4-x3);

直线方程分别是:L1:y=k1(x-x1)+y1   L2:y=k2(x-x3)+y3;

注意斜率为0及斜率不存在的特判。

计算线段||直线和圆的交点。

参考上文:”点到圆的最近距离“求解。

求圆和圆的交点

用三角函数求交点,精度更高哦。

Code:

int Dcmp(double x){if(fabs(x)<EPS) return 0;return x<0?-1:1;}
struct Point{double x,y;Point(double _x=0,double _y=0){x=_x;y=_y;}friend Point operator - (Point a,Point b){return Point(a.x-b.x,a.y-b.y);}friend double operator * (Point a,Point b){return a.x*b.x+a.y*b.y;}friend double operator ^ (Point a,Point b){return a.x*b.y-a.y*b.x;}friend int operator == (Point a,Point b){return Dcmp(a.x-b.x)==0&&Dcmp(a.y-b.y)==0;}
};
struct Cir{Point cen;double r;void InPut(){scanf("%lf%lf%lf",&cen.x,&cen.y,&r);}Point Inter(double a){return Point(cen.x+cos(a)*r,cen.y+sin(a)*r);}
};
double Distance(Point a,Point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
double Distance(Point a){return sqrt(a.x*a.x+a.y*a.y);}double Ang(Point a){return atan2(a.y,a.x);
}
int CirCir(Cir c1,Cir c2,Point &p1,Point &p2){double d=Distance(c1.cen,c2.cen);if(Dcmp(d)==0){if(Dcmp(c1.r-c2.r)==0) return -1;return 0;}if(Dcmp(c1.r+c2.r-d)<0) return 0;if(Dcmp(fabs(c1.r-c2.r)-d)>0) return 0;double a=Ang(c2.cen-c1.cen);double da=acos((c1.r*c1.r+d*d-c2.r*c2.r)/(2.0*d*c1.r));p1=c1.Inter(a-da);p2=c1.Inter(a+da);//所求得的两交点 if(p1==p2) return 1;return 2;
}

解析几何--交点的计算相关推荐

  1. 两条线段的交点的计算

    问题 已知线段P1P2和Q1Q2,判断它们是否有交点,若有,求出交点. 1.判断线段是否相交 如图,判断线段是否相交,可以通过一系列实验来进行. 快速排斥实验 若以P1P2和Q1Q2为对角线的矩形不相 ...

  2. 解析几何--面积的计算

    前提提要:向量叉积以后改用 ^ 符号,重载运算符后发现表示更清晰. friend double operator ^ (Point a,Point b){return a.x*b.y-a.y*b.x; ...

  3. java 圆的交点_java计算两条线段交点

    1.判断斜率相同不,y2-y1/x2-x1,y4-y3/x4-x3,相同则无交点,不相同说明直线有交点则执行第二步: 2.设y=ax+b,通过斜率可求出a的值,通过坐标可以求出b的值,这样两个线段所在 ...

  4. 坐标求交点java_java计算两条线段交点

    1.判断斜率相同不,y2-y1/x2-x1,y4-y3/x4-x3,相同则无交点,不相同说明直线有交点则执行第二步: 2.设y=ax+b,通过斜率可求出a的值,通过坐标可以求出b的值,这样两个线段所在 ...

  5. 二维平面内两直线交点计算

    对于几何关系的计算,两点确定一条直线,两直线的交点的计算经常见到.最简单matlab编程方法是通过两点列出直线方程,使用matlab工具解方程.但是计算时发现速度较为缓慢. 表达式定义 空间直线的表达 ...

  6. 一种计算两直线交点的方法

    写在前面: 文章转载请注明出处,谢谢! 对于计算四个点表达的两条直线交点这个问题其实网上相应的代码与数学模型比较好找,所以这里无法保证提供的思路就是最正确或效率最高的,如果能帮助到你那真的是万分荣幸 ...

  7. 直线与直线、直线与圆、直线与矩形的交点

    求直线与直线.直线与圆.直线与矩形的交点 直线与直线的交点:a1x + b1x + c1x = 0 与 a2x + b2x + c2x = 0的交点坐标可直接根据公式x = (b1c2 - b2c1) ...

  8. 计算几何学 | 知识点及C++代码实现汇总

    博客上看到的非常优质的计算几何学c++代码实现. 代码可直接访问github仓库 计算几何学 计算几何学 | 几何对象的基本元素与表现 | Basic 计算几何基础知识整理大全 | Vector | ...

  9. C++求解圆心、半径、直线与圆交点

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 C++求解圆心.半径.直线与圆交点 前言 一.检测对象 二.检测方法 1.检测圆心和半径 2.求解直线与圆的交点 3.计算圆环残缺比例 ...

最新文章

  1. Block相关内容梳理
  2. linux上的ds命令,Linux--容器命令
  3. CSS节选——选择器
  4. truncate,delete,drop之间的区别
  5. 怎样让计算机快速开机,怎样设置可以让电脑快速启动开机.doc
  6. 如何用c语言调用c++做成的动态链接库
  7. DNS劫持和HTTP劫持有何区别
  8. pycharm中文版2019禁止更新的方法
  9. Swing开发之JButton篇
  10. 前端对页面中的 checked 选中状态的展示
  11. 数字视频编解码基础知识大全
  12. 关于手机游戏市场的调研方案(终结版)
  13. POJ1759Garland题解
  14. CoinBene 满币荣获「2020 年度最佳品牌增长」大奖 未来可期
  15. SeedLab1: Sniffing Spoofing Lab
  16. JAVA表示姓名和对应的出生日期
  17. py 网站实时监控+可手动回溯回放网站数据的实现
  18. 需要跟前辈学习的博客
  19. Cesium案例解析(九)——Rotatable2DMap旋转2D地图
  20. 【子桓说】从阿里、百度分析,教你判断一家企业是否适合自己

热门文章

  1. Python 题之“大小写字母互换”
  2. 【LC周赛241】1865. 找出和为指定值的下标对
  3. Python 语感训练100题(参考答案)
  4. 十五铬钼钢板和十二铬一钼钒钢板的区别
  5. Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean
  6. 水面垃圾漂浮物检测+yolo系列
  7. javafx图片转字符
  8. 如何解决网络连接问题
  9. 如何分析个股基本面_个股的基本面分析_如何看个股的基本面
  10. pip、conda源更换为清华源、查看源、删除源