北航物理实验E04——Code

物理实验E04:声源定位和GPS模拟,纠结了好久,竟然还要交数据处理的源程序
程序倒不难,关键是不知道数据怎么处理的话就……于是我就杯具了……
网上竟然没有什么现成的程序,看样大家还不够团结啊~
贴在这里,完全开源,请遵守GPL协议,造福后人……

/*
 *ID:38211214
 *Program:声源定位
 */

/*
 *in.txt
 * 45.4  73.7     0  42.7
 *    0  55.0 107.8 126.3
 *100.2 112.0     0  25.8
 *106.0  78.7  53.0     0
 *    0  34.6   9.3  34.6
 *    0  25.6  74.0  85.5
 * 81.5  52.6  50.1     0
 *    0  62.3 134.8 151.6
 *  1.3     0  94.3  91.6
 */

/*
 *out.txt
 *( 53.29,153.49)
 *( 60.26,393.04)
 *( 98.92, 49.82)
 *(254.10,103.05)
 *( 89.57,364.71)
 *( 98.04,317.42)
 *(249.78,142.83)
 *( 50.46,403.15)
 *(151.00,405.37)
 */

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

const double sensor_x[4] = {   0, 298, 0, 298};  //传感器横坐标
const double sensor_y[4] = { 446, 446, 0,   0};  //传感器纵坐标
const double c = 2970000; //常数,声音的传播速度,单位"mm/s"
const double pi = acos(-1.0);  //常数π
double det_t[4] = {0};  //时间间隔
double A, B, D, phi;  //计算公式中间量A, B, D, Φ
double radius, theta;  //声源坐标,极坐标表示(r,θ)
double source_x, source_y;  //声源坐标,直角坐标表示 

void cal(int sign, double t1, double t2, double x1, double y1, double x2, double y2, double px, double py)  //计算公式的实现
{
    double det1 = c * t1, det2 = c * t2;

    //中间量的计算
    A = x2 * (x1 * x1 + y1 * y1 - det1 * det1) - x1 * (x2 * x2 + y2 * y2 - det2 * det2);
    B = y2 * (x1 * x1 + y1 * y1 - det1 * det1) - y1 * (x2 * x2 + y2 * y2 - det2 * det2);
    D = det1 * (x2 * x2 + y2 * y2 - det2 * det2) - det2 * (x1 * x1 + y1 * y1 - det1 * det1);
    phi = atan(B / A);
    theta = phi + sign * acos(D / sqrt(A * A + B * B));
    radius = (x1 * x1 + y1 * y1 - det1 * det1 ) / (2 * ( x1 * cos(theta) + y1 * sin(theta) + det1 ));

    //最终结果及输出
    source_x = cos (theta) * radius;
    source_y = sin (theta) * radius;
    cout < <fixed <<setprecision(2)
        <<'(' <<setw(6) <<source_x + px << ',' <<setw(6) <<source_y + py <<')' <<endl;
}    

int main()
{
    freopen("in.txt", "r", stdin);  //打开输入文件
    freopen("out.txt", "w", stdout);  //打开输出文件
    for (int i = 0; i < 9; ++ i)
    {
        for (int j = 0; j < 4; ++ j)  //数据读入
        {
            cin >>det_t[j];
            det_t[j] /= 1e6;
        }
        for (int j = 0; j < 4; ++ j)
        {
            if (fabs(det_t[j] - 0) < 1e-6)  //判断最先到达的传感器编号
            {
                switch (j)
                {
                    case 0:
                        cal(-1, det_t[1], det_t[3], 298, 0, 298, -446, 0, 446);
                        break;
                    case 1:
                        cal(-1, det_t[0], det_t[2], -298, 0, -298, -446, 298, 446);
                        break;
                    case 2:
                        cal(1, det_t[0], det_t[1], 0, 446, 298, 446, 0, 0);
                        break;
                    case 3:
                        cal(1, det_t[0], det_t[1], -298, 446, 0, 446, 298, 0);
                        break;
                }
            }
        }
    }
    return 0;
}
/*
 *ID:38211214
 *Program:GPS仿真
 */

