BNU 7536 && HDU 3425 Coverage (圆与直线相交)

【题目链接】click here~~

【题目大意】求多个圆与线段相交的部分占整个线段的百分比。

【解题思路】

求出符合要求的交线段,排序一遍圆心。最后求并。

代码:

#include <bits/stdc++.h>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
struct node
{
    double x,y,l,r;
} Map[105];
bool cmp(node a, node b)
{
    if(a.l == b.l) return a.r < b.r;
    return a.l < b.l;
}
double solve(double a)
{
    if(a<0) return 0;
    if(a>1) return 1;
    return a;
}
int main()
{
    int n,m,i,j;
    double x1, y1, x2, y2;
    double x, y, r;
    double a, b, c, d, bi1, bi2;
    while(cin>>n&&n)
    {
        cin>>x1>>y1>>x2>>y2;
        int res= 0;
        for(i = 0; i < n; i ++)
        {
            cin >> x >> y >> r;
            a = (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1);
            b = 2*((x1-x)*(x2-x1) + (y1-y)*(y2-y1));
            c = (x1-x)*(x1-x) + (y1-y)*(y1-y) - r*r;
            d = b*b-4*a*c;                  //求解直线与圆相交方程
            if (d<= 0) continue;
            bi1 = solve((-b+sqrt(d)) / (2*a));
            bi2 = solve((-b-sqrt(d)) / (2*a));
            if(bi2 < bi1) swap(bi1, bi2);
            Map[res].l = bi1;            // bi1,bi2为在线段上的比例。
            Map[res ++].r=bi2;
        }
        if(res==0)
        {
            cout <<"0.00" << endl;
            continue;
        }
        sort(Map, Map+res, cmp);     //按照圆心排序
        double ans = 0, bi1 = Map[0].l, bi2 = Map[0].r;
        for(i = 1; i < res; i ++)       //  重叠的部分。
        {
            if(Map[i].l > bi2)
            {
                ans += bi2 - bi1;
                bi1 = Map[i].l;
                bi2 = Map[i].r;
            }
            else
            {
                bi2 = max(bi2, Map[i].r);
            }
        }
        ans+=bi2-bi1;
        printf("%.2f\n", ans*100);
    }
    return 0;
}
时间: 2024-10-12 21:29:22

BNU 7536 && HDU 3425 Coverage (圆与直线相交)的相关文章

BNU 7543 &amp;&amp; HDU 3425 Wax (分房间+模拟)

[题目链接]click here~~ [题目大意]  给出一个矩形平分,一个width*hight的矩形,过底边上的一点(dor,0)做m-1条射线,把这个矩形的面积平均分成m份,求这些射线和矩形的(m-1)个交点的坐标 [解题思路]思路给出在代码中了: //从左往右依次判断每加一个单位面积状态下的坐标 //可以证明每个面积是一块三角形 #include <iostream> #include <algorithm> #include <bits/stdc++.h> u

poj3819 Coverage (求直线与圆的交占直线的百分比 )

题意:给你一条直线和若干个圆,求圆与直线相交的长度占整条直线的比例 解题思路:通过定比分点的方法求出圆与直线的交占圆的比例. 第一步:(确定投影的方向是x轴还是y轴) (1)当直线的line.s(x, y), line.e(x, y)的line.s.x与line.e.x不同一时候,这条直线能够等同于起点为line.s.x, line.e.x; (2)不满足(1)时(即line.s.x==line.e.x时),当直线的line.s(x, y), line.e(x, y)的line.s.y与line

Android之2D图形(圆、直线、点)工具类 (持续更新)

public class Circle { private PointF centerPoint; private float radius; public PointF getCenterPoint() { return centerPoint; } public void setCenterPoint(PointF centerPoint) { this.centerPoint = centerPoint; } public float getRadius() { return radius

HDU 1798 两圆相交面积

Tell me the area Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1755    Accepted Submission(s): 535 Problem Description There are two circles in the plane (shown in the below picture), there is

复平面上的初等解析几何——圆和直线

今天搬完了宿舍,发现去年复习复分析的时候整理了一下这一点,下面我将其$\TeX$化,原手写稿请见这里. 下面介绍一些复平面上的直观,因为我们解析几何通常以实数为基本,遇到复平面上的直线和圆时有时会很棘手,下面对此作一些整理. 注:之后$\overline{z}$均表示$z$的共轭. 首先是圆和直线的方程. 命题1. 复平面上直线与圆的方程共享同一种形式,他们是$$\alpha z\overline{z}+\beta z+\overline{\beta}\overline{z}+\gamma =0

直线与直线相交 直线与线段相交 线段与线段相交

int sgn(double x) { if(fabs(x) < eps) return 0; return x < 0 ? -1:1; } struct Point { double x,y; Point() {} Point(double _x,double _y) { x = _x,y = _y; } Point operator -(const Point &b)const { return Point(x - b.x,y - b.y); } //叉积 double opera

判断线段和直线相交 POJ 3304

1 // 判断线段和直线相交 POJ 3304 2 // 思路: 3 // 如果存在一条直线和所有线段相交,那么平移该直线一定可以经过线段上任意两个点,并且和所有线段相交. 4 5 #include <cstdio> 6 #include <cstring> 7 #include <iostream> 8 #include <algorithm> 9 #include <map> 10 #include <set> 11 #inclu

poj2074Line of Sight(直线相交)

链接 几何细节题. 对于每一个障碍物可以求出它在地产线上的覆盖区间,如下图. 紫色部分即为每个障碍物所覆盖掉的区间,求出所有的,扫描一遍即可. 几个需要注意的地方:直线可能与地产线没有交点,可视区间可能包含地产线的端点,扫描的时候保留当前扫到的最大值. 代码中的数据很经典,供参考. 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #inc

poj 1127(直线相交+并查集)

Jack Straws Description In the game of Jack Straws, a number of plastic or wooden "straws" are dumped on the table and players try to remove them one-by-one without disturbing the other straws. Here, we are only concerned with if various pairs o