全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1002
推到 Plurk!
推到 Facebook!

關於內插法

尚未結案
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-08 20:10:20 IP:61.222.xxx.xxx 未訂閱
我用版主分享的程式 想要改寫成 立體迴旋內插 公式如下 欲計算的內插點Zm(Xp,Yp) 程式碼
 void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Graphics::TBitmap *NBmp = new Graphics::TBitmap();      int            w,h,newW,newH;
  double         dX,dY,x,y;
  double         x1,x2,x3,x4,y1,y2,y3,y4,xf,yf;
  double         vx1,vx2,vx3,vx4,vy1,vy2,vy3,vy4;
  double         cy1,cy2,cy3,cy4;
  int            i,j;
  int            ix,iy;                    
                  
  unsigned char  clr,
                 clrR,//clrG,clrB,
                 nclr1,nclr2,nclr3,nclr4,  
                 nclr5,nclr6,nclr7,nclr8,
                 nclr9,nclr10,nclr11,nclr12,
                 nclr13,nclr14,nclr15,nclr16;      w = Image1->Width;
  h = Image1->Height;
  newW = StrToInt(Edit1->Text);
  newH = StrToInt(Edit2->Text);
  if((newW <=0) ||(newH <=0))
  {
    ShowMessage("Invalided parameter");
    return;
  }
  NBmp->Width  = newW;
  NBmp->Height = newH;      dX = (double)w/(double)newW;
  dY = (double)h/(double)newH;      for(j = 0 ; j < newH ; j++)
     for(i =0 ; i < newW ; i++)
     {
       x = dX*(double)i;
       y = dY*(double)j;           xf=x-floor(x);  yf=y-floor(y);           x1=-(1+xf);
       if(x1<0){x1=(-1)*x1;}
       double xx1,xxx1;
       xx1=x1*x1; xxx1=xx1*x1;
       if(x1>=0&&x1<1){vx1=1.0-2.0*xx1+xxx1;}
       if(x1>=1&&x1<2){vx1=4.0-8.0*x1+5.0*xx1-xxx1;}
       if(x1>=2){vx1=0;}
       y1=-(1+yf);
       double yy1,yyy1;
       yy1=y1*y1; yyy1=yy1*y1;
       if(y1<0){y1=(-1)*y1;}
       if(y1>=0&&y1<1){vy1=1.0-2.0*yy1+yyy1;}
       if(y1>=1&&y1<2){vy1=4.0-8.0*y1+5.0*yy1-yyy1;}
       if(y1>=2){vy1=0;}           x2=-xf;
       if(x2<0){x2=(-1)*x2;}
       double xx2,xxx2;
       xx2=x2*x2; xxx2=xx2*x2;
       if(x2>=0&&x1<1){vx2=1.0-2.0*xx2+xxx2;}
       if(x2>=1&&x2<2){vx2=4.0-8.0*x2+5.0*xx2-xxx2;}
       if(x2>=2){vx2=0;}
       y2=-yf;
       double yy2,yyy2;
       yy2=y2*y2; yyy2=yy2*y2;
       if(y2<0){y2=(-1)*y2;}
       if(y2>=0&&y1<1){vy2=1.0-2.0*yy2+yyy2;}
       if(y2>=1&&y2<2){vy2=4.0-8.0*y2+5.0*yy2-yyy2;}
       if(y2>=2){vy2=0;}           x3=1-xf;
       double xx3,xxx3;
       xx3=x3*x3; xxx3=xx3*x3;
       if(x3<0){x3=(-1)*x3;}
       if(x3>=0&&x1<1){vx3=1.0-2.0*xx3+xxx3;}
       if(x3>=1&&x3<2){vx3=4.0-8.0*x3+5.0*xx3-xxx3;}
       if(x3>=2){vx3=0;}
       y3=1-yf;
       double yy3,yyy3;
       yy3=y3*y3; yyy3=yy3*y3;
       if(y3<0){y3=(-1)*y3;}
       if(y3>=0&&y1<1){vy3=1.0-2.0*yy3+yyy3;}
       if(y3>=1&&y3<2){vy3=4.0-8.0*y3+5.0*yy3-yyy3;}
       if(y3>=2){vy3=0;}           x4=2-xf;
       if(x4<0){x4=(-1)*x4;}
       double xx4,xxx4;
       xx4=x4*x4; xxx4=xx4*x4;
       if(x4>=0&&x1<1){vx4=1.0-2.0*xx4+xxx4;}
       if(x4>=1&&x4<2){vx4=4.0-8.0*x4+5.0*xx4-xxx4;}
       if(x4>=2){vx4=0;}
       y4=2-yf;
       double yy4,yyy4;
       yy4=y4*y4; yyy4=yy4*y4;
       if(y4<0){y4=(-1)*y4;}
       if(y4>=0&&y4<1){vy4=1.0-2.0*yy4+yyy4;}
       if(y4>=1&&y4<2){vy4=4.0-8.0*y4+5.0*yy4-yyy4;}
       if(y4>=2){vy4=0;}               ix = (int)x;         iy = int(y);           nclr1 = GetRValue(Bmp->Canvas->Pixels[ix][iy]);
       nclr2 = GetRValue(Bmp->Canvas->Pixels[ix+1][iy]);
       nclr3 = GetRValue(Bmp->Canvas->Pixels[ix+2][iy]);
       nclr4 = GetRValue(Bmp->Canvas->Pixels[ix+3][iy]);
       cy1=vy1*(double)nclr1+vy2*(double)nclr2+vy3*(double)nclr3+vy4*(double)nclr4;
      
       nclr5 = GetRValue(Bmp->Canvas->Pixels[ix][iy+1]);
       nclr6 = GetRValue(Bmp->Canvas->Pixels[i+1][iy+1]);
       nclr7 = GetRValue(Bmp->Canvas->Pixels[ix+2][iy+1]);
       nclr8 = GetRValue(Bmp->Canvas->Pixels[ix+3][iy+1]); 
       cy2=vy1*(double)nclr5+vy2*(double)nclr6+vy3*(double)nclr7+vy4*(double)nclr8;
       
       nclr9 = GetRValue(Bmp->Canvas->Pixels[ix][iy+2]);
       nclr10 = GetRValue(Bmp->Canvas->Pixels[ix+1][iy+2]);
       nclr11 = GetRValue(Bmp->Canvas->Pixels[ix+2][iy+2]);
       nclr12 = GetRValue(Bmp->Canvas->Pixels[ix+3][iy+2]);
       cy3=vy1*(double)nclr9+vy2*(double)nclr10+vy3*(double)nclr11+vy4*(double)nclr12;
       
       nclr13 = GetRValue(Bmp->Canvas->Pixels[ix][iy+3]);
       nclr14 = GetRValue(Bmp->Canvas->Pixels[ix+1][iy+3]);
       nclr15 = GetRValue(Bmp->Canvas->Pixels[ix+2][iy+3]);
       nclr16 = GetRValue(Bmp->Canvas->Pixels[ix+3][iy+3]);
       cy4=vy1*(double)nclr13+vy2*(double)nclr14+vy3*(double)nclr15+vy4*(double)nclr16;
       clrR=(byte)(cy1*vx1+cy2*vx2+cy3*vx3+cy4*vx4);           NBmp->Canvas->Pixels[i][j] = (TColor)RGB(clrR,clrR,clrR);
     }
  Image2->Width = newW;
  Image2->Height = newH;
  Image2->Picture->Bitmap = NBmp;
  delete NBmp;
}
可以執行 但是縮放的時候 結果很差 不知道是哪邊出了問題 我是新手 多多指教 ^^ 發表人 - 1666362 於 2004/12/08 20:19:09
系統時間:2024-05-20 20:38:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!