/*
 *in.txt
 * 87.7 113.7  88.1  85.0 224.0
 * 89.9  67.7 124.9 203.0 303.0
 *147.5 123.5  95.9 240.0 109.0
 *112.2  91.3 106.0 208.0 216.0
 *112.4 140.7  56.0  49.0 137.0
 * 90.3  79.9 112.1 179.0 269.0
 *128.8  88.7 121.0 272.0 209.0
 * 67.2  62.5 142.3 158.0 369.0
 * 94.3 111.3  98.2 128.0 228.0
 * 78.5  79.8 118.5 149.0 297.0
 */

/*
 *out.txt
 *( -9.51,458.73)
 *(313.00,460.32)
 *( -8.63, -7.67)
 */

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

const double c = 2970;  //常数:声音传播速度
double det_t[3][10] = {0};  //三个接收器的时间差
double trans_x[10],trans_y[10];  //发送器(transmitter)坐标;
double a1, a2, a3, a4, b1, b2, mult, D, E;  //算法过程中间量 

void gps(double t[], double x1, double y1, int num)
{
    D = E = 0;
    do
    {
        a1 = a2 = a3 = a4 = b1 = b2 = 0;
        for (int i = 0; i < 10; ++ i)
        {
            double m1 = trans_x[i] * 1e-3 - x1;
            double m2 = y1 - trans_y[i] * 1e-3;
            double m3 = (c * t[i] * 1e-6) * (c * t[i] * 1e-6);
            a1 = a1 - 3 * (trans_x[i] * 1e-3 - x1) * (trans_x[i] * 1e-3 - x1) + m2 * m2 - m3;
            a2 = a2 + 2 * m1 * m2;
            a3 = a2;
            a4 = a4 - 3 * (y1 - trans_y[i] * 1e-3) * (y1 - trans_y[i] * 1e-3) + m1 * m1 - m3;
            b1 = b1 + (m1 * m1 + m2 * m2 - m3) * (- m1);
            b2 = b2 + (m1 * m1 + m2 * m2 - m3) * m2;
        }
        mult = a3 / a1;
        a4 = a4 - a2 * mult;
        b2 = b2 - b1 * mult;
        E = b2 / a4;
        D = (b1 - a2 * E) / a1;
        x1 += D;
        y1 += E;
    }
    while  (D * D + E * E <= 1e-9);  //达到精度之后停止

    cout <<fixed <<setprecision(2)
        <<'(' <<setw(6) <<x1 * 1e3 <<',' <<setw(6) <<y1 * 1e3 <<')' <<endl;
}    

int main()
{
    freopen("in.txt", "r", stdin);  //打开输入文件
    freopen("out.txt", "w", stdout);  //打开输出文件

    for (int i = 0; i < 10; ++ i)  //读入数据
        cin >>det_t[0][i] >>det_t[1][i] >>det_t[2][i] >>trans_x[i] >>trans_y[i];

    //三次调用计算过程
    gps(det_t[0],   0, 0.45, 1);
    gps(det_t[1], 0.3, 0.45, 2);
    gps(det_t[2],   0,    0, 3);

    return 0;
}

浑浑噩噩ing

[废话当前]RSS订阅的问题似乎终于解决了,看到这篇post的朋友还望告之确认一下,谢谢啦~~

最近浑浑噩噩的,一直没闲着,回头想想却似乎只是在给自己的颓废找借口……小结一下

1、Golosim算法可视化开发,混了个二作的冯如杯项目,比较理论的一个东东,无线网络,随机路点模型、Ad Hoc,貌似很高深,但这次做的只是做了一个UI,加了自己用OpenGL开发的可视化模型,又用数据库实现了数据对比功能。

2、基于Google Earth的北航3D建模,没有混到作者名单的一个冯如杯项目(囧),和大一几个小朋友一起用sketchup建模,我做的是图书馆,效果还算不错。这个项目不是仅仅为冯如杯准备的,希望能很好的延续下去。

3、Google Camp,不得不承认在社长这个位置上我越来越觉得自己做的有问题了,胡乱的忙了好多,却没有很好的调动大家的积极性,虽然说课业太重是很大一部分原因,但是这不能否认我身上的问题,努力ing!

说一些或远或近的计划吧

1、Google Camp春季策划活动,进行中,暂不评论。

2、Android 开发,过段时间有一个Android开发大赛,钻研一下SDK和JAVA。

