Добавлен: 21.10.2018
Просмотров: 2543
Скачиваний: 32
return VehicleCount;
}
public int GetVehicleCount(int aType) // кол-во транспорта определенного типа в городе
{
int res = 0;
//TVehicle vvv = new TVehicle();
foreach (TVehicle vvv in VehicleMassiv)
{
if (vvv.Type() == aType)
res = res + 1;
}
return res;
}
public void test()
{
VehicleMassiv.Add(new TCivilTransport(rnd.Next(1, 40)));
VehicleMassiv.Add(new TCivilTransport(rnd.Next(1, 40)));
VehicleMassiv.Add(new TLorryTransport(rnd.Next(1, 20)));
}
public CityMovement()
{
}
}
}
Диаграмма классов стала выглядеть следующим образом:
Рисунок 21 – Итоговый вариант диаграммы
Создадим интерфейс IObjectInfo для получения информации по состоянию движущегося объекта (т/с).
Рисунок 22 – Диаграмма и методы интерфейса IobjectInfo
using System;
using System.Collections.Generic;
using System.Text;
namespace CityTransport
{
public interface IObjectInfo // интерфейс для получения информации по состоянию движущегося объекта (т/с)
{
int GetX(); // координаты
int GetY();
int GetSpeed(); // текущая скорость
double GetDirection();// направление движения
int GetNoiseLevel();// уровень шума
int GetPolutionLevel(); // уровень загрязнения
int GetVehicleType(); // тип т/с
string GetVehicleTypeStr();// тип т/с в строковом виде
int GetEnergySourceType(); // Тип источника энергии
int GetGoodVolume(); // полезная нагрузка (пассажиры или груз)
}
}
Реализуем интерфейс для классов TCivilTransport и TLorryTransport.
Класс TCivilTransport
using System;
using System.Collections.Generic;
using System.Text;
namespace CityTransport
{
public class TCivilTransport: TVehicle, IObjectInfo // пассажирские транспортные средства
{
private int MaxPeopleCount; // кол-во пассажирских мест
private int PeopleCount; // кол-во пассажиров
public TCivilTransport(int aMaxPeopleCount)
{
MaxPeopleCount = aMaxPeopleCount;
PeopleCount = rnd.Next(1, MaxPeopleCount);
}
public override string GetInfo()
{
string res = base.GetInfo();
res = res + " пассажирский";
return res;
}
// реализация интерфейса IObjectInfo
public int GetX() { return X; }
public int GetY() { return Y; }
public int GetEnergySourceType() { return EnergySource;}
public int GetNoiseLevel() { return NoiseLevel; }
public int GetPolutionLevel() { return PolutionLevel; }
public int GetVehicleType() { return 1; }
public string GetVehicleTypeStr() { return "пассажирский"; }
public int GetGoodVolume() { return PeopleCount; }
public int GetSpeed() { return Speed; }
public double GetDirection() { return Direction;}
}
}
Класс TLorryTransport
using System;
using System.Collections.Generic;
using System.Text;
namespace CityTransport
{
public class TLorryTransport: TVehicle, IObjectInfo // грузовые транспортные средства
{
private int MaxGruzMassa; // грузоподъемность
private int GruzMassa; // масса груза
public TLorryTransport(int aMaxGruzMassa)
{
MaxGruzMassa = aMaxGruzMassa;
GruzMassa = rnd.Next(1, MaxGruzMassa);
}
public override string GetInfo()
{
string res = base.GetInfo();
res = res + " грузовой";
return res;
}
// реализация интерфейса IObjectInfo
public int GetX() {return X;}
public int GetY() { return Y; }
public int GetEnergySourceType() { return EnergySource; }
public int GetNoiseLevel() { return NoiseLevel; }
public int GetVehicleType() { return 2; }
public string GetVehicleTypeStr() { return "грузовой"; }
public int GetGoodVolume() { return GruzMassa; }
public double GetDirection() { return Direction; }
public int GetSpeed() { return Speed; }
public int GetPolutionLevel() { return PolutionLevel; }
}
}
Диаграмма классов после преобразований выглядит следующим образом:
Рисунок 23 – Диаграмма классов
Добавим методы в классы для отрисовки объектов.
В класс TStreet добавим метод Draw для отрисовки улиц. А также новые методы:
FillNoiseLevelMap // определение характера распространения шума по всей длине улицы
FillPolutionLevelMap // определение характера распространения загрязнения по всей длине улицы
GetName //название улицы
GetNoiseLevelView//показывает уровень шума на улице
GetPolutionLevelView//показывает уровень загрязниния на улице
IsTransPortOnStreet//нахождение т/с на улице
Класс Tstreet
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace CityTransport
{
public class TStreet
{
private int Type; // 1- вертикальная (улица), 2- горизонтальная (проспект)
private int X1, X2, Y1, Y2;//координаты улицы
private string Name;//название улицы
private int[] NoiseMap;//карта уровня шума
private int[] PolutionMap;//карта уровня загрязнения
public TStreet (int aX, int aY)//конструктор класса
{
X1 = aX; Y1 = aY;
if (aX == 0) // проспект
{
Type = 2;
X2 = 500; Y2 = Y1;
Name = "Проспект-" + Y1;
NoiseMap = new int[500];
PolutionMap = new int[500];
}
else // улица
{
Type = 1;
X2 = X1; Y2 = 400;
Name = "Улица-" + X1;
NoiseMap = new int[400];
PolutionMap = new int[400];
}
}
public void FillNoiseLevelMap(List<TVehicle> aList) // определение характера распространения шума по всей длине улицы
{
double NoiseLevel = 0; // уровень шума в точке
int L, N; // текущая позиция и максимальная длина улицы
if (Type == 2) // горизонтальная улица
{ L = X1; N = X2; }
else
{ L = Y1; N = Y2; }
while (L < N)
{
foreach (IObjectInfo vvv in aList)
if (IsTransPortOnStreet(vvv))
if (Type == 2)
NoiseLevel = NoiseLevel + vvv.GetNoiseLevel() / Math.Max(1, Math.Abs(L - vvv.GetX()));
else
NoiseLevel = NoiseLevel + vvv.GetNoiseLevel() / Math.Max(1, Math.Abs(L - vvv.GetY()));
if (NoiseLevel < 1)
NoiseMap[L]=0;
else
NoiseMap[L] = Convert.ToInt32 ( NoiseLevel);
NoiseLevel = 0;
L++;
}
}
public string GetNoiseLevelView()
{
string result="";
for (int i = 0; i < NoiseMap.Length; i++)
{
if (NoiseMap[i] == 0) result = result + ".";
else result = result + "[" + NoiseMap[i].ToString() + "]";
}
return result;
}
public void FillPolutionLevelMap (List<TVehicle> aList) // определение характера распространения загрязнений по всей длине улицы
{
double PL = 0; // уровень загрязнения в точке
int L, N; // текущая позиция и максимальная длина улицы
if (Type == 2) // горизонтальная улица
{ L = X1; N = X2; }
else
{ L = Y1; N = Y2; }
while (L < N)
{
foreach (IObjectInfo vvv in aList)
if ((vvv.GetPolutionLevel() > 0) & (IsTransPortOnStreet(vvv)))
if (Type == 2)
{
if (
((Math.Cos(vvv.GetDirection()) == 1) & ((vvv.GetX() - L) <= vvv.GetSpeed()) & (vvv.GetX() >= L)) ||
((Math.Cos(vvv.GetDirection()) == -1) & ((L - vvv.GetX()) <= vvv.GetSpeed()) & (vvv.GetX() <= L))
)
PL = PL + vvv.GetPolutionLevel();
}
else
if (
((Math.Sin(vvv.GetDirection()) == 1) & (((vvv.GetY() - L)) <= vvv.GetSpeed()) & (vvv.GetY() >= L)) ||
((Math.Sin(vvv.GetDirection()) == -1) & (((L - vvv.GetY())) <= vvv.GetSpeed()) & (vvv.GetY() <= L))
)
PL = PL + vvv.GetPolutionLevel();
if (PL < 1)
PolutionMap[L]=0;
else
PolutionMap[L]= Convert.ToInt32 (PL);
PL = 0;
L++;
}
}
public string GetPolutionLevelView()
{
string result = "";
for (int i = 0; i < PolutionMap.Length; i++)
{
if (PolutionMap[i] == 0) result = result + ".";
else result = result + "[" + PolutionMap[i].ToString() + "]";
}
return result;
}
public double PolutionLevel(int L)
{
return 0;
}
public bool IsTransPortOnStreet(IObjectInfo aTransport)//проверка нахождения т/с на улице
{
if ((aTransport.GetX()==X1)||(aTransport.GetY()==Y1))
return true;
else return false;
}
public string GetName()
{
return Name;
}
public void Draw(Graphics G, float sfx, float sfy, bool DrawNoise, bool DrawPolution)//отрисовка улиц с уровнем шума и загрязнением
{
G.DrawLine(new Pen(Color.Blue), X1 * sfx, Y1 * sfy, X2 * sfx, Y2 * sfy);
Pen NoisePen = new Pen(Color.LemonChiffon);
Pen PolutionPen = new Pen(Color.LimeGreen);
if (DrawNoise)
{
if (Type == 1)
for (int i = 0; i < 400; i++)
G.DrawLine(NoisePen, (X1 - NoiseMap[i] * 3) * sfx, i * sfy, X1 * sfx, i * sfy);
else
for (int i = 0; i < 500; i++)
G.DrawLine(NoisePen, i * sfx, (Y1 - NoiseMap[i] * 3) * sfy, i * sfx, Y1 * sfy);
}
if (DrawPolution)
{
if (Type == 1)
for (int i = 0; i < 400; i++)
G.DrawLine(PolutionPen, (X1 + PolutionMap[i] * 3) * sfx, i * sfy, X1 * sfx, i * sfy);
else
for (int i = 0; i < 500; i++)
G.DrawLine(PolutionPen, i * sfx, (Y1 + PolutionMap[i] * 3) * sfy, i * sfx, Y1 * sfy);
}
}
}
}
В класс TVehicle добавим метод Draw для отрисовки улиц. А также новые методы:
ChangeDirection // изменение направления движения
CheckForObgon // проверка на возможность обгона между двумя т/с
GetEnergySource //источник энергии
GetInfo // информация по состоянию т/с
IsTransportOutCity //проверка на выезд т/с за пределы города
Move // перемещение транспортного средства
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace CityTransport
{
public class TVehicle
{
protected int MaxSpeed;// максимальная скорость
protected int PolutionLevel;//уровень загрязнения
protected int NoiseLevel;//уровень шума
protected int EnergySource; // источник энергии 1- внутренний, 0- внешний
protected int Speed, NormalSpeed; // текущая скорость и скорость движения без помех
protected double Direction; // направление движения (в радианах, 0-восток, pi -запад, pi/2 - север)
protected int X, Y; //координаты
protected TStreet Street;//улица
protected Random rnd = new Random();
public TVehicle()//конструктор класса
{
MaxSpeed = rnd.Next(20,40); //максимальная скорость выбирается случайным образом от 20 до 40
NoiseLevel = rnd.Next(1, 20);//уровень шума выбирается случайным образом от 1 до 20
double rrr = rnd.NextDouble();
if (rrr < 0.5)//проверка на источник энергии
{
EnergySource = 0;//источник энергии внешний
PolutionLevel = 0;//уровень шума равен 0
}
else
{
EnergySource = 1;//источник энергии внутренний
PolutionLevel = rnd.Next(1, 10);//уровень шума выбирается случайным образом от 1 до 10
}
Speed = rnd.Next(20,MaxSpeed);//текущая скорость выбирается случайным образом от 20 до максимальной скорости
NormalSpeed = Speed;//скорость движения без помех равна текущей скорости