平面最近2点距离

#include<iostream>
#include<float.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct node {
	double x,y;
	int i;
};
int change[1005];
double dx1,dy1,dx2,dy2;
bool cmp(node m,node n) {
	return m.x<n.x;
}
double dis(node p1,node p2) {
	double s=(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
	return sqrt(s);
}
int point1=-1,point2=-1;//如果输出-1代表只有一个点
void merge(node A[],int x,int y,int m,int n) {
	int a=x;
	int b=m;
	int cnt=x;
	node *t=new node[n-x+1];//辅助排序的数组

	for(int i=x; i<=n; i++) {
		t[i-x].x=A[i].x;
		t[i-x].y=A[i].y;
		t[i-x].i=A[i].i;
	}
	while(a<=y&&b<=n) {
		if(t[a-x].y>t[b-x].y) {
			A[cnt].x=t[b-x].x;
			A[cnt].y=t[b-x].y;
			A[cnt].i=t[b-x].i;
			change[b]=cnt;//把cnt变为b
			cnt++;
			b++;
		} else {
			A[cnt].x=t[a-x].x;
			A[cnt].y=t[a-x].y;
			A[cnt].i=t[a-x].i;
			change[a]=cnt;//把cnt变为a
			cnt++;
			a++;
		}
	}
	while(a<=y) {
		A[cnt].x=t[a-x].x;
		A[cnt].y=t[a-x].y;
		A[cnt].i=t[a-x].i;
		change[a]=cnt;//把a变为cnt
		cnt++;
		a++;
	}
	while(b<=n) {
		A[cnt].x=t[b-x].x;
		A[cnt].y=t[b-x].y;
		A[cnt].i=t[b-x].i;
		change[b]=cnt;//把b变为cnt
		cnt++;
		b++;
	}//cout<<"heoo";
	delete []t;
}
double mindis(node point[],int left,int right) {
	if(left==right) {
		return DBL_MAX;
	}
//else if(right-left==1) {
//		point1=left;
//		point2=right;
//		return dis(point[left],point[right]);
//	}
	else {
		int mid=(left+right)/2;
		double d1=mindis(point,left,mid);
		int p1=point1,p2=point2;
		double d2=mindis(point,mid+1,right);
		int p3=point1,p4=point2;
		double dmin=min(d1,d2);
		if(d1<d2) {
			point1=p1;
			point2=p2;
		} else {
			point1=p3;
			point2=p4;
		}
		merge(point,left,mid,mid+1,right);//按y递增排序
//		for(int i=left; i<=right; i++) {
//			cout<<point[i].y<<" ";
//		}
//		cout<<endl;
		point1=change[point1];
		point2=change[point2];
		for(int i=left; i<=right; i++) {
			for(int j=i+1; j<left+10&&j<=right; j++) {
				double dd=dis(point[i],point[j]);
				//	cout<<dd<<endl;
				if(dd<dmin) {
					dmin=dd;
					point1=i;
					point2=j;
					//cout<<i<<" "<<j<<endl;
				}
			}
		}
		cout<<"point1和2:"<<point1<<' '<<point2;
		dx1=point[point1].x;
		dy1=point[point1].y;
		dx2=point[point2].x;
		dy2=point[point2].y;
		cout<<"dx1:"<<dx1<<" "<<dy1 ;
		cout<<"dx2:"<<dx2<<" "<<dy2 ;
		cout<<"hello"<<endl;
		return dmin;

	}
}
int main() {
	int n=8;
	node point[n];
	point[0].x=-4;
	point[0].y=1;
	point[0].i=0;
	point[1].x=-3;
	point[1].y=2;
	point[1].i=1;
	point[2].x=-2;
	point[2].y=4;
	point[2].i=2;
	point[3].x=-2.8;
	point[3].y=2.4;
	point[3].i=3;
	point[4].x=1;
	point[4].y=4;
	point[4].i=4;
	point[5].x=2;
	point[5].y=2;
	point[5].i=5;
	point[6].x=2.5;
	point[6].y=1.5;
	point[6].i=6;
	point[7].x=4;
	point[7].y=4;
	point[7].i=7;
	sort(point,point+n,cmp);
	double d=mindis(point,0,7);
//	for(int i=0; i<=7; i++) {
//			cout<<i<<" "<<point[i].x<<" "<<point[i].y<<endl;
//		}
	//cout<<"分别是"<<"("<<dx1<<","<<dy1<<")"<<"和"<<"("<<dx2<<","<<dy2<<")"<<"最短距离是";
	cout<<point[point1].i<<": "<<"("<<point[point1].x<<","<<point[point1].y<<")"<<endl;
	cout<<point[point2].i<<": "<<"("<<point[point2].x<<","<<point[point2].y<<")"<<endl;
	cout<<"最小距离为:"<<d; 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值