2014编程之美初赛-焦距

描述

一般来说,我们采用针孔相机模型,也就是认为它用到的是小孔成像原理。

在相机坐标系下,一般来说,我们用到的单位长度,不是“米”这样的国际单位,而是相邻像素的长度。而焦距在相机坐标系中的大小,是在图像处理领域的一个非常重要的物理量。

假设我们已经根据相机参数,得到镜头的物理焦距大小(focal length),和相机胶片的宽度(CCD width),以及照片的横向分辨率(image width),则具体计算公式为:

Focal length in pixels = (image width in pixels) * (focal length on earth) / (CCD width on earth)

比如说对于Canon PowerShot S100, 带入公式得

Focal length in pixels = 1600 pixels * 5.4mm / 5.27mm = 1639.49 pixels

现在,请您写一段通用的程序,来求解焦距在相机坐标系中的大小。

 

输入

多组测试数据。首先是一个正整数T,表示测试数据的组数。

每组测试数据占一行,分别为

镜头的物理焦距大小(focal length on earth)

相机胶片的宽度(CCD width on earth)

照片的横向分辨率大小(image width in pixels),单位为px。

之间用一个空格分隔。

 

输出

每组数据输出一行,格式为“Case X: Ypx”。 X为测试数据的编号,从1开始;Y为焦距在相机坐标系中的大小(focallength in pixels),保留小数点后2位有效数字,四舍五入取整。

 

数据范围

对于小数据:focal length on earth和CCD width on earth单位都是毫米(mm)

对于大数据:长度单位还可能为米(m), 分米(dm), 厘米(cm), 毫米(mm), 微米(um),纳米(nm)

1 2
2 5.4mm 5.27mm 1600px
3 5400um 0.00527m 1600px
输入用例
Case 1: 1639.47px
Case 2: 1639.47px
输出

 

      最近刚上手编程,本着学习的态度参加了这次的编程之美比赛,二三两题看不懂,第一题焦距做的也是波波折折,到动手的时候才发现自己欠缺的实在太多,以后应该多练手。犯了几个错误:1.单位转换弄反了; 2.之前写过一个大整数运算的类,这次本想直接套用,到后来才意识到是浮点运算; 3.感觉代码对大数还是感到无力。

 

      学到几点:

            1.cin与空格 通常,运算符'>>'将忽略空格,读入后面与变量相对应的值,这样一组用例含多个变量即可用空格隔开;

            2.字符串转数字,这里写的比较全<转>http://www.cnblogs.com/processakai/archive/2011/06/24/2089348.html

     

      代码如下。菜鸟一只,欢迎指正错误。

/*2014-4-19
描述

一般来说,我们采用针孔相机模型,也就是认为它用到的是小孔成像原理。

在相机坐标系下,一般来说,我们用到的单位长度,不是“米”这样的国际单位,而是相邻像素的长度。而焦距在相机坐标系中的大小,是在图像处理领域的一个非常重要的物理量。

假设我们已经根据相机参数,得到镜头的物理焦距大小(focal length),和相机胶片的宽度(CCD width),以及照片的横向分辨率(image width),则具体计算公式为:

Focal length in pixels = (image width in pixels) * (focal length on earth) / (CCD width on earth)

比如说对于Canon PowerShot S100, 带入公式得

Focal length in pixels = 1600 pixels * 5.4mm / 5.27mm = 1639.49 pixels

现在,请您写一段通用的程序,来求解焦距在相机坐标系中的大小。
*/

#include <iostream>
#include <string>
#include "stdlib.h"

using namespace std ;

double ConvertStrToDouble( string &str )
{
    int len = str.length() ; //原始字符串长度,含单位 
    int i ; 
    int flag ; //判别单位标识 
    double data ; //返回的浮点数 
    char head[30] ; //将string类中字符转储,以便使用atof函数进行字符串向浮点数的转换 
    
    for( i = 0 ; i < len ; i++ )
    {
        head[i] = str[i] ;
    }
    head[i] = '\0' ;
     
    data = atof( head ) ;
    
    flag = str[len-2] ;
    
    if( flag == 'n' ) //nm 
    {
        data = data / 1000000 ;          
    }
    else if( flag == 'u') //um
    {
        data = data / 1000 ;
    }
    else if( flag == 'd' ) //dm
    {
        data = data * 100 ;
    }
    else if( flag == 'c' ) //cm
    {
        data = data * 10 ;
    }
    else if( flag == 'm' ) //mm
    {
    }
    else if( flag == 'p' ) //px
    {
    }
    else //m
    {
        data = data * 1000 ;
    } //if
    
    return data ;
}

int main(int argc, char* argv[])
{
    string str1 , str2 , str3 ;
    int T , S ;//数据组数 
    double d1 , d2 , d3 , res ;
       
    cin>>T;
    S = T ;
    
    while( T-- )
    {
        cin>>str1>>str2>>str3 ;
        
        d1 = ConvertStrToDouble( str1 ) ;
        d2 = ConvertStrToDouble( str2 ) ;
        d3 = ConvertStrToDouble( str3 ) ;
        
        res = d1 * d3 / d2 ;
        
        
        printf( "Case %d: %.2fpx\n" , S-T , res ) ;
    }//while(T--) 
    
    return 0 ;
}

 

 

posted on 2014-04-19 18:02  爱吃牛的Luke  阅读(187)  评论(0编辑  收藏  举报

导航