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.csproj" />
</ItemGroup>

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

namespace BoringVector.Tests
{
public class TestVector
{
[Fact]
public void TestEmptyVectorLength()
{
Vector v = new Vector();
Assert.Equal(0.0, v.SquareLength());
}

[Theory]
[InlineData(3, 4, 25)]
[InlineData(5, -6, 25 + 36)]
public void TestVectorLength(double x, double y, double length)
{
Vector v = new Vector() { X = x, Y = y };
Assert.Equal(length, v.SquareLength());
}

[Fact]
public void TestVectorAdd()
{
Vector v1 = new Vector() { X = 3, Y = 4 };
Vector v2 = new Vector() { X = 2, Y = -2 };
Vector sum = v1.Add(v2);
Assert.Equal(5.0, sum.X);
Assert.Equal(2.0, sum.Y);
}

[Fact]
public void TestVectorScale()
{
Vector v = new Vector() { X = 3, Y = -4 };
Vector scaled = v.Scale(-2);
Assert.Equal(-6, scaled.X);
Assert.Equal(8.0, scaled.Y);
}

[Fact]
public void TestVectorDotProduct()
{
Vector v1 = new Vector() { X = 3, Y = 4 };
Vector v2 = new Vector() { X = 2, Y = -2 };
Assert.Equal(3 * 2 - 4 * 2, v1.DotProduct(v2));
}

[Fact]
public void TestVectorCrossProduct()
{
Vector v1 = new Vector() { X = 3, Y = 4 };
Vector v2 = new Vector() { X = 2, Y = -2 };
Assert.Equal(-3 * 2 - 4 * 2, v1.CrossProduct(v2));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27004.2002
# Visual Studio Version 16
VisualStudioVersion = 16.0.31005.135
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("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BoringVector.Tests", "BoringVector.Tests\BoringVector.Tests.csproj", "{4E727AC5-1465-493E-9A2D-07D951651867}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand All @@ -15,6 +17,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
{4E727AC5-1465-493E-9A2D-07D951651867}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4E727AC5-1465-493E-9A2D-07D951651867}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4E727AC5-1465-493E-9A2D-07D951651867}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4E727AC5-1465-493E-9A2D-07D951651867}.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,7 @@
using System;
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("BoringVector.Tests")]

