求圆与直线的交点的方法是:

  1. 求圆心c在直线l上的投影点pr
  2. 求出直线l上的单位向量e
  3. 根据r和pr的长度来计算出圆内线段部分的一半base
  4. 用pr±base*e即得到答案

题目:CGL_7_D

AC代码:

#include <iostream>
#include <cstdio>
#include <math.h>
using namespace std;#define COUNTER_CLOCKWISE -1 //逆时针
#define CLOCKWISE 1          //顺时针
#define ONLINE_BACK -2       //p2 p0 p1依次排列在一条直线上
#define ONLINE_FRONT 2       //p0 p1 p2依次排列在一条直线上
#define ON_SEGMENT 0         //p2在线段p0p1上#define EPS 1E-8class Point
{
public:double x, y;Point(){}Point(double x, double y){(*this).x = x;(*this).y = y;}double operator^(const Point &p) const //叉乘{return x * p.y - y * p.x;}double operator*(const Point &p) const //点乘{return x * p.x + y * p.y;}Point operator*(const double &d) const{return Point(x * d, y * d);}Point operator/(const double &d) const{return Point(x / d, y / d);}Point operator-(const Point &p) const{return Point(x - p.x, y - p.y);}Point operator+(const Point &p) const{return Point(x + p.x, y + p.y);}double sqr(){return x * x + y * y;}double abs(){return sqrt(sqr());}double distance(const Point &p){return fabs((*this - p).abs());}void print(){printf("%.8lf %.8lf", x, y);}
};class Line
{
public:Point p1, p2;Point vec;Line(){}Line(Point p1, Point p2){(*this).p1 = p1;(*this).p2 = p2;(*this).vec = p2 - p1;}
};class Circle
{
public:Point o;double r;Circle(){}Circle(Point o, double r){(*this).o = o;(*this).r = r;}Circle(double cx, double cy, double r){(*this).o.x = cx;(*this).o.y = cy;(*this).r = r;}
};double get_distance_LP(const Line &line, const Point &p) //点到直线的距离
{return fabs((p - line.p1) ^ (line.p1 - line.p2) / (line.p1 - line.p2).abs());
}pair<Point, Point> get_Cross_Points(Circle c, Line l)
{//l.p1.print();Point pr = l.p1 + (l.vec) * ((c.o - l.p1) * l.vec)/ ( l.vec.sqr());double base = sqrt(c.r * c.r - (pr-c.o).sqr());if (base <= EPS) //只有一个交点{return make_pair(pr, pr);}//有两个交点Point e = (l.vec) / l.vec.abs();return make_pair(pr + e * base, pr - e * base);
}int main()
{double cx, cy, r;cin >> cx >> cy >> r;Circle c(cx, cy, r);int q;cin >> q;while (q--){Line l  = Line();cin >> l.p1.x >> l.p1.y >> l.p2.x >> l.p2.y;l.vec = l.p2-l.p1;auto ans = get_Cross_Points(c, l);//ans.first.print();if (ans.first.x < ans.second.x ){ans.first.print();cout << ' ';ans.second.print();cout << endl;}else if (ans.second.x < ans.first.x){ans.second.print();cout << ' ';ans.first.print();cout << endl;}else{if (ans.first.y - ans.second.y <= EPS){ans.first.print();cout << ' ';ans.second.print();cout << endl;}else{ans.second.print();cout << ' ';ans.first.print();cout << endl;}}}
}

转载请注明来源:https://www.longjin666.top/?p=793

计算几何之求圆与直线的交点相关推荐

  1. [计算几何] (二维)圆与直线的交点

    给出圆心O的坐标, 和半径r, 再给出点A,B的坐标构成直线AB, 求出圆与直线AB交点的坐标 如下图 Step1: 首先求出圆心c在直线l 上的投影点pr的坐标 可通过求解向量p1pr(p1pr的长 ...

  2. 求圆和直线之间的交点

    求圆和直线之间的交点 /*** 求圆和直线之间的交点* 直线方程:y = kx + b* 圆的方程:(x - m)² + (x - n)² = r²* x1, y1 = 线坐标1, x2, y2 = ...

  3. 用矢量变换的方法求两条直线的交点

    求两条直线的交点,最常见的写法是列出两条直线的方程,联立求解.     但这种办法的弊端很大:     1 )算法是坐标系相关的,要考虑直线是水平还是垂直,写出很多判断条件,增加了程序的不稳定性    ...

  4. 计算几何学 | 圆与直线的交点 | Cross Points of a Circle and a Line | C/C++实现

    问题描述 求圆c与直线 l l l的交点. 输入: 输入按照下述格式给出: c x cx cx c y cy cy r r r q q q L i n e 1 Line_1 Line1​ L i n ...

  5. zoj 1560 Hansel and Grethel(求两条直线的交点)

    题目地址 题目大意:给出2个点及其各自夹角,求2条直线的交点 解题思路:数学公式推导,用tan()求斜率时要将角度转换成弧度 #include <iostream> #include &l ...

  6. java两条直线交点_求两条直线的交点坐标

    看UdaCity机器学习大纲,发现入门班中有一条:编写算法计算一组直线或平面的交点. 遂从最简单的直角坐标系两条直线的交点开始, 直线1的方程解析式: 2x-y=0; 直线2的方程解析式: 4x-5y ...

  7. C++实现求两条直线的交点,以及已知直线外一点求垂足

    已知直线上的两个点或者已知直线的斜率和截距两种情况下求交点和垂足. 两种情况来自于实际求解中可以找到边界上的两个点列出直线方程,也可以用更准确的求法即获取多个点拟合一条直线. 1.求两直线的交点(两点 ...

  8. matlab 圆和直线的交点,利用MATLAB检测直线交点的源程序

    [f,map]=imread('xian.bmp'); %函数实现了图像中单象素宽白色相交直线交点的检测 %利用的是最简单的邻域中计算白点的个数的算法,当一个象素的window邻域中有四个邻域为白色的 ...

  9. c++求两条直线的交点

    一.已知每条直线的两个点: cv::Point2d get2lineIPoint(cv::Point2d lineOnePt1, cv::Point2d lineOnePt2, cv::Point2d ...

最新文章

  1. c语言 狸抓兔子,捕捉猫狸的方法- 抓野猫的最好方法
  2. 逻辑模型三要素-完整性约束
  3. ETC带火车牌识别设备 多方企业狭路相逢
  4. 安装sun-java5-jdk 在ubuntu 9.10 提示无法找到软件包sun-java5-jdk#...
  5. 大数据技术之kafka (第 3 章 Kafka 架构深入 ) offset讲解
  6. 互联网晚报 | 2月22日 星期二 | 海底捞预告去年最高亏45亿元;奥迪一汽新能源汽车项目启动;英雄互娱更名“英雄游戏”...
  7. MariaDB 在 RedHat Linux 上的安装过程以及 MySQL 相关命令的使用
  8. 中国气象站点原数据集(1942-2022年3月)
  9. 华为路由器NAT经典配置
  10. Windows开发之VC++仿QQ迷你首页(迷你资讯)
  11. 联想笔记本G50-70无线网卡问题
  12. LAN8720A芯片
  13. Siggraph2019 RealTimeRender“观影推荐”
  14. 74HC138芯片简析
  15. 《web开发: 数据可视化(Echarts)介绍》
  16. 卸载mysql5.6.34_5.6.34版本安装后需要做的事项\mysql\.\innodb_table_stats\ not found.-hxl-ChinaUnix博客...
  17. 微信群活码的原理及其作用,以及活码怎么使用
  18. 最新ncRNA数据库大全(含TCGA、ceRNA、exosome等)
  19. Java修饰符与关键字
  20. Kotlin use函数的魔法

热门文章

  1. 《SolidWorks 2014中文版机械设计从入门到精通》——2.2 草图命令
  2. 对学术不怎么热爱,只想当大学老师而去读博可以么?
  3. 卡通风珍惜粮食人人有责节约粮食文明就餐从我做起通用PPT模板
  4. 高德地图导航和标注,通过调用高德APP实现呢
  5. JSP+MYSQL网上作业提交及管理系统
  6. Pulsar bk报错Unable to allocate memory, exiting bookie
  7. 廉洁文化 计算机学院,资讯抢先看 | 廉洁文化主题活动优秀作品锦集,请查收~...
  8. WPF 在image控件用鼠标拖拽出矩形
  9. 前端优质网络内容(引用)
  10. 第四章,java swtch语句