• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            算法學(xué)社
            記錄難忘的征途
            posts - 141,comments - 220,trackbacks - 0

            題目描述:

               定義一種變換向量的語(yǔ)言,其語(yǔ)法有這么幾種:
                  1. translate tx ty tz  功能:(x,y,z) = (x+tx,y+ty,z+tz)
                  2. scale a b c         功能:(x,y,z) = (ax,by,cz)
                  3. rotate tx ty tz angle  功能:讓x,y,z以tx,ty,tz為軸逆時(shí)針旋轉(zhuǎn)angle。
                  4. rotate k .... end   功能: 重復(fù)執(zhí)行...k次
                給若干個(gè)向量,輸出對(duì)應(yīng)的變換后的向量。

            吐槽:

                1. 注意-0.0的情況。
                2. 樣例過(guò)了基本就過(guò)了。

            算法分析:

                因?yàn)檎Z(yǔ)法4,所以不難想到要使用矩陣來(lái)變換向量。
                2的矩陣變換都比較直觀,3的矩陣變換有公式。
                關(guān)鍵是1的變換矩陣我糾結(jié)了好久。
                其實(shí)把矩陣變成4×4就可以了
                    1  0  0  0
                    0  1  0  0
                    0  0  1  0
                    tx ty tz 1
                最后用[x,y,z,1]去乘最終變換矩陣就可以了。。。
              1 #include<iostream>
              2 #include<cmath>
              3 #include<cstdio>
              4 #include<string>
              5 using namespace std;
              6 const int N = 4;
              7 struct matrix {
              8     double num[N][N];
              9     matrix (double a){
             10         for(int i=0;i<N;i++)
             11             for(int j=0;j<N;j++)
             12                 num[i][j] = (i==j)*a;
             13     }
             14     matrix(double x,double y,double z){
             15         for(int i=0;i<N;i++)
             16             for(int j=0;j<N;j++)
             17                 num[i][j] = (i==j)*1.0;
             18         num[3][0] = x;
             19         num[3][1] = y;
             20         num[3][2] = z;
             21     }
             22     matrix(double x,double y,double z, int X){
             23         for(int i=0;i<N;i++)
             24             for(int j=0;j<N;j++)
             25                 num[i][j] =(i==j)*1.0;
             26         num[0][0] = x; num[1][1] = y; num[2][2] = z;
             27     }
             28     matrix(double P[3],double ang){
             29         for(int i=0;i<N;i++)
             30             for(int j=0;j<N;j++) num[i][j] = (i==j)*1.0;
             31         double flag [3][3] = {0,1.0,-1.0,-1.0,0,1.0,1.0,-1.0,0}, sum = P[0] + P[1] + P[2];
             32         for(int i=0;i<3;i++)
             33             for(int j=0;j<3;j++) if(i == j)
             34                 num[i][j] = P[i]*P[i] + (1-P[i]*P[i]) * cos(ang);
             35                 else num[i][j] = P[i]*P[j]*(1-cos(ang)) + (sum - P[i] - P[j]) * sin(ang) * flag[i][j];
             36     }
             37 };
             38 matrix operator * (const matrix& a, const matrix& b){
             39     matrix c(0.0);
             40     for(int i=0; i<N; i++)
             41         for(int j=0; j<N; j++)
             42             for(int k = 0; k<N; k++)
             43                 c.num[i][j] += a.num[i][k] * b.num[k][j];
             44     return c;
             45 }
             46 matrix pow(matrix a, int b){
             47     matrix ans(1.0), t = a;
             48     while(b) {
             49         if(b&1) ans = ans * t;
             50         t = t * t; b>>=1;
             51     }
             52     return ans;
             53 }
             54 const double pi = acos(-1.0);
             55 matrix dfs(){
             56     matrix ans(1.0);
             57     string cmd;
             58     int k; double x,y,z,a;
             59     for(;;){
             60         cin >> cmd;
             61         if(cmd=="end") return ans;
             62         else if(cmd=="repeat"){
             63             scanf("%d",&k);
             64             matrix temp = dfs();
             65             temp = pow(temp, k);
             66             ans = ans * temp;
             67         }
             68         else {
             69             scanf("%lf%lf%lf",&x,&y,&z);
             70             if(cmd == "translate"){
             71                 matrix temp(x, y, z); ans = ans * temp;
             72             }
             73             else if(cmd == "scale"){
             74                 matrix temp(x, y, z, 0); ans = ans * temp;
             75             }
             76             else {
             77                 scanf("%lf",&a);
             78                 a = a/180.0*pi;
             79                 double sum = sqrt(x*x + y*y +z*z);
             80                 double p[3] = {x/sum, y/sum, z/sum};
             81                 matrix temp(p,a); ans = ans * temp;
             82             }
             83         }
             84     }
             85 }
             86 double pre(double x){
             87     return x + 1e-6;
             88 }
             89 int main(){
             90     int n;
             91     while(~scanf("%d",&n) && n){
             92         matrix t = dfs();
             93         double x,y,z,px,py,pz;
             94         while(n--){
             95             scanf("%lf%lf%lf",&x,&y,&z);
             96             px = x*t.num[0][0] + y*t.num[1][0] +z*t.num[2][0] + t.num[3][0];
             97             py = x*t.num[0][1] + y*t.num[1][1] +z*t.num[2][1] + t.num[3][1];
             98             pz = x*t.num[0][2] + y*t.num[1][2] +z*t.num[2][2] + t.num[3][2];
             99             printf("%.2lf %.2lf %.2lf\n",pre(px),pre(py),pre(pz));
            100         }
            101         puts("");
            102     }
            103 }
            104 
            posted on 2012-06-24 16:01 西月弦 閱讀(414) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): 解題報(bào)告

            FeedBack:
            # re: hdu 4087 仿射幾何 + 矩陣乘法[未登錄](méi)
            2012-06-26 00:04 | David
            這個(gè)為什么叫做仿射幾何呢?  回復(fù)  更多評(píng)論
              
            色成年激情久久综合| 久久久久久久人妻无码中文字幕爆 | 久久最近最新中文字幕大全| 色诱久久av| 欧美一区二区久久精品| 久久午夜福利电影| 性高湖久久久久久久久| 99久久99这里只有免费费精品| 亚洲人AV永久一区二区三区久久| 亚洲一区精品伊人久久伊人| 久久久精品日本一区二区三区| 久久免费视频1| 久久天天躁狠狠躁夜夜avapp| 国产精品久久成人影院| 久久国产精品成人片免费| 久久偷看各类wc女厕嘘嘘| 精品久久久久久久中文字幕| 18岁日韩内射颜射午夜久久成人| 亚洲国产成人久久精品动漫| 国产精品久久久久蜜芽| 亚洲综合久久综合激情久久| 色综合合久久天天综合绕视看 | 久久亚洲精品人成综合网| 中文成人久久久久影院免费观看| 伊人久久一区二区三区无码| 一本久久免费视频| 久久夜色精品国产网站| 国産精品久久久久久久| 日韩十八禁一区二区久久| 伊人久久大香线蕉综合5g| 综合久久国产九一剧情麻豆| 91精品国产高清91久久久久久| 国产日韩久久久精品影院首页 | 久久福利青草精品资源站免费| 日本加勒比久久精品| 无码人妻久久一区二区三区| 日本免费一区二区久久人人澡 | 国产精品99精品久久免费| 久久久久国产精品三级网| 久久精品中文騷妇女内射| 四虎国产精品免费久久久|