• <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. 樣例過了基本就過了。

            算法分析:

                因?yàn)檎Z(yǔ)法4,所以不難想到要使用矩陣來變換向量。
                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)  編輯 收藏 引用 所屬分類: 解題報(bào)告

            FeedBack:
            # re: hdu 4087 仿射幾何 + 矩陣乘法[未登錄]
            2012-06-26 00:04 | David
            這個(gè)為什么叫做仿射幾何呢?  回復(fù)  更多評(píng)論
              
            av国内精品久久久久影院| 国内精品久久久久久久久| 99久久婷婷国产综合精品草原 | 久久婷婷五月综合成人D啪 | 亚洲精品乱码久久久久久不卡| 日韩亚洲国产综合久久久| 精品九九久久国内精品| 色88久久久久高潮综合影院| 国产69精品久久久久观看软件 | 国内精品久久久久久久coent| 人人妻久久人人澡人人爽人人精品| 伊人热人久久中文字幕| 999久久久无码国产精品| 无遮挡粉嫩小泬久久久久久久| 久久天天躁夜夜躁狠狠| 久久人人爽人人爽人人av东京热| 欧洲成人午夜精品无码区久久| 欧美亚洲国产精品久久| 亚洲国产小视频精品久久久三级 | 97久久精品国产精品青草| 99久久国产亚洲综合精品| 一本久久a久久精品亚洲| 国内精品九九久久久精品| 久久免费小视频| 久久久久久久综合日本| 天天影视色香欲综合久久| 久久久久免费精品国产| 久久99精品国产自在现线小黄鸭| 国产精品久久久久久久久久免费| 久久午夜福利电影| 97精品依人久久久大香线蕉97 | 香蕉久久久久久狠狠色| 国产精品久久久久免费a∨| 91精品国产91久久综合| 久久99精品国产麻豆婷婷| 伊人久久大香线蕉亚洲| www亚洲欲色成人久久精品| 久久久久久免费视频| 97久久精品人人澡人人爽| 久久久一本精品99久久精品88| 久久精品国产精品亚洲毛片|