蓝桥云课Java B组----补充篇----计算几何基础
·
系列专栏:蓝桥杯Java B组
个人主页:个人主页
一、平面上两点距离
- 平面上两点距离一般可分为欧几里得距离和曼哈顿距离
- 已知二维平面上有两个点(x1, y1),(x2, y2)
- 欧几里得距离:d=sqrt((x1-x2)^2 + (y1-y2)^2),会产生浮点
- 曼哈顿距离:d=|x1-x2| + |y1-y2|,通常用在整数点上
- 有些时候为避免浮点误差,会使用欧几里得距离的平方
代码实现:
//欧几里得距离:
double dist(double x1,double y1,double x2,double y2) {
double dx=x1-x2, dy=y1-y2;//处理出差值方便写代码
return Math.sqrt(dx*dx + dy*dy);
}
//曼哈顿距离:
int dist(int x1,int x2,int y1,int y2) {
int dx=Math.abs(x1-x2),dy=Math.abs(y1-y2);//处理出差值方便写代码
return dx+dy;
}
二、圆的周长和面积
- 对于一个圆,用x,y,r来描述,其中(x, y)为圆心位置,r为半径大小
- 周长公式:C=2*pi*r
- 面积公式:S=pi*r*r
都是人尽皆知的公式,代码实现也不难:
static double pi=3.14;
double C(int r) {//周长
return 2*pi*r;
}
double S(int r) {//面积
return pi*r*r;
}
三、其他基础
1.圆与圆的关系:
- 圆与圆之间关系有相交、相切、相离三种,通过比较两圆心和两圆半径之和的大小可判断
- dist < r1+r2:两圆相交
- dist = r1+r2:两圆相切,注意在判断符号时设定一定的偏差量eps,以避免浮点误差带来的影响:abs(dist - (r1+r2)) < eps
- dist > r1+r2:两圆相离
2.海伦公式:
- 已知一个三角形的三条边分别为a,b,c,设p=(a+b+c)/2,三角形面积为s,则有:
![]()
已知一个三角形的三个点坐标,三角形面积为A,则有:
![]()
3.点到直线距离:
设点A(x1, y1),点B(x2, y2),点C(x3, y3),求点A到直线BC的距离

可以先算出直线斜率k,再套用第二个公式即可
在计算几何中,斜率是非常重要的,但是当直线BC是为竖直时,斜率为无穷,此时斜率将无法处理,需要用到向量:

四、例题讲解
import java.util.*;
public class 计算几何基础 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int t=scan.nextInt();
while(t-->0) {
double x1=scan.nextDouble();
double y1=scan.nextDouble();
double x2=scan.nextDouble();
double y2=scan.nextDouble();
double x3=scan.nextDouble();
double y3=scan.nextDouble();
//海伦公式(第二个)
double S=Math.abs(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2);
System.out.printf("%.2f",S/2);
System.out.println();
}
scan.close();
}
}
import java.util.*;
public class 计算几何基础 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int t=scan.nextInt();
while(t-->0) {
double x1=scan.nextDouble();
double y1=scan.nextDouble();
double x2=scan.nextDouble();
double y2=scan.nextDouble();
double x3=scan.nextDouble();
double y3=scan.nextDouble();
//用向量法
double up=Math.abs((x2-x3)*(y1-y3)-(x1-x3)*(y2-y3));
double down=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double d=up/down;
System.out.printf("%.2f",d);
System.out.println();
}
scan.close();
}
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)