平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。

简介: 题目:平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。 源码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 ...

题目:平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。

源码如下:

 1 #include <iostream>  
 2 #include <string.h>  
 3 #include <stdlib.h>  
 4 #include <stdio.h>  
 5 #include <time.h>  
 6 #include <math.h>  
 7   
 8 #define N 1005  
 9 #define eps 1e-8     //搜索停止条件阀值  
10 #define INF 1e99       
11 #define delta 0.98   //温度下降速度  
12 #define T 100        //初始温度  
13   
14 using namespace std;  
15   
16 int dx[4] = {0, 0, -1, 1};  
17 int dy[4] = {-1, 1, 0, 0};  //上下左右四个方向  
18   
19 struct Point  
20 {  
21     double x, y;  
22 };  
23   
24 Point s[N], t[N];  
25   
26 double cross(Point A, Point B, Point C)    
27 {    
28     return (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x);    
29 }    
30   
31 double multi(Point A, Point B, Point C)    
32 {    
33     return (B.x - A.x) * (C.x - A.x) + (B.y - A.y) * (C.y - A.y);    
34 }    
35   
36 double dist(Point A, Point B)  
37 {  
38     return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));  
39 }  
40   
41 double GetDist(Point A, Point B, Point C)    
42 {    
43     if(dist(A, B) < eps) return dist(B, C);    
44     if(multi(A, B, C) < -eps) return dist(A, C);    
45     if(multi(B, A, C) < -eps) return dist(B, C);    
46     return fabs(cross(A, B, C) / dist(A, B));    
47 }    
48   
49 double GetSum(Point s[], Point t[], int n, Point o)  
50 {  
51     double ans = 0;  
52     while(n--)  
53         ans += GetDist(s[n], t[n], o);  
54     return ans;  
55 }  
56   
57 double Search(Point s[], Point t[], int n, Point &o)  
58 {  
59     o = s[0];      
60     double tem = T;        
61     double ans = INF;  
62     while(tem > eps)  
63     {  
64         bool flag = 1;  
65         while(flag)  
66         {  
67             flag = 0;  
68             for(int i = 0; i < 4; i++)    //上下左右四个方向  
69             {  
70                 Point z;  
71                 z.x = o.x + dx[i] * tem;  
72                 z.y = o.y + dy[i] * tem;  
73                 double tp = GetSum(s, t, n, z);  
74                 if(ans > tp)  
75                 {  
76                     ans = tp;  
77                     o = z;  
78                     flag = 1;  
79                 }  
80             }  
81         }  
82         tem *= delta;  
83     }  
84     return ans;  
85 }  
86   
87 int main()  
88 {  
89     int n;  
90     while(scanf("%d", &n) != EOF)  
91     {  
92         for(int i = 0; i < n; i++)  
93             scanf("%lf %lf %lf %lf", &s[i].x, &s[i].y, &t[i].x, &t[i].y);  
94         Point o;  
95         double ans = Search(s, t, n, o);  
96         printf("%.1lf %.1lf %.1lf\n", o.x, o.y, ans);    
97     }  
98     return 0;  
99 }  

 

您可以考虑给博主来个小小的打赏以资鼓励,您的肯定将是我最大的动力。thx.

微信打赏

微信账号 nzf6698

支付宝打赏

支付宝账号 18979406698


作  者: Angel_Kitty
出  处:http://www.cnblogs.com/ECJTUACM-873284962/
关于作者:潜心机器学习以及信息安全的综合研究。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信
声援博主:如果您觉得文章对您有帮助,可以点击右下角推荐推荐一下该博文。您的鼓励是作者坚持原创和持续写作的最大动力!

目录
相关文章
|
3月前
|
C++
已知线段上某点与起点的距离,求该点的坐标
已知线段上某点与起点的距离,求该点的坐标
38 1
|
3月前
|
算法 C++
平面中判断线段与矩形是否相交
平面中判断线段与矩形是否相交
46 0
|
3月前
|
算法 C++
空间直线与球面相交算法
空间直线与球面相交算法
31 0
|
6月前
|
存储 C++ 容器
[C++] 点到直线的最大、最小距离
[C++] 点到直线的最大、最小距离
100 0
|
算法 Perl
豪斯多夫(Hausdorff)距离
豪斯多夫距离量度度量空间中真子集之间的距离。Hausdorff距离是另一种可以应用在边缘匹配算法的距离,它能够解决SED方法不能解决遮挡的问题。
545 0
|
编译器 C语言 C++
移动距离
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3... 当排满一行时,从下一行相邻的楼往反方向排号。 比如:当小区排号宽度为6时,开始情形如下:
151 1
移动距离
给你n个线段,代表线段的左右端点,问最少删几条线段,使得剩下当中存在一个线段与所有剩下的所有线段都有交集
考虑枚举每一条线段,求以此线段与所有线段都有交集,需要删除的线段数。 那么对于此线段[L,R],右端点小于L的,与它无交集,需要全删掉。同理左端点大于R的线段,也需要都删掉。 那么剩下的问题,就是需要删几个了。
110 0