CSU 1503 点到圆弧的距离(最易理解)

2023-10-20 13:30

本文主要是介绍CSU 1503 点到圆弧的距离(最易理解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一步找出圆心

根据题目给出的三点建立两条直线,两直线垂直平分线的交点就是圆心

第二步判断点与圆弧的位置关系

通过分析,可分为两种情况;

情况一,ans1为p到p1的距离减去圆的半径的绝对值

情况二,ans2为p到A,C两点的距离最小值

给出f1,f2,f3,f4分别表示向量 p1A, p1B,p1C,p1P与x正半轴的夹角;

考虑到没有给出给点的顺序,有可能顺时针或逆时针给点。

给出判断的代码:

if(f1<f3){if((f2<=f3&&f2>=f1) == (f4<=f3&&f4>=f1))ans=ans1;else ans=ans2;
}else{if((f2>=f3&&f2<=f1) == (f4>=f3&&f4<=f1))ans=ans1;else ans=ans2;
}

下面分析这段代码:

f1<f3时,表示A,C的位置关系

顺时针给点会形成如下的圆弧;

显然f2 不会满足 f2<=f3&&f2>=f1 如果 f4也不满足 f4<=f3&&f4>=f1,即(f2<=f3&&f2>=f1) == (f4<=f3&&f4>=f1)

则答案是ans1;

如果f4满足 f4<=f3&&f4>=f1 即(f2<=f3&&f2>=f1) != (f4<=f3&&f4>=f1)

则答案是ans2;

逆时针给点会形成如下的圆弧;

显然f2 满足 f2<=f3&&f2>=f1如果 f4也满足 f4<=f3&&f4>=f1,即(f2<=f3&&f2>=f1) == (f4<=f3&&f4>=f1)

则答案是ans1;

如果f4不满足 f4<=f3&&f4>=f1 即(f2<=f3&&f2>=f1) != (f4<=f3&&f4>=f1)

则答案是ans2;

f1>=f3时的情况按照上面的步骤分析一下即可

完整代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath> 
using namespace std;
struct Point{double x,y;Point(double x=0,double y=0):x(x),y(y){}
};
typedef Point Vector;
Vector operator + (Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
Vector operator - (Vector A,Vector B){return Vector(A.x-B.x,A.y-B.y);}
Vector operator * (Vector A,double B){return Vector(A.x*B,A.y*B);}
Vector operator / (Vector A,double B){return Vector(A.x/B,A.y/B);}double Dot(Vector A,Vector B){return A.x*B.x+A.y*B.y;}
double Length(Vector A){return sqrt(Dot(A,A));}
double Cross(Vector A,Vector B){return A.x*B.y-B.x*A.y;}Vector Normal(Vector A){double l=Length(A);return Vector(-(A.y/l),A.x/l);
}
Point GetLineIntersection(Point P,Vector v,Point Q,Vector w){Vector u=P-Q;double t=Cross(w,u)/Cross(v,w);return P+v*t;
}
double Distance(Point a,Point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main(){Point a,b,c,p,p1;int Case=0;while(~scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&p.x,&p.y)){Point mid1,mid2;mid1.x=(a.x+b.x)/2;mid1.y=(a.y+b.y)/2;mid2.x=(a.x+c.x)/2;mid2.y=(a.y+c.y)/2;Vector v1=(b-a);Vector v2=(c-a);v1=Normal(v1);v2=Normal(v2);p1=GetLineIntersection(mid1,v1,mid2,v2);//通过三点建立两直线,两直线的垂直平分线交点就是圆心double ans,ans1,ans2;double da,dc,dp1,r;dp1=Distance(p,p1);r=Distance(p1,a);da=Distance(p,a);dc=Distance(p,c);ans1=fabs(dp1-r); ans2=min(da,dc);double f1=atan2(a.y-p1.y,a.x-p1.x);double f2=atan2(b.y-p1.y,b.x-p1.x);double f3=atan2(c.y-p1.y,c.x-p1.x);double f4=atan2(p.y-p1.y,p.x-p1.x);if(f1<f3){if((f2<=f3&&f2>=f1) == (f4<=f3&&f4>=f1))ans=ans1;else ans=ans2;}else{if((f2>=f3&&f2<=f1) == (f4>=f3&&f4<=f1))ans=ans1;else ans=ans2;}printf("Case %d: %.3lf\n",++Case,ans);}return 0;
}

 

这篇关于CSU 1503 点到圆弧的距离(最易理解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/247413

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字