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.Yp2.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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。