利用一张A4纸和卡西欧图形计算器进行建筑高度的测量 利用一张A4纸和卡西欧图形计算器进行建筑高度的测量
2018年04月28日下面介绍只利用一张A4纸和卡西欧图形计算器fx-CG50进行建筑高度的测量的两种方法:
 一.三角法
 原理:利用三角形相似中相应边的比值相等,由已知A4纸高度及可测量出人到纸的距离和人到建筑的距离,进而计算得出建筑的高度。
 操作步骤:以测量京东大厦为例
 第一步:在远离京东大厦的位置,将A4纸竖直置于眼前,前后平移,使得恰好挡住大厦,如下图(考虑到想要让图像比较清晰,图中线段的比例有些失真。比如人的高度及纸张的高度位失真)其中B点为眼睛所在位置,B'点为脚所站立处地面的点,则BB'约为观测员身高,EH为A4纸(长度为297毫米),H'点为竖直放置的A4纸的正下方地面的点,A为大厦顶部,D为大厦底部.
 

第二步:利用A4纸的长度(整张长度及折叠后的长度),测量B'点到H'点的距离即人的眼睛到纸的距离BH和B'点到D点的距离即约为人的眼睛到大厦的距离BD.
 其中:
 1.测得BH大约两张A4纸长,记作600毫米.
 2.由于此时观察者距离大楼较远,用A4纸测量费时费力.故选择先测量自己步长值,再用步长去度量观察者距离大楼的距离.为了尽量获得相对精确的距离,进行如下操作:
 (1)确定自己的步长.为了保证数据尽量准确,选择多次试验得到数据取平均的方法。每次试验均匀的走10步,然后测量长度。实测20组数据如下:
 





(2)用步长测量观察者到大厦距离B'D,实测约为405步,故用209385毫米估计.
 



二.自由落体法
 

操作步骤:以测量京东大厦为例
 第一步:利用卡西欧图形计算器fx-CG50的程序功能,编制时间测定插件,使计算器具备计时功能。
 

第二步:将A4揉成小纸团(减小空气阻力),在京东大厦尽量最高楼处,让其初速度为0自由下落。重复多次,测得平均时间。
 

第三步:将多次测得的时间进行数据分析,计算出平均时间。实际测得平均用时约5秒。
 


附程序源代码:
 1.#include "fxlib.h"  
 2.#include "stdlib.h"
 3.#include "stdio.h"
 4.#include "string.h"
 5.
 6.int second;/*总秒数*/
 7.unsigned char str[21];/*显示字符串变量*/
 8.void timeadd(){
 9.        char ssec[2],smin[2],shour[2],showstr[21];/*showstr为要显示的时间字符串*/
 10.        int sec,min,hour;
 11.        second++;/*总秒数自加*/
 12.        sec=second%60;
 13.        min=(int)(second/60)%60;/*根据总秒数算出时间*/
 14.        hour=(int)(second/3600)%24;
 15.        if(sec<10){sprintf(ssec,"0%d",sec);}else{sprintf(ssec,"%d",sec);}
 16.        if(min<10){sprintf(smin,"0%d",min);}else{sprintf(smin,"%d",min);}/*进位*/
 17.        if(hour<10){sprintf(shour,"0%d",hour);}else{sprintf(shour,"%d",hour);}
 18.        strcpy(showstr,shour);
 19.        strcat(showstr,":");
 20.        strcat(showstr,smin);
 21.        strcat(showstr,":");
 22.        strcat(showstr,ssec);/*连接各个字符串(时分秒)*/
 23.
 24.        locate(1,1);
 25.        PrintRev((unsigned char*)showstr);
 26.        Bdisp_PutDisp_DD();
 27.}
 28.
 29.int AddIn_main(int isAppli, unsigned short OptionNum) {
 30.        unsigned int key;
 31.        int i,j,timerrun=0;/*timerrun是计时器状态*/
 32.        locate(1,1);
 33.        Print((unsigned char*)"Sandyzhang's timer"); 
 34.        for(i=0;i<=100;i++)
 35.        {
 36.                Sleep(5);/*延迟5ms*/
 37.sprintf(str,"loading...%d%%",i);
 38.locate(1,2);
 39.                Print((unsigned char*)str);
 40.                Bdisp_PutDisp_DD();
 41.        }
 42.        Bdisp_AllClr_DDVRAM();
 43.        locate(1,3);Print((unsigned char*)"F1:Start/Stop");
 44.        locate(1,4);Print((unsigned char*)"F2:Clear");
 45.        locate(1,1);Print((unsigned char*)"00:00:00");
 46.        while(1){
 47.                GetKey(&key);
 48.                if(key==30009){
 49.                        if(!timerrun){SetTimer(1,1000,timeadd);timerrun=1;}else{KillTimer(1);timerrun=0;}/*30009是F1键的键代码,按下后计时器计时状态取反*/
 50.        }
 51.                if(key==30010){
 52.                        KillTimer(1);
 53.                        timerrun=0;
 54.                        locate(1,1);Print((unsigned char*)"00:00:00");/*清零*/
 55.          second=0;/*总秒数清零*/
 56.        }
 57.        }
 58.        return 1;
 59.} 
 60.
 61.
 62.#pragma section _BR_Size
 63.unsigned long BR_Size;
 64.#pragma section
 65.#pragma section _TOP
 66.int InitializeSystem(int isAppli, unsigned short OptionNum){
 67.    return INIT_ADDIN_APPLICATION(isAppli, OptionNum);
 68.}
 69.#pragma section
         首页
首页 
             
             
          
 
           
                