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

题目描述

在二维坐标系中,所有的值是double类型,那么一个矩形可以由四个点来代表,(x1, y1)为最左的点,(x2, y2)为最上的点,(x3, y3)为最下的点,(x4, y4)为最右的点。给定4个点代表的矩形,再给定一个点(x, y),判断(x, y)是否在矩形中

输入描述:

输入有五行,每行两个整数。
对于前四行,第i行的浮点数表示(xi,yix_i, y_ixi​,yi​)
最后一行两个浮点数表示(x, y)

输出描述:

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

否则输出"No"

示例1
输入
2.00 2.50
3.00 5.00
3.00 1.50
4.00 4.00
3.21 3.78

输出
Yes

示例2
输入
2.00 2.50
3.00 5.00
3.00 1.50
4.00 4.00
2333.33 2333333.33

输出
No

解法一:报错(只有那一个例子出错我佛了)

思路: 哪个好心人帮忙看看

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 x4 = Double.parseDouble(ss[0]);
        Double y4 = Double.parseDouble(ss[1]);
        ss = br.readLine().trim().split(" ");
        Double x = Double.parseDouble(ss[0]);
        Double y = Double.parseDouble(ss[1]);
        boolean flag = judge(x1,y1,x2,y2,x3,y3,x4,y4,x,y);
        if(flag==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 x4,double y4,double x,double y){
        int flag = uporDown(x1,y1,x2,y2,x,y);
        if(flag==1||flag==0) return false;
        flag = uporDown(x1,y1,x3,y3,x,y);
        if(flag==-1||flag==0) return false;
        flag = uporDown(x4,y4,x3,y3,x,y);
        if(flag==-1||flag==0) return false;
        flag = uporDown(x4,y4,x2,y2,x,y);
        if(flag==1||flag==0) return false;
        return true;
        
    }
    public static int uporDown(double x1,double y1,double x2,double y2,double x,double y){
        double k = (y2-y1)/(x2-x1);
        double b = y1-k*x1;
        if(y>(k*x+b)) return 1;
        else if(y==(k*x+b)) return 0;
        else return -1;
    }
}

解法二:调整方向

如图
在这里插入图片描述

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 x4 = Double.parseDouble(ss[0]);
        Double y4 = Double.parseDouble(ss[1]);
        ss = br.readLine().trim().split(" ");
        Double x = Double.parseDouble(ss[0]);
        Double y = Double.parseDouble(ss[1]);
        boolean flag = judge(x1,y1,x2,y2,x3,y3,x4,y4,x,y);
        if(flag==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 x4,double y4,double x,double y){
        if(y1==y2){
            return isInside(x1,y1,x4,y4,x,y);
        }
        double l=Math.abs(y4-y3);
        double k=Math.abs(x4-x3);
        double s=Math.sqrt(k*k+l*l);
        double sin=l/s;
        double cos=k/s;
        double x1r=x1*cos+y1*sin;
        double y1r=-x1*sin+y1*cos;
        double x4r=x4*cos+y4*sin;
        double y4r=-x4*sin+y4*cos;
        double xr=x*cos+y*sin;
        double yr=-x*sin+y*cos;
        return isInside(x1r,y1r,x4r,y4r,xr,yr);
    }
         
    public static boolean isInside(double x1,double y1,double x4,double y4,double x,double y){
        if(x<=x1){
            return false;
        }else if(x>=x4){
            return false;
        }else if(y>=y1){
            return false;
        }else if(y<=y4){
            return false;
        }else{
            return true;
        }
    }
    public static int uporDown(double x1,double y1,double x2,double y2,double x,double y){
        double k = (y2-y1)/(x2-x1);
        double b = y1-k*x1;
        if(y>(k*x+b)) return 1;
        else if(y==(k*x+b)) return 0;
        else return -1;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值