POJ3285 计算几何|线圆交点

本文介绍了POJ3285问题的解决方案,该问题涉及计算几何中的线圆交点。通过分析圆心坐标、半径以及特定角度,将问题转化为求解三条圆的交点。根据半径的关系,可以得到直线、圆的交点情况,包括两条直线交点、直线与圆交点以及两个圆交点。提供了实现这些交点计算的基本函数,并指出此问题虽简单但实现稍显繁琐。

poj.org/problem?id=3285

思路:

对于圆心(xi,yi)半径ri的圆,观察角度为特定a的所有点分布在以(xi, yi)为圆心,半径为ri/sin(a/2)的圆上,所以题目就是求三个圆的交点,即满足下列方程的点(x,y)

(x-xi)*(x-xi)+(y-yi)*(y-yi)=(ri*k)*(ri*k) for i in {1,2,3}

三个方程消去k,会有两种情况

1. 如果ri==rj, 那么第i和第j个方程消去k后是个直线方程

2. 如果ri!=rj, 那么第i个和第j个方程消去k后会得到一个圆的方程

所以,最终需要计算的是三种可能的情况

1. 两条直线的交点

2. 一条直线和一个圆的交点

3. 两个圆的交点

实现

两直线的交点

char linexline(double a0, double b0, double c0, double a1, double b1, double c1) {
    double d = a0*b1-b0*a1;
    if (d<EPS&&d>-EPS) return 0;
    rxx[0].x = (c0*b1-b0*c1)/d;
    rxx[0].y = (a0*c1-c0*a1)/d;
    return 1;
}

直线于圆的交点,(个人比较习惯点斜式直线方程,对于ax+by=c的方程,会转换为点斜式)

char linexcircle2(double x0, double y0, double dx0, double dy0, double x1, double y1, double r1) {
    double k;
    double a, b, c, d;
    // (x0+k*dx0-x1)*(x0+k*dx0-x1)+(y0+k*dy0-y1)*(y0+k*dy0-y1)=r1*r1
    a=dx0*dx0+dy0*dy0;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值