namespace BoringVector
{
Expand All @@ -10,55 +13,138 @@ Реализуй структуру Vector - см. комментарии вну

internal struct Vector
{
/*
Vector задается парой вещественных координат X и Y.
*/

/// <summary>
/// Координаты вектора
/// </summary>
public double X, Y;

/*
На месте заглушек добавь реализацию базовых методов вектора:
- квадрат длины
- сумма векторов
- умножение на коэффициент
- скалярное произведение
- векторное произведение (= площадь параллелограмма)
*/

/// <summary>
/// Квадрат длины вектора
/// </summary>
/// <returns>квадрат длины вектора</returns>
public double SquareLength()
{
throw new NotImplementedException();
return X * X + Y * Y;
}

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

/*
Переопредели ниже метод ToString - пусть выводит (X; Y)
*/
/// <summary>
/// Котиковое представление вектора
/// </summary>
/// <returns>Строковое представление вектора для котика</returns>
public override string ToString()
{
return string.Format("({0:f}; {1:f})", X, Y);
}

#region operators
/// <summary>
/// Сложение двух векторов
/// </summary>
/// <param name="a">Вектор a</param>
/// <param name="b">Вектор b</param>
/// <returns>Вектор равный a+b</returns>
public static Vector operator +(Vector a, Vector b)
{
return a.Add(b);
}

/*
Реализуй также следущие операторы (Vector v, u и double k):
- v + u, v - u
- k * v, v * k, v / k
- +v, -v
*/
/// <summary>
/// Вычитание двух векторов
/// </summary>
/// <param name="a">Вектор a</param>
/// <param name="b">Вектор b</param>
/// <returns>Вектор равный a-b</returns>
public static Vector operator -(Vector a, Vector b)
{
return new Vector { X = a.X - b.X, Y = a.Y - b.Y };
}

/// <summary>
/// Умножение вектора на число
/// </summary>
/// <param name="a">Вектор</param>
/// <param name="k">Число</param>
/// <returns>Вектор равный a*k</returns>
public static Vector operator *(Vector a, double k)
{
return a.Scale(k);
}

/// <summary>
/// Умножение вектора на число
/// </summary>
/// <param name="k">Число</param>
/// <param name="a">Вектор</param>
/// <returns>Вектор равный k*a</returns>
public static Vector operator *(double k, Vector a)
{
return a.Scale(k);
}

/// <summary>
/// Деление вектора на число
/// </summary>
/// <param name="a">Вектор</param>
/// <param name="k">Число, не должно быть нулем</param>
/// <returns>Вектор равный a/k</returns>
public static Vector operator /(Vector a, double k)
{
return a.Scale(checked(1 / k));
}


/// <summary>
/// Вектор, обратный данному
/// </summary>
/// <param name="a">Вектор</param>
/// <returns>Вектор равный -a</returns>
public static Vector operator -(Vector a)
{
return a.Scale(-1);
}

public static Vector operator +(Vector a)
{
return a;
}

#endregion
}

#endregion
Expand Down Expand Up @@ -110,6 +196,7 @@ Ты мог(-ла) заметить, что в предыдущих задани
Правилом хорошего тона считается писать комментарии к методам, классам и другим сущностям, используя данный синтаксис - так ты и комментируешь их, и документируешь.
Внутри методов он не поддерживается, поэтому там только обычные (// или /*).


Ниже приведены примеры простейших комментариев. Если наведете мышкой на название метода DoNothing, увидишь,
что студия отображает комментарий в подписи (в других IDE из коробки без плагинов это вряд ли будет работать).
Если навести на аргумент метода DoNothing - something, увидишь комментарий к нему.
Expand Down Expand Up @@ -174,6 +261,7 @@ который будет содержать класс с набором тес
Особо не заморачивайся с тем, чтобы оттестировать все возможные специальные случаи - в данном задании важно, чтобы
ты просто разобрался(-ась), как писать автотесты и как их запускать. Это задание НЕ на то, как писать хорошие тесты.


Примечание: структура Vector описана как internal структура, поэтому по умолчанию сборке BoringVector.Tests она не видна.
Чтобы она была видна, существует специальная директива компилятору:
[assembly: InternalsVisibleTo("XXX")]
Expand All @@ -186,8 +274,7 @@ ты просто разобрался(-ась), как писать автот

#endregion


/*
На этом все. Время делать пулл реквест и наслаждаться заслуженным отдыхом :)
*/
}
}
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,57 @@
- GetAngleBetween: возвращает угол между двумя векторами в радианах. Примечание: нулевой вектор сонаправлен любому другому.
- GetRelation: возвращает значение перечесления VectorRelation(General, Parallel, Orthogonal) - отношение между двумя векторами("общий случай", параллельны, перпендикулярны). Перечисление задавать тоже тебе)
*/


internal enum VectorRelation
{
General,
Parallel,
Orthogonal
}

internal static class VectorExtention
{
private const double Epsilon = 1e-6;

internal static bool IsZero(this Vector v)
{
return Math.Abs(v.X) < Epsilon && Math.Abs(v.Y) < Epsilon;
}

internal static Vector Normalize(this Vector v)
{
return v / Math.Sqrt(v.SquareLength());
}

internal static double GetAngleBetween(this Vector a, Vector b)
{
if (a.IsZero() || b.IsZero())
{
return 0;
}
return Math.Acos(a.DotProduct(b) / Math.Sqrt(a.SquareLength() * b.SquareLength()));
}

internal static VectorRelation GetRelation(this Vector a, Vector b)
{
double angle = a.GetAngleBetween(b);
if (Math.Abs(angle - Math.PI) < Epsilon)
{
return VectorRelation.Orthogonal;
}
else
{
if (angle < Epsilon || angle > Math.PI + Epsilon)
{
return VectorRelation.Parallel;
}
else
{
return VectorRelation.General;
}
}
}
}

}