牛客算法基础noob73 三角形面积

题目描述
给定平面上三个不共线的整数点,计算这三个点所构成的三角形面积。

输入格式
共 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 坐标”。

第二步:为什么能这么写?

这种链式访问的合法性基于两个核心规则:

  1. 成员变量的可见性Triangle 类中的 c 和 Point 类中的 x 都是 默认访问权限(没有 private 修饰),且这两个类都是 Main 类的静态内部类,在同一个 Main 类范围内可以直接访问成员变量(不需要通过 getter 方法)。

  2. 对象的嵌套关系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 坐标”。这种写法之所以合法,是因为:

  1. 类的成员变量具有可访问性(默认权限下,同一类内可直接访问);
  2. Triangle 类的成员 c 是 Point 类型的对象,支持进一步访问其内部成员 x

这是 Java 中访问嵌套对象成员的常规方式,广泛用于处理 “包含关系” 的对象(如 “三角形包含点,点包含坐标”)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值