题目描述
平面直角坐标系中有一个三角形, 请你求出它的面积。
输入描述
第一行输入一个 T ,代表测试数据量.
每组测试数据输入有三行,每行一个实数坐标 (x,y) 代表三角形三个顶点。
1≤T≤10^3, −10^5≤x,y≤10^5
输出描述
输出一个实数表示三角形面积。结果保留2位小数,误差不超过 10^(−2)
输入输出样例
示例 1
输入
2 0 1 1 0 1 1 0 0 1 1 2 2
输出
0.50 0.00
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
目录
前言
一、问题分析
二、计算技巧
三、代码
四、有缺点的示范
总结
前言
这是一道计算机几何基础题,难度为简单,但同样也会有很多人做错,绝大多数人的会存在的误区:
1. 使用传统的三角形面积求解公式:底*高/2
2. 使用向量,向量夹角求解
这样做的思路没错,但仅限于手工计算方便吧,使用计算机计算就会出现计算精度和误差的问题,从而导出输出结果错误。
对于数学能力比较好的人,掌握计算技巧,相信能很快就做出来了。
一、问题分析
一共有T个三角形,每个三角形都只知道三个顶点的坐标,需要分别计算各个三角形的面积并分行输出计算结果。
数据规模:T最大为10^3,坐标的范围为[-10^5,10^5],这个规模的数据可以放心计算,问题不大,完全可以很好的控制在1s内程序运行完成。
二、计算技巧
计算公式:
三个坐标点:(x1,y1),(x2,y2),(x3,y3)
面积 2S = Math.abs(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2);
S = S/2
是否有印象?这是我能想到最简单和最有效的计算公式了,忘记的小伙伴可以去百度温习一下这公式
三、代码
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int N = scan.nextInt();for(int i=0;i<N;i++){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.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//测试数据的组数int T = scan.nextInt();//3*T组三角形顶点的坐标 每三个坐标(x,y)为一个三角形int[][] a = new int[3*T][2];for(int i=0; i<3*T; i++){a[i][0] = scan.nextInt();a[i][1] = scan.nextInt();}scan.close();//求三角形的面积 底d*高h/2for(int i=0; i<3*T; i += 3){//知道三个顶点坐标,使用向量求解三角形面积S = 1/2*|AB|*|AC|*sinx//三个顶点 按顺序默认编号为A、B、Cdouble ABx = a[i+1][0] - a[i][0];double ABy = a[i+1][1] - a[i][1];double ACx = a[i+2][0] - a[i][0];double ACy = a[i+2][1] - a[i][1];double AB = Math.sqrt( (ABx*ABx + ABy*ABy));double AC = Math.sqrt((ACx*ACx + ACy*ACy));double cosx = (ABx*ACx + ABy*ACy)/(AB*AC);double sinx = Math.sqrt((1-cosx*cosx));double S = 0.50*AB*AC*sinx;System.out.printf("%.2f\n",S);}}
}
总结
学习算法,对于数学学的好的人可以得心应手,逻辑思维能力很重要,掌握计算技巧,往往比暴力计算更有效和更省时