这道题目翻译过来就是:
给定两个矩形和每个矩形对角线上两个点的坐标,你必须计算两个矩形的相交部分的面积,矩形的长与宽分别与X轴Y轴平行 。
解题:首先,由分析我们可以知道,给定的矩形对角线可能有俩种,一种是主对角线,一种是副对角线,这里是有些差别的,另外,给定的俩个矩形可能没有重叠的部分,除了这种情况外,其余的情况都是有相交部分的。
下面分析几种情况找到解题方法
第一种情况:
假设A1的坐标为(x1,y1)B1的坐标为(x2,y2)A2的坐标为(x3,y3)B2的坐标为(x4,y4)。
要求阴影部分的面积:
分析易得:
相交面积为:四顶点中y值最大所在矩形对应的边减去(该y值减去另一矩形俩对角顶点中较大y值)乘以四顶点中x值最大所在矩形减去(该x值减去另一矩形俩对角顶点中较大x值)。
即 S(相交)=A2所在的矩形的边长-(x4-x2)*A2所在矩形的边长-(y3-y2)
第二种情况
如果按照第一种情况处理,我们明显可以发现结果不对,只要我们仔细一想,就能发现我们少减了一些东西,四顶点中y值最大所在矩形对应的边减去(该y值减去另一矩形俩对角顶点中较大y值)另外,(当另一矩形中的较小的y坐标减去该矩形的较小y坐标值为正时,我们应该将这部分的长度也减去)乘以四顶点中x值最大所在矩形减去(该x值减去另一矩形俩对角顶点中较大x值)(当另一矩形中的较小的坐标减去该矩形的较小x坐标值为正时,我们应该将这部分的长度也减去)。
对于是否有相交,我们只需要判断四顶点中y值最大所在矩形对应的边减去(该y值减去另一矩形俩对角顶点中较大y值)或者四顶点中x值最大所在矩形减去(该x值减去另一矩形俩对角顶点中较大x值)是否大于0,如果不是,那么这俩个矩形就没有交点。
最后,贴上完整代码:
import java.util.Scanner; public class Main { public static void main(String[]args) { Scanner scanner=new Scanner(System.in); double x1,y1,x2,y2,x3,y3,x4,y4; double x01,y01,x02,y02;//用来保存矩形对角线中大的x坐标和大的y坐标 double x001,y001,x002,y002;//用来保存矩形对角线中小的x坐标和小的y坐标 double xx01,yy01;//用来保存俩个矩形中更大的x坐标和大的y坐标 double len1,wid1,len2,wid2;//用来保存矩形的长度和宽度 double cx,cy; while (scanner.hasNext()) { x1=scanner.nextDouble(); y1=scanner.nextDouble(); x2=scanner.nextDouble(); y2=scanner.nextDouble(); x3=scanner.nextDouble(); y3=scanner.nextDouble(); x4=scanner.nextDouble(); y4=scanner.nextDouble(); x01=x1>x2?x1:x2; y01=y1>y2?y1:y2; x02=x3>x4?x3:x4; y02=y3>y4?y3:y4; x001=x1>x2?x2:x1; y001=y1>y2?y2:y1; x002=x3>x4?x4:x3; y002=y3>y4?y4:y3; len1=Math.abs(x1-x2); wid1=Math.abs(y1-y2); len2=Math.abs(x3-x4); wid2=Math.abs(y3-y4); xx01=x01>x02?x01:x02; yy01=y01>y02?y01:y02; if(xx01==x01&&yy01==y01) { cx=len1-(xx01-x02); cy=wid1-(yy01-y02); if(cx<=0||cy<=0){ System.out.println("0.00");//没有交点,直接输出结果。 }else { if(x002-x001>0) cx=cx-(x002-x001); if(y002-y001>0) cy=cy-(y002-y001); System.out.printf("%.2f",(cx*cy)); System.out.println(); } } if(xx01==x01&&yy01==y02) { cx=len1-(xx01-x02); cy=wid2-(yy01-y01); if(cx<=0||cy<=0){ System.out.println("0.00"); }else { if(x002-x001>0) cx=cx-(x002-x001); if(y001-y002>0) cy=cy-(y001-y002); System.out.printf("%.2f",(cx*cy)); System.out.println(); } } if(xx01==x02&&yy01==y01) { cx=len2-(xx01-x01); cy=wid1-(yy01-y02); if(cx<=0||cy<=0){ System.out.println("0.00"); }else { if(x001-x002>0) cx=cx-(x001-x002); if(y002-y001>0) cy=cy-(y002-y001); System.out.printf("%.2f",(cx*cy)); System.out.println(); } } if(xx01==x02&&yy01==y02) { cx=len2-(xx01-x01); cy=wid2-(yy01-y01); if(cx<=0||cy<=0){ System.out.println("0.00"); }else { if(x001-x002>0) cx=cx-(x001-x002); if(y001-y002>0) cy=cy-(y001-y002); System.out.printf("%.2f",(cx*cy)); System.out.println(); } } } } }
关于输出格式,一直不懂为什么printf中加入\n就会PE,而多加一句System.out.println();就可以AC。