码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-07 20:12:15      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:java   算法   数据结构   数学   

/**
 * 功能:在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分。
 * 假定正方形的上下两条边与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;
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:java   算法   数据结构   数学   

原文地址:http://blog.csdn.net/shangqing1123/article/details/47340815

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!