HDU 6206 Apple
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6206
判断给定一点是否在三角形外接圆内。
给定三角形三个顶点的坐标,如何求三角形的外心的坐标呢?
知乎链接:https://www.zhihu.com/question/40422123/answer/86514178
例如 :给定a(x1,y1) b(x2,y2) c(x3,y3)求外接圆心坐标O(x,y)
1. 首先,外接圆的圆心是三角形三条边的垂直平分线的交点,我们根据圆心到顶点的距离相等,可以列出以下方程:
(x1-x)*(x1-x)+(y1-y)*(y1-y)=(x2-x)*(x2-x)+(y2-y)*(y2-y);
(x2-x)*(x2-x)+(y2-y)*(y2-y)=(x3-x)*(x3-x)+(y3-y)*(y3-y);
2.化简得到:
2*(x2-x1)*x+2*(y2-y1)y=x2^2+y2^2-x1^2-y1^2;
2*(x3-x2)*x+2*(y3-y2)y=x3^2+y3^2-x2^2-y2^2;
令:A1=2*(x2-x1);
B1=2*(y2-y1);
C1=x2^2+y2^2-x1^2-y1^2;
A2=2*(x3-x2);
B2=2*(y3-y2);
C2=x3^2+y3^2-x2^2-y2^2;
即:A1*x+B1y=C1;
A2*x+B2y=C2;
3.最后根据克拉默法则:
x=((C1*B2)-(C2*B1))/((A1*B2)-(A2*B1));
y=((A1*C2)-(A2*C1))/((A1*B2)-(A2*B1));
所以x,y为圆心坐标。
然后最后r^2 = (x1-x)*(x1-x)+(y1-y)*(y1-y)就好了。
C++卡double,换成Java写,用BigDecimal写。
import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*; public class Main { final static BigInteger HUNDRED = BigInteger.valueOf(100); //叉乘求面积
/* private static BigDecimal TriangleArea(POINT pi,POINT pj,POINT pk)
{
BigDecimal num1 = (pj.x.subtract(pi.x)).multiply(pk.y.subtract(pi.y));
BigDecimal num2 = (pk.x.subtract(pi.x)).multiply(pj.y.subtract(pi.y));
BigDecimal num3 = (num1.subtract(num2)).abs();
BigDecimal two = new BigDecimal("2.0");
return num3.divide(two);
}*/
//平方
private static BigDecimal pinfang(BigDecimal x)
{
return x.multiply(x);
} //求长度
private static BigDecimal Dis(POINT a,POINT b)
{
return pinfang(a.x.subtract(b.x)).add(pinfang(a.y.subtract(b.y)));
} public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner cin=new Scanner(System.in);
int T = cin.nextInt();
for(int i=1;i<=T;i++)
{
POINT A = new POINT();
POINT B = new POINT();
POINT C = new POINT();
POINT D = new POINT(); A.x = cin.nextBigDecimal();
A.y = cin.nextBigDecimal();
B.x = cin.nextBigDecimal();
B.y = cin.nextBigDecimal();
C.x = cin.nextBigDecimal();
C.y = cin.nextBigDecimal();
D.x = cin.nextBigDecimal();
D.y = cin.nextBigDecimal(); BigDecimal two = new BigDecimal("2.0");
BigDecimal four = new BigDecimal("4.0"); //求圆心
BigDecimal c1 = ((pinfang(A.x).add(pinfang(A.y))).subtract(pinfang(B.x).add(pinfang(B.y)))).divide(two);
BigDecimal c2 = ((pinfang(A.x).add(pinfang(A.y))).subtract(pinfang(C.x).add(pinfang(C.y)))).divide(two); POINT center = new POINT();
center.x = (c1.multiply((A.y.subtract(C.y)))).subtract(c2.multiply(A.y.subtract(B.y)));
BigDecimal tmp = ((A.x.subtract(B.x)).multiply(A.y.subtract(C.y))).subtract((A.x.subtract(C.x)).
multiply(A.y.subtract(B.y)));
center.x = center.x.divide(tmp);
center.y = (c1.multiply((A.x.subtract(C.x)))).subtract(c2.multiply(A.x.subtract(B.x)));
tmp = ((A.y.subtract(B.y)).multiply(A.x.subtract(C.x))).subtract((A.y.subtract(C.y)).
multiply(A.x.subtract(B.x)));
center.y = center.y.divide(tmp);
//求半径
BigDecimal r2 = pinfang(A.x.subtract(center.x)).add(pinfang(A.y.subtract(center.y)));
//圆心到D点距离
BigDecimal tempr = pinfang(D.x.subtract(center.x)).add(pinfang(D.y.subtract(center.y))); if(tempr.compareTo(r2)<=0)
{
System.out.println ("Rejected");
}
else
{
System.out.println ("Accepted");
}
}
}
} class POINT
{ BigDecimal x;
BigDecimal y;
} /*
41
0 0 1 1 2 0 2 0
-2 0 0 -2 2 0 2 -2
-2 0 0 -2 2 0 0 2
-2 0 0 -2 2 0 1 1
*/
HDU 6206 Apple的更多相关文章
- HDU 6206 Apple (高精确度+JAVA BigDecimal)
Problem Description Apple is Taotao's favourite fruit. In his backyard, there are three apple trees ...
- HDU 6206 Apple【计算几何+高精度Java】
Problem Description Apple is Taotao's favourite fruit. In his backyard, there are three apple trees ...
- hdu 6206 : Apple 【计算几何 + 分数类】
题目链接 比赛时C++上__float128都被卡精度,然后扔给队友用Java的BigDecimal过了 算法不多说,求三角形外心可以参考 维基百科 https://zh.wikipedia.org/ ...
- HDU 6206 Apple ( 高精度 && 计算几何 && 三点构圆求圆心半径 )
题意 : 给出四个点,问你第四个点是否在前三个点构成的圆内,若在圆外输出"Accepted",否则输出"Rejected",题目保证前三个点不在一条直线上. 分 ...
- HDU 4925 Apple Tree(推理)
HDU 4925 Apple Tree 题目链接 题意:给一个m*n矩阵种树,每一个位置能够选择种树或者施肥,假设种上去的位置就不能施肥,假设施肥则能让周围果树产量乘2.问最大收益 思路:推理得到肯定 ...
- hdu 4925 Apple Tree--2014 Multi-University Training Contest 6
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 Apple Tree Time Limit: 2000/1000 MS (Java/Others ...
- HDU 4925 Apple Tree(模拟题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 解题报告:给你n*m的土地,现在对每一块土地有两种操作,最多只能在每块土地上进行两种操作,第一种 ...
- HDU 4925 Apple Tree (瞎搞)
找到规律,各一个种一棵树.或者施肥.先施肥,先种树一样. Apple Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 2621 ...
- 2014多校第六场 1005 || HDU 4925 Apple Tree
题目链接 题意 : 给你一块n×m的矩阵,每一个格子可以施肥或者是种苹果,种一颗苹果可以得到一个苹果,但是如果你在一个格子上施了肥,那么所有与该格子相邻(指上下左右)的有苹果树的地方最后得到的苹果是两 ...
随机推荐
- LeetCode之Weekly Contest 93
第一题:二进制间距 问题: 给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 的 ...
- React 基础知识总结
data-id="1190000016885142" data-license=""> 一.Node.js Node.js并不是一个JavaScript框 ...
- 【php】 phpword下载文件问题
这个问题是在 科锐国际 工作过程中发现的 word文档的名字(有汉字和空格)在windows系统上遍历是查不到文件的,但是在linux系统上市可以的压缩包里面的中文名word文档,如果出现汉字和空格, ...
- zoj 4056
At 0 second, the LED light is initially off. After BaoBao presses the button 2 times, the LED light ...
- Linux学习-什么是 daemon 与服务 (service)
『常驻在记体体中的程序,且可以提供 一些系统或网络功能,那就是服务』.而服务一般的英文说法是『 service 』. 那么 daemon 与 service 有关啰?否则为什么都能够提供 某些系统或网 ...
- foreach ($users as $key=>$value)
1: foreach(array_name as $value) { statement; } 这里的array_name是你要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$ ...
- BZOJ 4368: [IOI2015]boxes纪念品盒
三种路径,左边出去左边回来,右边出去右边回来,绕一圈 绕一圈的路径最多出现一次 那么绕一圈的路径覆盖的点一定是左边半圈的右边和右边半圈的左边 枚举绕一圈的路径的起始点(一定要枚举,这一步不能贪心),更 ...
- 详解Python中的相对导入和绝对导入
Python 相对导入与绝对导入,这两个概念是相对于包内导入而言的.包内导入即是包内的模块导入包内部的模块. Python import 的搜索路径 在当前目录下搜索该模块 在环境变量 PYTHONP ...
- CornerStone使用教程(配置SVN,HTTP及svn简单使用)
1.SVN配置 假设你公司svn地址为:svn://192.168.1.111/svn/ios,用户名:svnserver,密码:123456 1:填写主机地址 2:如果你的主机地址中有端口号,如为1 ...
- PHP smarty模版引擎基本安装
环境: PHP5.2 以上版本 先去官网下载smarty模版引擎的库文件到你的电脑或服务器上 smarty官方网站库文件下载地址: https://www.smarty.net/download 下 ...