Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>

<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="1.3.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\BoringVector\BoringVector\BoringVector.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System;
using Xunit;

namespace BoringVector.Tests
{
public class UnitTest1
{
[Theory]
[InlineData(0, 0, 0)]
[InlineData(3, 4, 25)]
[InlineData(0, 1, 1)]
[InlineData(1, 1, 2)]
public void Test_SquareLength(double x, double y, double z)
{
Assert.Equal(new Vector(x, y).SquareLength(), z);
}

[Theory]
[InlineData(0, 0, 0, 0)]
[InlineData(3, 4, 25, 123)]
[InlineData(0, 1, 1, 10)]
[InlineData(1, 5, 1, 2)]
public void Test_Add(double x, double y, double a, double b)
{
var tmp = new Vector(x, y).Add(new Vector(a, b));
Assert.Equal(x + a, tmp.X);
Assert.Equal(y + b, tmp.Y);
}

[Theory]
[InlineData(0, 5, 0)]
[InlineData(4, 25, 123)]
[InlineData(1, 1, 10)]
[InlineData(5, 1, 2)]
public void Test_Scale(double x, double y, double k)
{
var tmp = new Vector(x, y).Scale(k);
Assert.Equal(x * k, tmp.X);
Assert.Equal(y * k, tmp.Y);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27004.2002
# Visual Studio Version 16
VisualStudioVersion = 16.0.31229.75
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BoringVector", "BoringVector\BoringVector.csproj", "{7B438112-6A12-47BC-B494-FF8850924783}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BoringVector", "BoringVector\BoringVector.csproj", "{7B438112-6A12-47BC-B494-FF8850924783}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BoringVector.Tests", "BoringVector.Tests\BoringVector.Tests.csproj", "{F43CA846-71FE-4428-BAD4-A4ADDBF9A784}"
ProjectSection(ProjectDependencies) = postProject
{7B438112-6A12-47BC-B494-FF8850924783} = {7B438112-6A12-47BC-B494-FF8850924783}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand All @@ -15,6 +20,10 @@ Global
{7B438112-6A12-47BC-B494-FF8850924783}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B438112-6A12-47BC-B494-FF8850924783}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B438112-6A12-47BC-B494-FF8850924783}.Release|Any CPU.Build.0 = Release|Any CPU
{F43CA846-71FE-4428-BAD4-A4ADDBF9A784}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F43CA846-71FE-4428-BAD4-A4ADDBF9A784}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F43CA846-71FE-4428-BAD4-A4ADDBF9A784}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F43CA846-71FE-4428-BAD4-A4ADDBF9A784}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System;
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("BoringVector.Tests")]

namespace BoringVector
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,16 @@ namespace BoringVector
/*
Реализуй структуру Vector - см. комментарии внутри нее.
*/

