程序员代码面试指南刷题--第九章.判断一个点是否在三角形内部

题目描述

在二维坐标系中,所有的值都是double类型,那么一个三角形可以由3个点来代表,给定3个点代表的三角形,再给定一个点(x, y),判断(x, y)是否在三角形中

输入描述:

输入有四行,每行两个浮点数。

前三行的6个数分别代表三角形的三个顶点的坐标

最后两个数分别表示(x, y)

输出描述:

若(x, y)在三角形中,输出"Yes"

否则输出"No"

示例1
输入
-1.00 0.00
1.50 3.50
2.73 -3.12
1.23 0.23

输出
Yes

解法一:存在误判的

在这里插入图片描述

import java.io.*;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] ss = br.readLine().trim().split(" ");
        double x1 = Double.parseDouble(ss[0]);
        double y1 = Double.parseDouble(ss[1]);
        ss = br.readLine().trim().split(" ");
        double x2 = Double.parseDouble(ss[0]);
        double y2 = Double.parseDouble(ss[1]);
        ss = br.readLine().trim().split(" ");
        double x3 = Double.parseDouble(ss[0]);
        double y3 = Double.parseDouble(ss[1]);
        ss = br.readLine().trim().split(" ");
        double x = Double.parseDouble(ss[0]);
        double y = Double.parseDouble(ss[1]);
        double sum = getArea(x1,y1,x2,y2,x3,y3);
        double a = getArea(x1,y1,x2,y2,x,y);
        double b = getArea(x1,y1,x3,y3,x,y);
        double c = getArea(x2,y2,x3,y3,x,y);
        if(sum==(a+b+c)){
            System.out.print("Yes");
        }else{
            System.out.print("No");
        }
    }
    public static double getArea(double x1,double y1,double x2,double y2,double x3,double y3){
        double l1 = len(x1,y1,x2,y2);
        double l2 = len(x1,y1,x3,y3);
        double l3 = len(x2,y2,x3,y3);
        double p = (l1+l2+l3)/2;
        return Math.sqrt(p*(p-l1)*(p-l2)*(p-l3));
    }
    public static double len(double x1,double y1,double x2,double y2){
        return Math.sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
    }
}

解法二:利用向量积

思路:右手法则 x1 * y2-x2 * y1

import java.io.*;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] ss = br.readLine().trim().split(" ");
        double x1 = Double.parseDouble(ss[0]);
        double y1 = Double.parseDouble(ss[1]);
        ss = br.readLine().trim().split(" ");
        double x2 = Double.parseDouble(ss[0]);
        double y2 = Double.parseDouble(ss[1]);
        ss = br.readLine().trim().split(" ");
        double x3 = Double.parseDouble(ss[0]);
        double y3 = Double.parseDouble(ss[1]);
        ss = br.readLine().trim().split(" ");
        double x = Double.parseDouble(ss[0]);
        double y = Double.parseDouble(ss[1]);
        boolean result = judge(x1,y1,x2,y2,x3,y3,x,y);
        if(result==true){
            System.out.print("Yes");
        }else{
            System.out.print("No");
        }
    }
    public static boolean judge(double x1,double y1,double x2,double y2,double x3,double y3,double x,double y){
        if(crossProduct(x3-x1,y3-y1,x2-x1,y2-y1)>=0){
            double tmpx = x2;
            double tmpy = y2;
            x2 = x3;
            y2 = y3;
            y3 = tmpx;
            x3 = tmpy;
        }
        if(crossProduct(x2-x1,y2-y1,x-x1,y-y1)<0){
            return false;
        }
         if(crossProduct(x3-x2,y3-y2,x-x2,y-y2)<0){
            return false;
        }
         if(crossProduct(x1-x3,y1-y3,x-x3,y-y3)<0){
            return false;
        }
        return true;
    }
    public static double crossProduct(double x1,double y1,double x2,double y2){
        return x1*y2-x2*y1;
    }
}
在Swing,可以使用Java 2D API的Area类来判断一个点是否在一个三角形内。具体步骤如下: 1. 创建一个Area对象,并将三角形三个顶点作为参数传递给Area类的构造函数,这样Area对象就代表了这个三角形。 2. 创建一个Point2D.Double对象表示待判断的点。 3. 使用contains方法判断这个点是否在Area对象内部,如果在则返回true,否则返回false。 以下是示例代码: ``` import java.awt.geom.Area; import java.awt.geom.Path2D; import java.awt.geom.Point2D; public class TriangleContainsPoint { public static boolean contains(Point2D.Double point, Point2D.Double p1, Point2D.Double p2, Point2D.Double p3) { Path2D.Double path = new Path2D.Double(); path.moveTo(p1.x, p1.y); path.lineTo(p2.x, p2.y); path.lineTo(p3.x, p3.y); path.closePath(); Area area = new Area(path); return area.contains(point); } public static void main(String[] args) { Point2D.Double p1 = new Point2D.Double(0, 0); Point2D.Double p2 = new Point2D.Double(5, 0); Point2D.Double p3 = new Point2D.Double(2.5, 5); Point2D.Double point = new Point2D.Double(2, 2); boolean contains = contains(point, p1, p2, p3); System.out.println(contains); } } ``` 在上面的示例代码,contains方法接收一个待判断的点和三角形三个顶点,首先创建一个Path2D.Double对象表示这个三角形,然后使用Area类将这个Path2D.Double对象转换成一个Area对象,最后使用Area类的contains方法判断判断的点是否在Area对象内部
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值