關於內插法 |
尚未結案
|
1666362
初階會員 發表:66 回覆:124 積分:43 註冊:2004-07-07 發送簡訊給我 |
我用版主分享的程式 想要改寫成 立體迴旋內插
公式如下
欲計算的內插點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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |