P1 : 焦距
一般來說,我們採用針孔相機模型,也就是認為它用到的是小孔成像原理。
在相機坐標系下,一般來說,我們用到的單位長度,不是「米」這樣的國際單位,而是相鄰圖元的長度。而焦距在相機坐標系中的大小,是在影像處理領域的一個非常重要的物理量。
假設我們已經根據相機參數,得到鏡頭的物理焦距大小(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
現在,請您寫一段通用的程式,來求解焦距在相機坐標系中的大小。
第一题,一看很简单。我打算只过小数据的,但是还是错,后来才知道我在格式控制符中printf(".2f", ans+0.005);导致一直错啊,错的我真是伤心。
后来经大神提醒,知道怎么输入了,准备过大数据。
总的来说还是编程水平太差了,输入输出错的一塌糊涂。
用了printf(".2f\n", ans);c语言自动帮你转换进行四舍五入,真的是错的一塌糊涂啊。弄得都不想搞了。。。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
void get_data(double& f, char *fdata){
if(strcmp(fdata, "m") == 0) f *= 1000;
else if(strcmp(fdata, "dm") == 0) f *= 100;
else if(strcmp(fdata, "cm") == 0) f *= 10;
else if(strcmp(fdata, "mm") == 0) f *= 1;
else if(strcmp(fdata, "um") == 0) f *= 0.001;
else if(strcmp(fdata, "nm") == 0) f *= 0.000001;
}
int main()
{
int t;
char fdata[1000], cdata[100], idata[100];
double f, c, i;
scanf("%d", &t);
for(int test = 1; test <= t; test ++){
memset(fdata, 0, sizeof(fdata));
memset(cdata, 0, sizeof(cdata));
scanf("%lf%s", &f, fdata);
scanf("%lf%s", &c, cdata);
scanf("%lf%s", &i, idata);
//printf("%lf %lf %lf\n", f, c, i);
//cout << fdata << cdata << endl;
get_data(f, fdata);
get_data(c, cdata);
//printf("%lf %lf %lf\n", f, c, i);
double ans = (((double)i)*(double)f/(double)c);
printf("Case %d: %.2fpx\n", test, ans);
}
return 0;
}