3、Python,只是寒假学了一会,开学之后忙着忙着就荒废了,重新拾起来,争取做一些东西。

4、Podcast,逆铭的项目,报了这学期所有要交大作业的课程,所以义不容辞参与进来,正好学一些协作开发经验。

5、和计院的一个实验室导师联系上了,主要研究方向是计算机图形学,OpenGL、DirectX……有的玩了~~

6、数据库、C#都是这学期比较重要的课程,虽然课堂本身显得很水,但还是有认真学习的必要的

7、数学二学位,荒废了好久了……数学和英语……是该努力了~~~

一个人,宅,很好

    山顶洞人的生活,宅在宿舍,拉上窗帘,甩掉时间概念的叨扰,饿了吃面包、饼干、方便面,馋了啃两口父亲从家寄来的牛肉,两天就这样过去了,没出门,没看见太阳,应该是两天吧?
    昨晚6点才睡觉的,是凌晨6点(如果算是凌晨的话),12点起的床,起床第一件事——睁开眼睛,第二件事——打开我那饱受虐待的本子。
    这两天一直都在用C#编一个简单的文字排版工具,由于本人巨菜无比,第一次玩C#很是生疏,效率奇低,不过确实实践是最好的老师,学到了不少。想想前段时间把《C#入门经典》草草的过了一遍,根本就是囫囵吞枣,效果几乎为零,以后在这方面要注意了!
    整体进度还算能接受吧,一共要两个版本,一个网页版和一个应用程序版。由于之前用silverlight做网页玩过了几回(也是在极低的效率中煎熬),所以昨天一天就把功能要求不多的网页测试版赶了出来。说是一天有点夸张,在面对电脑时,还是不太能彻底改掉虚度时光的特长……慢慢改吧,当电脑不再成为我时间上的老虎机时,我应该就不这么菜了吧?那个应用程序版,说来有点心痛,在上一次睡觉之前,本来已经做了不少,可是今天在我想备份一下的时候,竟然习惯性的按成了删除的快捷键,还是彻底删除的……欲哭无泪,只好从头再来了。希望明天,或者在下一次睡觉之前能搞差不多吧。
    这两天都是25小时在线的,发扬了潜水到底的优良传统,不想被人打扰。突然爱上了一个人,不是哪一个,是独自一个人。要求一个人孤独着,应该没有错吧?朋友,如果你发信息我敷衍了你,请接受我的道歉,请原谅我,我只是爱上了一个人而已……
    本来只是想在低效的间隙中休息一下的,没想到又写了那么多废话,耽误您的时间了,有机会一定补偿……

准备撬课!!…………

    这几天接触了不少人,有北大的同学,还有大二大三的学长。和他们都谈到了大学的学习和生活,突然发现自己的学习方式是那样的落后。竟然还是仅仅满足于老师讲的课程,对于课堂仅仅只是应付,但这里不是说要认真听课,而是要撬,撬的越多越好。

    为什么呢?我曾经一度想让自己成为一节课没撬过的人,但是现在想想那是多么的错误啊?那些语文、政治、航概、计导之类的只是供老师吹牛的课对今后的专业学习有什么用?高数、C++的老师因为要考虑大部分人的情况课讲的都超级慢,有必要花费那么多时间吗?离散的老师是一个研究生,实力很强,但教学能力不行(学长说的),经常是上课晕晕乎乎,下课后看书才看懂,这样的课又有什么意义?英语课也上的一点意思都没有,况且对水平的提高也是很有限的。

    当然我不是说什么课都要撬,这样还去学校干嘛,而且也不是什么人都要撬课,至少现在我还不确定我撬课是不是正确的选择。当然我是有过渡的,不是一下子所有课都不上了,而是先把那些没用的课都先枪毙了,然后通过超前学习放弃速度慢的学科,至于离散和英语,我觉得还是人到场比较保险,虽然可能没什么用,但是可以用这个时间做其余相关的事。

    我也有点矛盾,因为我的撬课是在拿自己做实验,我的操作到底对不对呢?我很想尽快知道,但不可能。话说回来,这一切都是我的选择,既然选择了我就没有必要顾虑太多,毕竟我的选择需要我更多的努力。不管是对是错,我选择了,我会去做的,而且要做好!