题目描述
给定平面上三个不共线的整数点,计算这三个点所构成的三角形面积。输入格式
共 3 行,每行包含两个整数 x_i 和 y_i,表示一个点的坐标。
数据保证:输入的三个点不共线。输出格式
输出一个实数,表示三角形的面积,结果保留两位小数。
import java.util.Scanner;
public class Main {
static class Point {
double x, y;
Point(double a, double b) {//表示平面上的点
x = a;
y = b;
}
}
static class Triangle {//表示三角形
Point a, b, c;
//用三个点(a、b、c)来表示一个三角形,三个点就是三角形的三个顶点
Triangle(Point a, Point b, Point c) {
this.a = a;//第一个顶点
this.b = b;//第二个
this.c = c;//第三个
}
}
static double getArea(Triangle T) {
// TODO: 计算三角形T的面积
//首先计算一条线为底,另一点作为第三点
// TODO: 计算点P到直线L的距离,a、b作为直线点,c作为第三点
double S = 0;
double dis = 0; //高
double dab = 0; //底
if (T.a.x == T.b.x) {//情况1:a和b的坐标相等(边ab是一条竖直线)
dis = Math.abs(T.c.x - T.a.x);
dab = Math.abs(T.b.y - T.a.y);
} else {
//1.计算斜率
double k = (T.b.y - T.a.y) / (T.b.x - T.a.x);//斜率公式:(y2-y1)/(x2-x1)
//2.将直线ab的方程转为一般式 Ax + By + C = 0
// 直线方程:y = kx + b → 变形为:-k x + y - b = 0 → A=-k, B=1, C=-b
double A = -1 * k;
double B = 1;
//3.用点到直线的距离公式计算高(点c到ab的距离)
// 计算C:用点a的坐标代入直线方程,得 b = a.y - k*a.x → C = -b = k*a.x - a.y
double C = k * T.a.x - T.a.y;
dis = Math.abs(A * T.c.x + B * T.c.y + C) / Math.sqrt(A * A + B * B); //高
//4.计算底边ab的长度(两点间距离公式)
dab = Math.sqrt(Math.pow((T.b.y - T.a.y), 2) + Math.pow((T.b.x - T.a.x), 2)); //底
}
S = dab * dis / 2;
return S;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x, y;
x = scanner.nextInt();
y = scanner.nextInt();
Point a = new Point(x, y);
x = scanner.nextInt();
y = scanner.nextInt();
Point b = new Point(x, y);
x = scanner.nextInt();
y = scanner.nextInt();
Point c = new Point(x, y);
Triangle T = new Triangle(a, b, c);
System.out.printf("%.2f%n", getArea(T));
scanner.close();
}
}
遇到的问题:T.c.x是什么意思
T.c.x 是一种 链式访问对象成员 的写法,拆解来看是:通过 Triangle 对象 T 找到它的 Point 类型成员 c,再访问 c 的 x 坐标。这种写法的合法性源于 Java 的 对象成员访问规则,下面详细解释:
第一步:拆解 T.c.x 的含义
从代码结构可知:
T是Triangle类的一个对象(实例),在main方法中通过new Triangle(a, b, c)创建;Triangle类中有一个成员变量c(定义为Point c),表示三角形的第三个顶点(是Point类型的对象);Point类中有一个成员变量x,表示点的 x 坐标(double 类型)。
因此:
T.c→ 访问对象T中的c成员(得到一个Point类型的对象,即三角形的第三个顶点);T.c.x→ 再访问这个Point对象的x成员(得到该顶点的 x 坐标)。
简单说:T.c.x 就是 “三角形 T 的第三个顶点 c 的 x 坐标”。
第二步:为什么能这么写?
这种链式访问的合法性基于两个核心规则:
-
成员变量的可见性
Triangle类中的c和Point类中的x都是 默认访问权限(没有private修饰),且这两个类都是Main类的静态内部类,在同一个Main类范围内可以直接访问成员变量(不需要通过 getter 方法)。 -
对象的嵌套关系
Triangle类的成员c本身是Point类型的对象(不是基本类型),因此可以通过 “外层对象。内层对象。成员变量” 的链式方式访问。这就像 “盒子套盒子”:T是一个大盒子(三角形);- 大盒子里装着小盒子
c(顶点); - 小盒子
c里装着物品x(x 坐标); - 所以可以 “打开大盒子→打开小盒子→拿出 x”(即
T.c.x)。
举例理解
假设:
- 创建三角形
T时,第三个顶点c的坐标是(5, 8)(即new Point(5, 8)); - 那么
T.c就是这个Point(5,8)对象; T.c.x就是5(这个点的 x 坐标);- 同理,
T.c.y就是8(这个点的 y 坐标)。
类似写法
代码中还有很多类似的链式访问,原理完全相同:
T.a.x→ 三角形 T 的顶点 a 的 x 坐标;T.b.y→ 三角形 T 的顶点 b 的 y 坐标;T.a.x == T.b.x→ 判断顶点 a 和 b 的 x 坐标是否相等(用于判断边 ab 是否是竖直线)。
总结
T.c.x 是通过 对象。成员对象。成员变量 的链式方式,访问 “三角形 T 的第三个顶点 c 的 x 坐标”。这种写法之所以合法,是因为:
- 类的成员变量具有可访问性(默认权限下,同一类内可直接访问);
Triangle类的成员c是Point类型的对象,支持进一步访问其内部成员x。
这是 Java 中访问嵌套对象成员的常规方式,广泛用于处理 “包含关系” 的对象(如 “三角形包含点,点包含坐标”)
884

被折叠的 条评论
为什么被折叠?



