C#实现3D效果完整实例
本文实例讲述了C#实现3D效果的方法。分享给大家供大家参考,具体如下:
一、新建一类文件
privatestaticdouble[]addVector(double[]a,double[]b)
{
returnnewdouble[]{a[0]+b[0],a[1]+b[1],a[2]+b[2]};
}
privatestaticdouble[]scalarProduct(double[]vector,doublescalar)
{
returnnewdouble[]{vector[0]*scalar,vector[1]*scalar,vector[2]*scalar};
}
privatestaticdoubledotProduct(double[]a,double[]b)
{
returna[0]*b[0]+a[1]*b[1]+a[2]*b[2];
}
privatestaticdoublenorm(double[]vector)
{
returnMath.Sqrt(dotProduct(vector,vector));
}
privatestaticdouble[]normalize(double[]vector)
{
returnscalarProduct(vector,1.0/norm(vector));
}
privatestaticdouble[]crossProduct(double[]a,double[]b)
{
returnnewdouble[]
{
(a[1]*b[2]-a[2]*b[1]),
(a[2]*b[0]-a[0]*b[2]),
(a[0]*b[1]-a[1]*b[0])
};
}
privatestaticdouble[]vectorProductIndexed(double[]v,double[]m,inti)
{
returnnewdouble[]
{
v[i+0]*m[0]+v[i+1]*m[4]+v[i+2]*m[8]+v[i+3]*m[12],
v[i+0]*m[1]+v[i+1]*m[5]+v[i+2]*m[9]+v[i+3]*m[13],
v[i+0]*m[2]+v[i+1]*m[6]+v[i+2]*m[10]+v[i+3]*m[14],
v[i+0]*m[3]+v[i+1]*m[7]+v[i+2]*m[11]+v[i+3]*m[15]
};
}
privatestaticdouble[]vectorProduct(double[]v,double[]m)
{
returnvectorProductIndexed(v,m,0);
}
privatestaticdouble[]matrixProduct(double[]a,double[]b)
{
double[]o1=vectorProductIndexed(a,b,0);
double[]o2=vectorProductIndexed(a,b,4);
double[]o3=vectorProductIndexed(a,b,8);
double[]o4=vectorProductIndexed(a,b,12);
returnnewdouble[]
{
o1[0],o1[1],o1[2],o1[3],
o2[0],o2[1],o2[2],o2[3],
o3[0],o3[1],o3[2],o3[3],
o4[0],o4[1],o4[2],o4[3]
};
}
privatestaticdouble[]cameraTransform(double[]C,double[]A)
{
double[]w=normalize(addVector(C,scalarProduct(A,-1)));
double[]y=newdouble[]{0,1,0};
double[]u=normalize(crossProduct(y,w));
double[]v=crossProduct(w,u);
double[]t=scalarProduct(C,-1);
returnnewdouble[]
{
u[0],v[0],w[0],0,
u[1],v[1],w[1],0,
u[2],v[2],w[2],0,
dotProduct(u,t),dotProduct(v,t),dotProduct(w,t),1
};
}
privatestaticdouble[]viewingTransform(doublefov,doublen,doublef)
{
fov*=(Math.PI/180);
doublecot=1.0/Math.Tan(fov/2);
returnnewdouble[]{cot,0,0,0,0,cot,0,0,0,0,(f+n)/(f-n),-1,0,0,2*f*n/(f-n),0};
}
publicstaticImageGenerate(stringcaptchaText)
{
intfontsize=24;
Fontfont=newFont("Arial",fontsize);
SizeFsizeF;
using(Graphicsg=Graphics.FromImage(newBitmap(1,1)))
{
sizeF=g.MeasureString(captchaText,font,0,StringFormat.GenericDefault);
}
intimage2d_x=(int)sizeF.Width;
intimage2d_y=(int)(fontsize*1.3);
Bitmapimage2d=newBitmap(image2d_x,image2d_y);
Colorblack=Color.Black;
Colorwhite=Color.White;
using(Graphicsg=Graphics.FromImage(image2d))
{
g.Clear(black);
g.DrawString(captchaText,font,Brushes.White,0,0);
}
Randomrnd=newRandom();
double[]T=cameraTransform(newdouble[]{rnd.Next(-90,90),-200,rnd.Next(150,250)},newdouble[]{0,0,0});
T=matrixProduct(T,viewingTransform(60,300,3000));
double[][]coord=newdouble[image2d_x*image2d_y][];
intcount=0;
for(inty=0;y<image2d_y;y+=2)
{
for(intx=0;x<image2d_x;x++)
{
intxc=x-image2d_x/2;
intzc=y-image2d_y/2;
doubleyc=-(double)(image2d.GetPixel(x,y).ToArgb()&0xff)/256*4;
double[]xyz=newdouble[]{xc,yc,zc,1};
xyz=vectorProduct(xyz,T);
coord[count]=xyz;
count++;
}
}
intimage3d_x=256;
intimage3d_y=image3d_x*9/16;
Bitmapimage3d=newBitmap(image3d_x,image3d_y);
Colorfgcolor=Color.White;
Colorbgcolor=Color.Black;
using(Graphicsg=Graphics.FromImage(image3d))
{
g.Clear(bgcolor);
count=0;
doublescale=1.75-(double)image2d_x/400;
for(inty=0;y<image2d_y;y+=2)
{
for(intx=0;x<image2d_x;x++)
{
if(x>0)
{
doublex0=coord[count-1][0]*scale+image3d_x/2;
doubley0=coord[count-1][1]*scale+image3d_y/2;
doublex1=coord[count][0]*scale+image3d_x/2;
doubley1=coord[count][1]*scale+image3d_y/2;
g.DrawLine(newPen(fgcolor),(float)x0,(float)y0,(float)x1,(float)y1);
}
count++;
}
}
}
returnimage3d;
}
注意引用命名空间:
usingSystem.Drawing;
二、页面调用
Response.ContentType="image/pjpeg";
Captcha.Generate("我就是3D内容").Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。