车轮轴迹 Java实现
来源:互联网 发布:算法帝国 英文封面 编辑:程序博客网 时间:2024/04/29 04:27
问题描述
栋栋每天骑自行车回家需要经过一条狭长的林荫道。道路由于年久失修,变得非常不平整。虽然栋栋每次都很颠簸,但他仍把骑车经过林荫道当成一种乐趣。
由于颠簸,栋栋骑车回家的路径是一条上下起伏的曲线,栋栋想知道,他回家的这条曲线的长度究竟是多长呢?更准确的,栋栋想知道从林荫道的起点到林荫道的终点,他的车前轮的轴(圆心)经过的路径的长度。
栋栋对路面进行了测量。他把道路简化成一条条长短不等的直线段,这些直线段首尾相连,且位于同一平面内。并在该平面内建立了一个直角坐标系,把所有线段的端点坐标都计算好。
假设栋栋的自行车在行进的过程中前轮一直是贴着路面前进的。
图1
上图给出了一个简单的路面的例子,其中蓝色实线为路面,红色虚线为车轮轴经过的路径。在这个例子中,栋栋的前轮轴从A点出发,水平走到B点,然后绕着地面的F点到C点(绕出一个圆弧),再沿直线下坡到D点,最后水平走到E点,在这个图中地面的坐标依次为:(0, 0), (2, 0), (4, -1), (6, -1),前轮半径为1.50,前轮轴前进的距离依次为:
AB=2.0000;弧长BC=0.6955;CD=1.8820;DE=1.6459。
总长度为6.2233。
下图给出了一个较为复杂的路面的例子,在这个例子中,车轮在第一个下坡还没下完时(D点)就开始上坡了,之后在坡的顶点要从E绕一个较大的圆弧到F点。这个图中前轮的半径为1,每一段的长度依次为:
AB=3.0000;弧长BC=0.9828;CD=1.1913;DE=2.6848;弧长EF=2.6224; FG=2.4415;GH=2.2792。
总长度为15.2021。
图2
现在给出了车轮的半径和路面的描述,请求出车轮轴轨迹的总长度。
由于颠簸,栋栋骑车回家的路径是一条上下起伏的曲线,栋栋想知道,他回家的这条曲线的长度究竟是多长呢?更准确的,栋栋想知道从林荫道的起点到林荫道的终点,他的车前轮的轴(圆心)经过的路径的长度。
栋栋对路面进行了测量。他把道路简化成一条条长短不等的直线段,这些直线段首尾相连,且位于同一平面内。并在该平面内建立了一个直角坐标系,把所有线段的端点坐标都计算好。
假设栋栋的自行车在行进的过程中前轮一直是贴着路面前进的。
图1
上图给出了一个简单的路面的例子,其中蓝色实线为路面,红色虚线为车轮轴经过的路径。在这个例子中,栋栋的前轮轴从A点出发,水平走到B点,然后绕着地面的F点到C点(绕出一个圆弧),再沿直线下坡到D点,最后水平走到E点,在这个图中地面的坐标依次为:(0, 0), (2, 0), (4, -1), (6, -1),前轮半径为1.50,前轮轴前进的距离依次为:
AB=2.0000;弧长BC=0.6955;CD=1.8820;DE=1.6459。
总长度为6.2233。
下图给出了一个较为复杂的路面的例子,在这个例子中,车轮在第一个下坡还没下完时(D点)就开始上坡了,之后在坡的顶点要从E绕一个较大的圆弧到F点。这个图中前轮的半径为1,每一段的长度依次为:
AB=3.0000;弧长BC=0.9828;CD=1.1913;DE=2.6848;弧长EF=2.6224; FG=2.4415;GH=2.2792。
总长度为15.2021。
图2
现在给出了车轮的半径和路面的描述,请求出车轮轴轨迹的总长度。
输入格式
输入的第一行包含一个整数n和一个实数r,用一个空格分隔,表示描述路面的坐标点数和车轮的半径。
接下来n行,每个包含两个实数,其中第i行的两个实数x[i], y[i]表示描述路面的第i个点的坐标。
路面定义为所有路面坐标点顺次连接起来的折线。给定的路面的一定满足以下性质:
*第一个坐标点一定是(0, 0);
*第一个点和第二个点的纵坐标相同;
*倒数第一个点和倒数第二个点的纵坐标相同;
*第一个点和第二个点的距离不少于车轮半径;
*倒数第一个点和倒数第二个点的的距离不少于车轮半径;
*后一个坐标点的横坐标大于前一个坐标点的横坐标,即对于所有的i,x[i+1]>x[i]。
接下来n行,每个包含两个实数,其中第i行的两个实数x[i], y[i]表示描述路面的第i个点的坐标。
路面定义为所有路面坐标点顺次连接起来的折线。给定的路面的一定满足以下性质:
*第一个坐标点一定是(0, 0);
*第一个点和第二个点的纵坐标相同;
*倒数第一个点和倒数第二个点的纵坐标相同;
*第一个点和第二个点的距离不少于车轮半径;
*倒数第一个点和倒数第二个点的的距离不少于车轮半径;
*后一个坐标点的横坐标大于前一个坐标点的横坐标,即对于所有的i,x[i+1]>x[i]。
输出格式
输出一个实数,四舍五入保留两个小数,表示车轮轴经过的总长度。
你的结果必须和参考答案一模一样才能得分。数据保证答案精确值的小数点后第三位不是4或5。
你的结果必须和参考答案一模一样才能得分。数据保证答案精确值的小数点后第三位不是4或5。
样例输入
4 1.50
0.00 0.00
2.00 0.00
4.00 -1.00
6.00 -1.00
0.00 0.00
2.00 0.00
4.00 -1.00
6.00 -1.00
样例输出
6.22
样例说明
这个样例对应第一个图。
样例输入
6 1.00
0.00 0.00
3.00 0.00
5.00 -3.00
6.00 2.00
7.00 -1.00
10.00 -1.00
0.00 0.00
3.00 0.00
5.00 -3.00
6.00 2.00
7.00 -1.00
10.00 -1.00
样例输出
15.20
样例说明
这个样例对应第二个图
数据规模和约定
对于20%的数据,n=4;
对于40%的数据,n≤10;
对于100%的数据,4≤n≤100,0.5≤r≤20.0,x[i] ≤2000.0,-2000.0≤y[i] ≤2000.0。
解答:这题是运用了简单的数学知识。把所有车轮经过的路线地面长如图1 即蓝色线条部分 ,然后加上所有凸起拐点的对应弧长,减去所有凹下拐点对应的路面长。
以图1为例
显然车轮轴心距离是AB+弧长BC+CD+DE,其中AB=WF,CD=FV,DE=RT;所以车轮轴心距离为(WF+FG+RT)+弧长BC-(VG+GR)。
具体Java代码如下
对于40%的数据,n≤10;
对于100%的数据,4≤n≤100,0.5≤r≤20.0,x[i] ≤2000.0,-2000.0≤y[i] ≤2000.0。
解答:这题是运用了简单的数学知识。把所有车轮经过的路线地面长如图1 即蓝色线条部分 ,然后加上所有凸起拐点的对应弧长,减去所有凹下拐点对应的路面长。
以图1为例
显然车轮轴心距离是AB+弧长BC+CD+DE,其中AB=WF,CD=FV,DE=RT;所以车轮轴心距离为(WF+FG+RT)+弧长BC-(VG+GR)。
具体Java代码如下
import java.util.Scanner;public class Len {static double pi = 3.1415926;static double sum = 0;public static void main(String []args){Scanner ss = new Scanner(System.in);int n = ss.nextInt();double r = ss.nextDouble();double x[] = new double[n];double y[] = new double[n];for(int i=0;i<n;i++){x[i] = ss.nextDouble();y[i] = ss.nextDouble();}double d = length(x,y,r);String result = String.format("%.2f", d);System.out.println(result);}public static double length(double[] x,double[] y,double r){sum = sum +Math.sqrt((x[1]-x[0])*(x[1]-x[0])+(y[1]-y[0])*(y[1]-y[0]));for(int i=1;i<x.length-1;i++){jisuan(x[i-1],y[i-1],x[i],y[i],x[i+1],y[i+1],r);}return sum;}public static void jisuan(double x1,double y1,double x2,double y2,double x3,double y3,double r){double dl;double cy = (y1+y3)/2;double flagy = cy - y2;//凸起和下凹的标志位double mx = x2 -x1;double my = y2 -y1;double nx = x2 -x3;double ny = y2 -y3;double m = Math.sqrt(mx*mx+my*my);double n = Math.sqrt(nx*nx+ny*ny);sum += n;double cos = (mx*nx+my*ny)/(m*n);double angle = Math.acos(cos);if(flagy>0){dl = 2*r/Math.tan(angle/2);sum -= dl;}else{angle = pi - angle;dl = r*angle;sum += dl;}}}
0 0
- 车轮轴迹 Java实现
- android 实现车轮滚动效果
- 选好”车轮”
- 车轮与产品
- 网络的车轮
- 网络的车轮
- 车轮碰撞体(wheelcollider)
- 做车轮的老人
- 车轮向北 2007.10.02
- 铺车轮捅细舜城站押一何投坑挚澳
- 山寨Besiege(五)车轮
- 微信小程序 车轮之 侧滑
- 关于车轮 utilcode的使用方法
- 中国历史车轮就是这样转动的
- 历史车轮下的ORMapping技术
- 3岁小孩被卷入车轮身亡
- 3岁小孩被卷入车轮身亡
- 梦想之路(二):自造车轮
- POJ 1163 The Triangle
- libtool如何链接静态的c库
- ORACLE面试题
- C++学习之this指针
- java语法学习总结
- 车轮轴迹 Java实现
- struts2-OGNL
- 微信公众平台开发资料小结
- Java容器之HashMap
- MySQL批量SQL插入性能优化
- 测试生活的一些自我感悟
- HIVE 中内连接(JOIN ON)与LEFT SEMI JOIN查询结果不一致的分析
- Oracle体系结构概述
- 非阻塞Connect对于select时应注意问题