折线中点

给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一条折线。  

请你求出这条折线的中点坐标。

Input

第一行包含一个整数N。 (2 <= N <= 100)  

以下N行每行包含两个整数Xi, Yi代表Pi的坐标。(0 <= Xi, Yi <= 10000)

Output

输出折线段的中点坐标。坐标保留一位小数。

Sample Input
3  
0 0   
30 30  
40 20
Sample Output
20.0 20.0


刚开始死活不知道什么是折线的中点,后来看了样例才感觉应该是到两个端点距离相等的点,所以我先求出整个折线的长度取一半赋给half,在从第一个点开始找,如果当前两个点的距离小于half,那么half-=该距离,如果小于就说明该中点一定在当前两个点之间,所以根据三角函数求出half对应的两边,在根据前一个点和后一个点的位置关系,来决定前一个点的坐标是加上还是减去half对应的长度



#include <bits/stdc++.h>


using namespace std;


const int inf = 110;


int po[inf][2];
int main()
{
    int num;
    scanf("%d", &num);
    double x,y;
    double len = 0;
    for(int i = 0; i < num; i ++){
        scanf("%d %d", &po[i][0], &po[i][1]);
        if(i >= 1){
            len += sqrt((po[i][0] - po[i - 1][0])* (po[i][0] - po[i - 1][0]) + (po[i][1] - po[i - 1][1]) * (po[i][1] - po[i - 1][1]));
        }
    }
    double half = len / 2.0;
    for(int i = 0; i < num - 1; i ++){
        double dis = sqrt((po[i][0] - po[i + 1][0]) * (po[i][0] - po[i + 1][0])+(po[i][1] - po[i + 1][1]) * (po[i][1] - po[i + 1][1]));
        if(half > dis){
            half -= dis;
        }else {
            double addx,addy;
            addx = half * (abs(po[i][0] - po[i + 1][0]) / sqrt((po[i][0] - po[i + 1][0]) * (po[i][0] - po[i + 1][0])+(po[i][1] - po[i + 1][1]) * (po[i][1] - po[i + 1][1])));
            addy = half * (abs(po[i][1] - po[i + 1][1]) / sqrt((po[i][0] - po[i + 1][0]) * (po[i][0] - po[i + 1][0])+(po[i][1] - po[i + 1][1]) * (po[i][1] - po[i + 1][1])));
            if(po[i + 1][0] < po[i][0]){
                x = po[i][0] - addx;
            }else x = po[i][0] + addx;
            if(po[i + 1][1] < po[i][1]){
                y = po[i][1] - addy;
            }else y = po[i][1] + addy;
            break;
        }
    }
    printf("%.1f %.1f\n",x, y);
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值