Скачать 0.6 Mb.
|
class Explosion using System; using System.Collections.Generic; using System.Text; using Tao.OpenGl; using Tao.FreeGlut; using Tao.Platform.Windows; namespace Самолет { class Explosion { private float[] position = new float[3]; private int MAX_PARTICLES = 50000; private int _particles_now; private bool isStart = false; private Particle[] ParticleArray; private bool isDisplayList = false; private int DisplayListNom = 0; private static int[] k = { -1, 1 }; private CalcBurst test; private Random rnd = new Random(); public Explosion(float x, float y, float z, float V0, float H0, float R0, int particle_count) { position[0] = x; position[1] = y; position[2] = z; test = new CalcBurst(V0, H0, R0, position[0], position[1], position[2]); _particles_now = particle_count; if (_particles_now > MAX_PARTICLES) { _particles_now = MAX_PARTICLES; } System.Console.WriteLine(_particles_now); ParticleArray = new Particle[_particles_now]; } public void SetNewPosition(float x, float y, float z) { position[0] = x; position[1] = y; position[2] = z; } private void CreateDisplayList() { DisplayListNom = Gl.glGenLists(1); Gl.glNewList(DisplayListNom, Gl.GL_COMPILE); Gl.glColor4f(0.1f, 0.1f, 0.1f, 1.0f); Glut.glutSolidSphere(1.2, 10, 10); Gl.glEndList(); isDisplayList = true; } public void Boooom() { if (!isDisplayList) { CreateDisplayList(); } for (int ax = 0; ax < _particles_now; ax++) { ParticleArray[ax] = CreateNewParticle(); ParticleArray[ax].Calculate(); } isStart = true; } public Particle CreateNewParticle() { Particle returnParticle = new Particle(position[0], position[1], position[2], test, rnd); return returnParticle; } public void Render() { if (isStart) { for (int ax = 0; ax < _particles_now; ax++) { int i ; i=ParticleArray[ax].index; Gl.glPushMatrix(); Gl.glTranslated(ParticleArray[ax].points[i].x, ParticleArray[ax].points[i].y, ParticleArray[ax].points[i].z); Gl.glCallList(DisplayListNom); Gl.glPopMatrix(); ParticleArray[ax].index++; if (ParticleArray[ax].index==ParticleArray[ax].maxIndex) { ParticleArray[ax].index = 0; } } } } } } class ForXML, class InstantData using System; using System.Collections.Generic; using System.Text; using System.Xml.Serialization; using System.IO; [XmlRootAttribute("InstantData")] public class InstantData { // Time mark public double t; /* * Coordinates of the aircraft mass center: * x - longitudinal coordinate * y - height * z - lateral deviation */ public double x; public double y; public double z; // Respective geometric velocities public double vx; public double vy; public double vz; // Angular coordinates: // theta (pitch) - angle of rotation around z-axis //psi (yaw) - angle of rotation around y-axis // gamma (bank) - angle of rotation around x-axis public double theta; public double psi; public double gamma; // Respective angular velocities public double wtheta; public double wpsi; public double wgamma; } [XmlRootAttribute("Trajectory")] public class ForXML { [XmlArrayAttribute("data")] public List public ForXML() { data = new List } } interface IRenderable using System; namespace Самолет { public interface IRenderable { void Render(); } } Class Lib using System; using System.Collections.Generic; using System.Text; namespace Самолет { public struct CVertex3f { public float x; public float y; public float z; public CVertex3f(float v1, float v2, float v3) { x = v1; y = v2; z = v3; } public override string ToString() { return String.Format("v1: {0} v2: {1} v3: {2}", x, y, z); } } public struct Triangle { public int Vertex1; public int Vertex2; public int Vertex3; public Triangle(int v1, int v2, int v3) { Vertex1 = v1; Vertex2 = v2; Vertex3 = v3; } public override string ToString() { return String.Format("v1: {0} v2: {1} v3: {2}", Vertex1, Vertex2, Vertex3); } } public struct CFace { public int Vertex1; public int Vertex2; public int Vertex3; public CFace(int v1, int v2, int v3) { Vertex1 = v1; Vertex2 = v2; Vertex3 = v3; } public override string ToString() { return String.Format("v1: {0} v2: {1} v3: {2}", Vertex1, Vertex2, Vertex3); } } public struct TexCoord { public float U; public float V; public TexCoord(float u, float v) { U = u; V = v; } } public struct Vector { public double X; public double Y; public double Z; public Vector(double x, double y, double z) { X = x; Y = y; Z = z; } public Vector CrossProduct(Vector v) { return new Vector(Y * v.Z - Z * v.Y, Z * v.X - X * v.Z, X * v.Y - Y * v.X); } public double DotProduct(Vector v) { return X * v.X + Y * v.Y + Z * v.Z; } public Vector Normalize() { double d = Length(); if (d == 0) d = 1; return this / d; } public double Length() { return Math.Sqrt(DotProduct(this)); } public override string ToString() { return String.Format("X: {0} Y: {1} Z: {2}", X, Y, Z); } public static Vector operator +(Vector v1, Vector v2) { Vector vr; vr.X = v1.X + v2.X; vr.Y = v1.Y + v2.Y; vr.Z = v1.Z + v2.Z; return vr; } public static Vector operator /(Vector v1, double s) { Vector vr; vr.X = v1.X / s; vr.Y = v1.Y / s; vr.Z = v1.Z / s; return vr; } public static Vector operator -(Vector v1, Vector v2) { Vector vr; vr.X = v1.X - v2.X; vr.Y = v1.Y - v2.Y; vr.Z = v1.Z - v2.Z; return vr; } } public class Lib { public Lib() { } public void gltGetNormalVector(float[] vP1, float[] vP2, float[] vP3, float[] vNormal) { float[] vV1, vV2; vV1 = new float[3]; vV2 = new float[3]; gltSubtractVectors(vP2, vP1, vV1); gltSubtractVectors(vP3, vP1, vV2); gltVectorCrossProduct(vV1, vV2, vNormal); gltNormalizeVector(vNormal); } //********************************************************** // Вычесть один вектор из другого public void gltSubtractVectors(float[] vFirst, float[] vSecond, float[] vResult) { vResult[0] = vFirst[0] - vSecond[0]; vResult[1] = vFirst[1] - vSecond[1]; vResult[2] = vFirst[2] - vSecond[2]; } //********************************************************** // Вычислить векторное произведение двух векторов public void gltVectorCrossProduct(float[] vU, float[] vV, float[] vResult) { vResult[0] = vU[1] * vV[2] - vV[1] * vU[2]; vResult[1] = -vU[0] * vV[2] + vV[0] * vU[2]; vResult[2] = vU[0] * vV[1] - vV[0] * vU[1]; } //********************************************************** // Привести вектор к единичной длине (нормировать) public void gltNormalizeVector(float[] vNormal) { float fLength = 1.0f / (float)Math.Sqrt(vNormal[0] * vNormal[0] + vNormal[1] * vNormal[1] + vNormal[2] * vNormal[2]); gltScaleVector(vNormal, fLength); } //********************************************************** // Умножить вектор на скаляр public void gltScaleVector(float[] vVector, float fScale) { vVector[0] = fScale; vVector[1] *= fScale; vVector[2] *= fScale; } public void gltMakeShadowMatrix(float[] Point1, float[] Point2, float[] Point3, float[] vLightPos, float[] destMat) { float[] vPlaneEquation = new float[4]; float dot; gltGetPlaneEquation(Point1, Point2, Point3, vPlaneEquation); // Вычисляет скалярное произведение направляющего вектора плоскости // и вектора положения источника света dot = vPlaneEquation[0] * vLightPos[0] + vPlaneEquation[1] * vLightPos[1] + vPlaneEquation[2] * vLightPos[2] + vPlaneEquation[3] * vLightPos[3]; // Формируем матрицу проекции // Первый столбец destMat[0] = dot - vLightPos[0] * vPlaneEquation[0]; destMat[4] = 0.0f - vLightPos[0] * vPlaneEquation[1]; destMat[8] = 0.0f - vLightPos[0] * vPlaneEquation[2]; destMat[12] = 0.0f - vLightPos[0] * vPlaneEquation[3]; // Второй столбец destMat[1] = 0.0f - vLightPos[1] * vPlaneEquation[0]; destMat[5] = dot - vLightPos[1] * vPlaneEquation[1]; destMat[9] = 0.0f - vLightPos[1] * vPlaneEquation[2]; destMat[13] = 0.0f - vLightPos[1] * vPlaneEquation[3]; // Третий столбец destMat[2] = 0.0f - vLightPos[2] * vPlaneEquation[0]; destMat[6] = 0.0f - vLightPos[2] * vPlaneEquation[1]; destMat[10] = dot - vLightPos[2] * vPlaneEquation[2]; destMat[14] = 0.0f - vLightPos[2] * vPlaneEquation[3]; // Четвертый столбец destMat[3] = 0.0f - vLightPos[3] * vPlaneEquation[0]; destMat[7] = 0.0f - vLightPos[3] * vPlaneEquation[1]; destMat[11] = 0.0f - vLightPos[3] * vPlaneEquation[2]; destMat[15] = dot - vLightPos[3] * vPlaneEquation[3]; } // Возвращает коэффициенты уравнения плоскости по трем точкам public void gltGetPlaneEquation(float[] vPoint1, float[] vPoint2, float[] vPoint3, float[] vPlane) { // Вычислить вектор нормали gltGetNormalVector(vPoint1, vPoint2, vPoint3, vPlane); vPlane[3] = -(vPlane[0] * vPoint3[0] + vPlane[1] * vPoint3[1] + vPlane[2] * vPoint3[2]); } } } class LoadData using System; using System.Collections.Generic; using System.Text; using System.Xml.Serialization; using System.IO; public class LoadData { public ForXML forXML; public LoadData() { } private void CreateData(string filename) { XmlSerializer serializer = new XmlSerializer(typeof(ForXML)); TextWriter writer = new StreamWriter(filename); ForXML Data = new ForXML(); int i = 0; InstantData instData = new InstantData(); instData.x = i++; instData.y = i++; instData.z = i++; Data.data.Add(instData); serializer.Serialize(writer, Data); writer.Close(); } public void ReadPO(string filename) { XmlSerializer serializer = new XmlSerializer(typeof(ForXML)); serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode); serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute); FileStream fs = new FileStream(filename, FileMode.Open); forXML = (ForXML)serializer.Deserialize(fs); fs.Close(); } private void serializer_UnknownNode(object sender, XmlNodeEventArgs e) { Console.WriteLine("Unknown Node:" + e.Name + "\t" + e.Text); } private void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e) { System.Xml.XmlAttribute attr = e.Attr; Console.WriteLine("Unknown attribute " + attr.Name + "='" + attr.Value + "'"); } } class Property using System; using System.Collections.Generic; using System.Text; using System.Data; using System.IO; using System.Xml.Serialization; using System.Runtime.Serialization; using System.Windows.Forms; namespace Самолет { public class Property { public string dataFile; public string modelFile; public int particleNumber; public bool particleState; public bool glideState; public bool deviationState; public bool planeState; public CVertex3f explosion; public float transparency; public float V0; public float H0; public float R0; public CVertex3f beginGlide; public CVertex3f endGlide; } class LoadProperty { public Property property; public Property defProperty; public LoadProperty() { defProperty = new Property(); defProperty.dataFile = "default.xml"; defProperty.modelFile = "tu154.3DS"; defProperty.particleNumber = 15000; defProperty.particleState = true; defProperty.glideState = false; defProperty.deviationState = false; defProperty.planeState = false; defProperty.explosion = new CVertex3f(0.0f, 0.0f, 0.0f); defProperty.V0 = 20.0f; defProperty.H0 = 600.0f; defProperty.R0 = 1000.0f; defProperty.transparency = 0.3f; defProperty.beginGlide = new CVertex3f(0.0f, 0.0f, 0.0f); defProperty.endGlide = new CVertex3f(-1000.0f, 46.44f, 0.0f); } public Property Load() { XmlSerializer xmlser = new XmlSerializer(typeof(Property)); string filename = System.Environment.CurrentDirectory + "\\applicationSettings.xml"; FileStream filestream= null; property = defProperty; try { filestream = new FileStream(filename, FileMode.Open); property = (Property)xmlser.Deserialize(filestream); if (!File.Exists(property.dataFile)) { MessageBox.Show("Файла" + property.dataFile + " не существует"); property.dataFile = defProperty.dataFile; } if (!File.Exists(property.modelFile)) { MessageBox.Show("Файла" + property.modelFile + " не существует"); property.modelFile = defProperty.modelFile; } } catch (FileNotFoundException ae) { MessageBox.Show("Файл конфигурации не найден"); WriteProperty(defProperty); } catch (InvalidOperationException ae) { MessageBox.Show("Неправильный формат данных"); WriteProperty(defProperty); } finally { if (filestream != null) filestream.Close(); } return property; } public void WriteProperty(Property pr) { XmlSerializer serializer = new XmlSerializer(typeof(Property)); TextWriter writer = new StreamWriter("applicationSettings.xml"); serializer.Serialize(writer,pr); writer.Close(); } private void serializer_UnknownNode(object sender, XmlNodeEventArgs e) { Console.WriteLine("Unknown Node:" + e.Name + "\t" + e.Text); } private void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e) { System.Xml.XmlAttribute attr = e.Attr; Console.WriteLine("Unknown attribute " + attr.Name + "='" + attr.Value + "'"); } } } |
Дипломная работа Мамзеров Д. В., навигация и интерфейс в средах виртуальной реальности, дипломная работа | Дипломная работа по теме: “ Интерактивная база данных по дендроклиматологии” Работу Моя дипломная работа очень актуальна, потому что дендроклиматология – малоизученная и малоизвестная область биологии. Дендроклиматология... | ||
Дипломная работа содержит 104 листа, 6 таблиц, 35 рисунков. Тема:... Данная дипломная работа посвящена проблемам разработки и внедрения устройств связи высокочастотного и сверхвысокочастотного диапазона.... | Название организации Заголовок «Дипломная работа» или «Курсовая работа»: Times New Roman, 14 (вопреки П. 113), по центру. Затем – 2 пустые строки | ||
Реферат. Содержание Дипломная работа (далее просто работа) выполняется на листах формата А4 с размерами полей: сверху – 20 мм, снизу – 20мм, справа –... | 2 требования к содержанию работы Дипломная работа (далее просто работа) выполняется на листах формата А4 с соблюдением следующих размеров полей: правое – 10 мм, верхнее... | ||
Дипломная работа | Реферат. Содержание Дипломная работа (далее просто работа) выполняется на листах формата А4 с размерами полей: сверху – 20 мм, снизу –20мм, справа- 15мм,... | ||
Дипломная работа пгу 030501 | Книга 1 Объем работы – реферат от 12 до 25 печатных листов, курсовая работа – от 20 до 30 страниц, дипломная работа 60-70 страниц компьютерного... | ||
Требования к дипломной работе учащихся 10 11-х классов Дипломная работа заключительная работа учебно-исследовательского характера, выполняемая оканчивающими университеты, экономические,... | Латинские заимствования в современном русском литературном языке (дипломная работа) | ||
Дипломная работа Создание программы помогающей изучать английский язык | Дипломная работа на тему: «Совершенствование организации поддержки... Дипломная работа «Совершенствование организации поддержки и развития малого предпринимательства в муниципальном районе на примере... | ||
Дипломная работа Соответствие современной интернет-рекламы психологическим особенностям подростков | Дипломная работа не менее 65 страниц без приложения Курсовая работа выполняется на одной стороне листа белой бумаги формата А4 (210 Х 297 мм). Иллюстрированный материал (таблицы, схемы,... |