您的位置:首页 > 其它

9.7数学与概率(三)——在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分

2015-08-07 16:02 555 查看
/**

* 功能:在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分。

* 假定正方形的上下两条边与x轴平行。

*/

/**
* 考虑:
* 线的准确含义,可能性有:
* 		1)由斜率和y轴截距确定;
* 		2)由这条边上的任意两点确定;
* 		3)线段,以正方形的边作为起点和终点。
*
* 假设:这条线的端点应该落在正方形的边上。
* 思路:要将两个正方形对半分,这条线必须连接两个正方形的中心点。
*/

public class Square {

//正方形的四条边
int left;
int right;
int top;
int bottem;
int size;

public static void main(String[] args) {
// TODO Auto-generated method stub

}

//得到正方形的中心点的位置
public Point getMiddle(){
return new Point((this.left+this.right)/2.0,(this.top+this.bottem)/2);
}

//返回线段mid1和mid2的线段与square2的边相交的点,即从mid1到mid2画一条线,一直延伸置碰到square2的靠外的那条边。
public Point extend(Point mid1,Point mid2,int size){
//确定线段mid1->mid2的方向
int xdir=mid1.x<mid2.x?1:-1;
int ydir=mid1.y<mid2.y?1:-1;

//如果mid1和mid2的x坐标相同,计算斜率时,会抛出零异常,做特别处理
if(mid1.x==mid2.y)
return new Point(mid2.x,mid2.y+ydir*size/2.0);

//计算线段的斜率
double slope=(mid2.y-mid1.y)/(mid2.x-mid1.x);
double x1=0;
double y1=0;

//计算相交点,注意斜率的取值
if(Math.abs(slope)==1){
x1=mid2.x+xdir*size/2.0;
y1=mid2.y+ydir*size/2.0;
}else if(Math.abs(slope)<1){
x1=mid2.x+xdir*size/2.0;
y1=mid2.y+slope*ydir*(size/2.0);//注意方向
}else if(Math.abs(slope)>1){
x1=mid2.x+slope*xdir*(size/2.0);
y1=mid2.y+ydir*size/2.0;
}
return new Point(x1,y1);
}

public MyLine cut(Square other){
//计算两个中心点之间的线段与正方形的边相交的位置
Point point1=extend(this.getMiddle(),other.getMiddle(),other.size);
Point point2=extend(this.getMiddle(),other.getMiddle(),-other.size);
Point point3=extend(other.getMiddle(),this.getMiddle(),this.size);
Point point4=extend(other.getMiddle(),this.getMiddle(),-this.size);

//找出线段的起点和终点
Point start=point1;
Point end=point1;
Point[] points={point1,point2,point3};
for(int i=0;i<points.length;i++){
if(points[i].x<start.x||points[i].x==start.x&&points[i].y<start.y)
start=points[i];
else if(points[i].x>end.x||points[i].x==end.x&&points[i].y>end.y)
end=points[i];
}

return new MyLine(start,end);
}

}

class MyLine{
Point start;
Point end;
public MyLine(Point start,Point end){
this.start=start;
this.end=end;
}
}

class Point{
double x;
double y;
public Point(double x,double y){
this.x=x;
this.y=y;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: