• <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>
            算法學社
            記錄難忘的征途
            posts - 141,comments - 220,trackbacks - 0

            題目描述:

               定義一種變換向量的語言,其語法有這么幾種:
                  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為軸逆時針旋轉angle。
                  4. rotate k .... end   功能: 重復執行...k次
                給若干個向量,輸出對應的變換后的向量。

            吐槽:

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

            算法分析:

                因為語法4,所以不難想到要使用矩陣來變換向量。
                2的矩陣變換都比較直觀,3的矩陣變換有公式。
                關鍵是1的變換矩陣我糾結了好久。
                其實把矩陣變成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 西月弦 閱讀(423) 評論(1)  編輯 收藏 引用 所屬分類: 解題報告

            FeedBack:
            # re: hdu 4087 仿射幾何 + 矩陣乘法[未登錄]
            2012-06-26 00:04 | David
            這個為什么叫做仿射幾何呢?  回復  更多評論
              
            一本色道久久HEZYO无码| 久久国产一区二区| 天堂无码久久综合东京热| 久久影院午夜理论片无码 | 久久精品国产清自在天天线| 久久国产福利免费| 久久久亚洲裙底偷窥综合| 99re这里只有精品热久久| 蜜桃麻豆www久久国产精品| 久久人人爽人人爽人人片AV不| 青青草原综合久久| 久久妇女高潮几次MBA| 国产精品美女久久久网AV| 亚洲精品无码久久千人斩| 国产99久久九九精品无码| 久久午夜夜伦鲁鲁片免费无码影视 | 亚洲国产精品无码久久| 久久久国产精品| 欧美一区二区精品久久| 精品久久久久久无码不卡| 国产精品九九久久免费视频 | 中文字幕久久欲求不满| 伊人久久综合无码成人网| 欧美精品丝袜久久久中文字幕 | 久久精品国产亚洲av麻豆小说 | 久久人人爽人人爽人人片AV东京热| 久久国产乱子精品免费女| 无码人妻久久久一区二区三区| 性做久久久久久久久老女人| 久久精品国产只有精品2020| 久久久无码精品亚洲日韩蜜臀浪潮| 亚洲伊人久久成综合人影院| 久久久久久国产精品美女| 久久久精品人妻无码专区不卡| 2020最新久久久视精品爱 | 7777精品伊人久久久大香线蕉| 久久有码中文字幕| 欧美日韩久久中文字幕| 伊人情人综合成人久久网小说| 伊人色综合九久久天天蜜桃| 一本久道久久综合狠狠躁AV|