/// <summary>
/// Структура вектора в двумерном пространстве.
/// </summary>
internal struct Vector
{
/*
Vector задается парой вещественных координат X и Y.
*/
/// <summary>
/// Координаты вектора X и Y.
/// </summary>
public readonly double X;
public readonly double Y;


/*
Expand All @@ -23,32 +27,72 @@ Vector задается парой вещественных координат X
- скалярное произведение
- векторное произведение (= площадь параллелограмма)
*/

/// <summary>
/// Констурктор вектора по координатам X и Y.
/// </summary>
/// <param name="x">Координата вектора по Ox.</param>
/// <param name="y">Координата вектора по Oy.</param>
public Vector(double x, double y)
{
X = x;
Y = y;
}
/// <summary>
/// Возвращает квадрат длины вектора.
/// </summary>
/// <returns>Вещественное число.</returns>
public double SquareLength()
{
throw new NotImplementedException();
return X * X + Y * Y;
}
/// <summary>
/// Прибавление другого вектора к исходному.
/// </summary>
/// <param name="v">Вектор.</param>
/// <returns>Результирующий вектор.</returns>
public Vector Add(Vector v)
{
throw new NotImplementedException();
return new Vector(X + v.X, Y + v.Y);
}
/// <summary>
/// Умножение вектора на коэффициент k.
/// </summary>
/// <param name="k">Коэффициент.</param>
/// <returns>Результирующий вектор.</returns>
public Vector Scale(double k)
{
throw new NotImplementedException();
return new Vector(k * X, k * Y);
}
/// <summary>
/// Скалярное произведение векторов.
/// </summary>
/// <param name="v">Вектор, с которым происхоит умножение.</param>
/// <returns>Вещественное число.</returns>
public double DotProduct(Vector v)
{
throw new NotImplementedException();
return X * v.X + Y * v.Y;
}
/// <summary>
/// Векторное произведение векторов.
/// </summary>
/// <param name="v">Вектор, с которым происхоит умножение.</param>
/// <returns>Вещественное число.</returns>
public double CrossProduct(Vector v)
{
throw new NotImplementedException();
return X * v.Y - Y * v.X;
}

/*
Переопредели ниже метод ToString - пусть выводит (X; Y)
*/

/// <summary>
/// Вектор в формате (X; Y).
/// </summary>
/// <returns>Строка.</returns>
public override string ToString()
{
return String.Format("({0}; {1})", X, Y);
}
#region operators

/*
Expand All @@ -57,6 +101,76 @@ Реализуй также следущие операторы (Vector v, u и
- k * v, v * k, v / k
- +v, -v
*/
/// <summary>
/// Вычисление суммы векторов.
/// </summary>
/// <param name="v">Первый вектор.</param>
/// <param name="u">Второй вектор.</param>
/// <returns>Результирующий вектор от суммы.</returns>
public static Vector operator +(Vector v, Vector u)
{
return v.Add(u);
}
/// <summary>
/// Вычисление разности векторов.
/// </summary>
/// <param name="v">Первый вектор.</param>
/// <param name="u">Второй вектор.</param>
/// <returns>Результирующий вектор от разности.</returns>
public static Vector operator -(Vector v, Vector u)
{
return v.Add(u.Scale(-1));
}
/// <summary>
/// Умножение вектора на коэффициент.
/// </summary>
/// <param name="v">Исходный вектор.</param>
/// <param name="k">Коэффициент.</param>
/// <returns>Результирующий вектор от уможения.</returns>
public static Vector operator *(Vector v, double k)
{
return v.Scale(k);
}
/// <summary>
/// Умножение вектора на коэффициент.
/// </summary>
/// <param name="k">Коэффициент.</param>
/// <param name="v">Исходный вектор.</param>
/// <returns>Результирующий вектор от уможения.</returns>
public static Vector operator *(double k, Vector v)
{
return v.Scale(k);
}
/// <summary>
/// Деление вектора на коэффициент.
/// </summary>
/// <param name="v">Исходный вектор.</param>
/// <param name="k">Коэффициент.</param>
/// <returns>Результирующий вектор от деления.</returns>
public static Vector operator /(Vector v, double k)
{
if (k == 0)
throw new DivideByZeroException();
return v.Scale(1 / k);
}
/// <summary>
/// Возвращает вектор.
/// </summary>
/// <param name="v">Исходный вектор.</param>
/// <returns>Исходынй вектор.</returns>
public static Vector operator +(Vector v)
{
return v;
}
/// <summary>
/// Возвращает противоположный вектор.
/// </summary>
/// <param name="v">Исходынй вектор.</param>
/// <returns>Противоположный вектор.</returns>
public static Vector operator -(Vector v)
{
return v.Scale(-1);
}

#endregion
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace BoringVector
using System;

namespace BoringVector
{
/*
Здесь тебе нужно написать класс с методами-расширениями структуры Vector:
Expand All @@ -7,4 +9,77 @@
- GetAngleBetween: возвращает угол между двумя векторами в радианах. Примечание: нулевой вектор сонаправлен любому другому.
- GetRelation: возвращает значение перечесления VectorRelation(General, Parallel, Orthogonal) - отношение между двумя векторами("общий случай", параллельны, перпендикулярны). Перечисление задавать тоже тебе)
*/

/// <summary>
/// Расширяющий класс Vector.
/// </summary>
internal static class VectorExtensions
{
/// <summary>
/// Эпсилон.
/// </summary>
private const double eps = 1e-6;
/// <summary>
/// Перечисления - отношение между двумя векторами("общий случай", параллельны, перпендикулярны).
/// </summary>
internal enum VectorRelation
{
General, Parallel, Orthogonal
}
/// <summary>
/// Проверяет, является ли вектор нулевым.
/// </summary>
/// <param name="v">Исходный вектор.</param>
/// <returns>True, если вектор нулевой, иначе False</returns>
public static bool IsZero(this Vector v)
{
return Math.Abs(v.X) < eps && Math.Abs(v.Y) < eps;
}
/// <summary>
/// Нормализует вектор (если он не нулевой).
/// </summary>
/// <param name="v">Исходный вектор.</param>
/// <returns>Нормализованный вектор.</returns>
public static Vector Normalize(this Vector v)
{
if (IsZero(v))
return v;
return v / Math.Sqrt(v.SquareLength());
}
/// <summary>
/// Вычисление угла между векторами.
/// </summary>
/// <param name="v">Первый вектор.</param>
/// <param name="u">Второй.</param>
/// <returns>Угол между векторами в радианах от 0 до PI.</returns>
public static double GetAngleBetween(this Vector v, Vector u)
{
if (IsZero(v) || IsZero(u))
{
return 0;
}

return Math.Acos(Normalize(v).DotProduct(Normalize(u)));
}
/// <summary>
/// Вычисление отношения между двумя заданными векторами.
/// </summary>
/// <param name="v">Первый вектор.</param>
/// <param name="u">Второй вектор.</param>
/// <returns>Отношение между двумя векторами("общий случай", параллельны, перпендикулярны).</returns>
public static VectorRelation GetRelation(this Vector v, Vector u)
{
var ang = GetAngleBetween(v, u);

if (ang < eps || Math.PI - ang < eps)
{
return VectorRelation.Parallel;
}
if (Math.Abs(Math.PI / 2 - ang) < eps)
{
return VectorRelation.Orthogonal;
}
return VectorRelation.General;
}
}
}