【计算几何】【圆反演】hdu6097 Mindis

给你一个中心在原点的圆,再给你俩在圆内且到原点距离相等的点P,Q,让你在圆上求一点D,最小化DP+DQ。

http://blog.csdn.net/qq_34845082/article/details/77099332

附:过反演中心的圆反演后变成一条和该圆正交的直线。

不过反演中心的圆反演后是一个与原圆关于反演中心位似的圆。

不过反演中心的直线反演后变成一个过反演中心且与其正交的圆。

#include<cstdio>
#include<cmath>
using namespace std;
const double EPS=0.0000000001;
struct Point{
    double x,y;
    Point(){}
    Point(const double &x,const double &y){
        this->x=x;
        this->y=y;
    }
    double length(){
        return sqrt(x*x+y*y);
    }
    void read(){
        scanf("%lf%lf",&x,&y);
    }
}p,q;
double R;
typedef Point Vector;
Vector unit(Vector v){
    double l=v.length();
    return Vector(v.x/l,v.y/l);
}
Point CalcMid(const Point &a,const Point &b){
    return Point((a.x+b.x)*0.5,(a.y+b.y)*0.5);
}
double sqr(const double &x){
    return x*x;
}
Vector operator - (const Point &a,const Point &b){
    return Vector(a.x-b.x,a.y-b.y);
}
Vector operator * (const double &K,const Vector &v){
    return Vector(K*v.x,K*v.y);
}
int T;
int main(){
    scanf("%d",&T);
    for(;T;--T){
        scanf("%lf",&R);
        p.read();
        q.read();
        if(fabs(p.x)<EPS && fabs(p.y)<EPS){
            printf("%.10lf\n",2.0*R);
            continue;
        }
        Point mp=CalcMid(p,q);
        Point P=Point((p-mp).length(),sqrt(sqr(p.length())-sqr((p-mp).length())));
        Point Pp=R*R/P.length()*unit(P);
        if(Pp.y-R>EPS){
            printf("%.10lf\n",P.length()/R*2.0*(Pp-Point(0.0,R)).length());
        }
        else{
            printf("%.10lf\n",P.length()/R*2.0*Pp.x);
        }
    }
    return 0;
}
时间: 2024-10-03 22:40:45

【计算几何】【圆反演】hdu6097 Mindis的相关文章

【计算几何】【圆反演】hdu6158 The Designer

给你内外那俩圆的半径,让你按图中标号的顺序往缝里塞n个小圆,问你小圆的总面积. 不知道圆反演的先去查一下定义. 将两个圆的切点视作反演中心,任取反演半径(比如1),将两个圆反演成两条平行直线,则那些小圆都变成相同大小啦!就很好算了,我们再将小圆通过反演算回它原来的面积即可. 怎样求原小圆的面积呢? 只需求得AB的长度即可.因为A'距离原点的距离我们知道,B'距离原点的距离我们也知道,OA,OB就很好求了,作个差就是AB. (这套CCPC网络赛的题是我们学校的人出的,线下测题的时候,我的这份代码能

计算几何-圆 模板 训练指南267

#include #include #include #include #include #include #include #include #include #include #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const double eps = 1e-10; const int inf = 0x3f3f3f3f; using namespace

HDU 4773 Problem of Apollonius——圆反演

题面 HDU4773 解析  大概是圆反演的模板吧. 以点$P(x3, y3)$为反演中心,任意长为反演半径,将两个已知圆反演,设反演后的圆为$A'$, $B'$,所求圆反演后为一条直线,根据题目中的要求,该直线为两圆的外公切线.因此我们只需要求出两圆的外公切线即可. 然后会发现WA了,因为题目中还有一个要求,所求圆要外切于两圆,即反演变换后反演中心$P$和$A'$的圆心要在同侧. 还有一个我一开始做错了的地方,原来的圆心$O$反演后就不是新的圆心了!!!可以连接$PO$,求其与圆的两个交点,两

【计算几何】【圆反演】计蒜客17314 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G. Finding the Radius for an Inserted Circle

题意:给你三个半径相同的圆,它们切在一起,然后让你往缝里一个一个地塞圆,问你塞到第k个的半径是多少. 就把上面那两个圆的切点当成反演中心,然后会反演成这个样子,两个平行直线和一个圆. 然后就是往那个圆上面再塞圆,然后反演回去算面积就行了. #include<cstdio> #include<cmath> using namespace std; const double pi=3.14159; int n,K; double R,anss[12]; int main(){ //fr

hdu 4773 圆的反演

第一次接触反演算法. 通过反演圆以求得反演后的直线. 圆的相切即为直线和圆的相切,切点是关键. 值得注意的是,不过中心的直线反演后得到不过中心的圆,圆圆反演后得到另一个圆,因为中途可以得到一条直线,所以可以简化计算. 反演半径不可以随意选取,过大会导致精度问题. #include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#includ

【模板】【计几】圆的反演

hdu4773:http://acm.hdu.edu.cn/showproblem.php?pid=4773 题意:给你两个相离的圆,以及一个点,求所有和这两个圆相切,并且经过该点的圆. 我们先画出满足题意的圆,然后把这三个圆反演,给定的两个圆因为不经过p点,反演后是两个圆,然后ans圆经过p点,所以反演后是一条直线,又因为和两个圆相切,所以反演出来的直线也是和两个圆相切的,所以就是两个反演圆的外公切线了(不可以是内公切先,画画图就明白了). 1 #include<bits/stdc++.h>

ZROI 19.08.02 计算几何

1.向量基础知识 \(atan2\)可以求极角,但是不是特别精确,在坐标接近\(10^{9}\)时会出锅,安全的做法是叉积. 旋转.反射和平移等都可以抽象为矩阵,即,它们可以复合.(需要一些必修四知识) 给一个序列,每个位置表示旋转.反射.平移中的一种,求\((x,y)\)经过序列\([l,r]\)的点. 线段树维护矩乘就好了,矩阵里需要带个常数位置. Simpson积分 不会积分,告辞. 2.简单题 求点\(p\)在直线\(p_1p_2\)上的投影. 投影就是点积,直接积就行了,必修四怎么学的

HDU5130 Signal Interference

1 /* 2 HDU5130 Signal Interference 3 http://acm.hdu.edu.cn/showproblem.php?pid=5130 4 计算几何 圆与多边形面积交 5 * 6 */ 7 8 9 #include <cstdio> 10 #include <algorithm> 11 #include <cmath> 12 using namespace std; 13 const double Pi=acos(-1.0); 14 co

快速傅立叶变换(FFT)相关内容汇总

FFT是近年考察非常频繁的算法,与其相关的知识点也相当多样. 这里主要是资料汇总,内容补充和总结等.具体应用应在各大OJ上做相关题目. 目录: 概述 1. 前置技能:数学基础 1.1 多项式概念与运算. 1.2 微积分初步与泰勒展开 1.3 普通型生成函数与指数型生成函数 1.4 线性代数相关(矩阵,行列式与特征多项式) 1.5 组合数与伯努利数 1.6 常系数齐次线性递推 1.7 初等数论与初等代数 1.8 卷积概念与O(n^2)求法 1.9 拉格朗日插值法 2. FFT:快速傅立叶变换算法总