系列专栏:蓝桥杯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是为竖直时,斜率为无穷,此时斜率将无法处理,需要用到向量

 

四、例题讲解

例题1231 三角形面积

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();
	}
}

例题1286 点到直线距离

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();
	}
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