WPF实现平面三角形3D运动效果
本文实例为大家分享了WPF实现平面三角形3D运动效果的具体代码,供大家参考,具体内容如下
实现效果如下:
思路:封装三角形三个顶点和路径的三角形类,图形渲染时同步更新公共顶点三角形的顶点位置。
步骤:
1、三角形类Triangle.cs
publicPointA,B,C;//初始三个顶点 publicPointVA,VB,VC;//运动的三个顶点 publicPathtrianglePath;//三角形路径 publicColortriangleColor;//填充 publicdoubleColorIndex;//颜色深度 publicTriangle(Pointa,Pointb,Pointc,Colorco,doublez) { A=VA=a; B=VB=b; C=VC=c; triangleColor=co; ColorIndex=z; trianglePath=newPath(); Draw(); } //////绘制三角形 /// publicvoidDraw() { varg=newStreamGeometry(); using(StreamGeometryContextcontext=g.Open()) { context.BeginFigure(VA,true,true); context.LineTo(VB,true,false); context.LineTo(VC,true,false); } trianglePath.Data=g; trianglePath.Fill=newSolidColorBrush(triangleColor); }
2、三角形系统类TriangleSystem.cs
publicclassTriangleSystem { //////三角形列表 /// privateListtriangles; /// ///点和与其对应三角形字典 /// publicDictionarypointTriangles; /// ///容器 /// privateCanvascontainerCanvas; //////三角形宽 /// privateinttriangleWidth=100; //////三角形高 /// privateinttriangleHeight=100; //////三角形横向数量 /// privateinthorizontalCount=10; //////三角形纵向数量 /// privateintverticalCount=5; //////X坐标运动范围 /// privateintXRange=100; //////Y坐标运动范围 /// privateintYRange=10; //////坐标运动速度 /// privateintspeed=10; //////三角形颜色深度 /// privatedoublezIndex=10.0; //////随机数 /// privateRandomrandom; publicTriangleSystem(Canvasca) { containerCanvas=ca; random=newRandom(); triangles=newList(); pointTriangles=newDictionary (); SpawnTriangle(); } /// ///三角形初始化 /// privatevoidSpawnTriangle() { //清空队列 triangles.Clear(); for(inti=0;i1?1:index<0.1?0.1:index; Trianglet1=newTriangle(A,B,C,GetTriangleColor(index),index); Trianglet2=newTriangle(A,D,C,GetTriangleColor(index-0.1),index-0.1); //公共点和三角形集合键值对 AddPointTriangles(A,t1,t2); AddPointTriangles(B,t1,t2); AddPointTriangles(C,t1,t2); AddPointTriangles(D,t1,t2); //添加三角形 this.containerCanvas.Children.Add(t1.trianglePath); this.containerCanvas.Children.Add(t2.trianglePath); this.triangles.Add(t1); this.triangles.Add(t2); } } } /// ///添加公共点和三角形集合键值对 /// privatevoidAddPointTriangles(Pointp,Trianglet1,Trianglet2) { if(!this.pointTriangles.Keys.Contains(p)) { Listts=newList (); ts.Add(t1); ts.Add(t2); PointClasspc=newPointClass { triangles=ts, vector=newVector(random.Next(-speed,speed)*0.05,random.Next(-speed,speed)*0.05), }; this.pointTriangles.Add(p,pc); } else { if(!this.pointTriangles[p].triangles.Contains(t1)) this.pointTriangles[p].triangles.Add(t1); if(!this.pointTriangles[p].triangles.Contains(t2)) this.pointTriangles[p].triangles.Add(t2); } } /// ///获取三角形颜色 /// privateColorGetTriangleColor(doubleindex) { returnColor.FromArgb((byte)(255*index),230,18,65); } //////更新三角形 /// publicvoidUpdate() { foreach(varptinpointTriangles) { foreach(vartinpt.Value.triangles) { if(t.A==pt.Key) t.VA=GetPointValue(t.VA,t.A,refpt.Value.vector,reft.triangleColor,reft.ColorIndex); if(t.B==pt.Key) t.VB=GetPointValue(t.VB,t.B,refpt.Value.vector,reft.triangleColor,reft.ColorIndex); if(t.C==pt.Key) t.VC=GetPointValue(t.VC,t.C,refpt.Value.vector,reft.triangleColor,reft.ColorIndex); t.Draw(); } } } //////计算顶点值 /// privatePointGetPointValue(Pointp1,Pointp2,refVectorv,refColorc,refdoubleindex) { PointgetPoint=newPoint(); if(p1.X+v.Xp2.X-XRange) getPoint.X=p1.X+v.X; else { v.X=-v.X; index=index>1?index-0.01:index<0.01?index+0.01:index-0.01; c=GetTriangleColor(index); getPoint.X=p1.X+v.X; } if(p1.Y+v.Y p2.Y-YRange) getPoint.Y=p1.Y+v.Y; else { v.Y=-v.Y; getPoint.Y=p1.Y+v.Y; } returngetPoint; } }
3、PointClass.cs
publicclassPointClass { publicListtriangles; publicVectorvector; }
4、主窗体交互逻辑
privateTriangleSystemts; publicMainWindow() { InitializeComponent(); ts=newTriangleSystem(this.mainCanvas); CompositionTarget.Rendering+=CompositionTarget_Rendering; } //////帧渲染事件 /// privatevoidCompositionTarget_Rendering(objectsender,EventArgse) { ts.Update(); }
不足:其中颜色渲染方式不够完善,无法完全模仿3D起伏的效果,有兴趣的可以一起探讨优化。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。