package org.example.od1;
import java.util.Scanner;
/*
【矩形绘制】实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除,当新绘制的矩形与之前的图形重叠时,对图形取并集;当新擦除的矩形与之前的图形重叠时,
对图形 取差集。给定一系列矩形的绘制和擦除操作,计算最终图形的面积。
绘图模块采用二维坐标系,输入第一行为操作的数量N,接下来的N行格式为:
d x1 y1 x2 y2,d表示进行绘制操作,(x1, y1)为矩形左上角坐标,(x2, y2)为矩形右下角坐标,或者e x1
y1 x2 y2,e表示进行擦除操作,(x1, y1)为矩形左上角坐标,(x2, y2)为矩形右下角坐标
坐标为整数,且数据范围为[-100, 100],用例保证坐标有效
输出描述:
输出最终图形的面积
示例1:
输入
2
d 0 2 2 0
d -1 1 1 -1
输出
7
//解题思路:
先判断两个矩形是不是相交
相交需要减去相交部分面积
不相交直接相加
*/
public class od1_3 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
double[][] x=new double[4][2];
int n=Integer.valueOf(sc.nextLine());
for (int i = 0; i < n; i++) {
//初始化坐标数据
init(x);
//判断相交
boolean s=isXiangjiao(x);
//相交求交面积
if (s){
//先不考虑包含关系
//求交面积
double s1= Math.abs(area(x));
double st=Math.abs(areaT(x));
System.out.println(st-s1);
}else {
double st=areaT(x);
System.out.println(st);
}
}
}
private static double areaT(double[][] x) {
double s1=(x[1][0]-x[0][0])*(x[1][1]-x[0][1]);
double s2=(x[3][0]-x[2][0])*(x[3][1]-x[2][1]);
return s1+s2;
}
private static double area(double[][] x1) {
if (( x1[3][0]>x1[0][0]
&&x1[3][0]<x1[1][0]&&
x1[2][1]>x1[1][1]&&
x1[2][1]<x1[0][1])){
return (x1[3][0]-x1[0][0])*(x1[2][1]-x1[1][1]);
}else {
return (x1[1][0]-x1[2][0])*(x1[0][1]-x1[2][1]);
}
}
private static void init(double[][] x) {
Scanner sc=new Scanner(System.in);
for (int j = 0; j < 4; j++) {
x[j][0]=sc.nextDouble();
x[j][1]= sc.nextDouble();
}
}
//判断相交
private static boolean isXiangjiao(double[][] x1) {
if (( x1[3][0]>x1[0][0]
&&x1[3][0]<x1[1][0]&&
x1[2][1]>x1[1][1]&&
x1[2][1]<x1[0][1])||
(
x1[2][0]>x1[0][0]
&&x1[2][0]<x1[1][0]&&
x1[3][1]>x1[1][1]&&
x1[3][1]<x1[0][1])){
return true;
}
return false;
}
}
刷题3:矩形绘制
最新推荐文章于 2024-05-31 10:46:10 发布