C# PointBetween
Dark Mode
In this section were going to finish the PointBetween class and create Unit Tests for it.
Let’ start of by defining a new Interface and Class for PointBetween.
//IPointBetween.cs
using GeometryCoreProject.WireframeBaseInterfaces;
namespace GeometryTypesProject.GeometryTypesInterfaces
{
public interface IPointBetween : IPointBase3D
{
IPointBase3D RefPoint1 { get;}
IPointBase3D RefPoint2 { get;}
bool Orientation { get; }
void SetRefPoint1(IPointBase3D iRefPoint);
void SetRefPoint2(IPointBase3D iRefPoint);
void SetRefPoints(IPointBase3D iRefPoint1, IPointBase3D iRefPoint2);
void SetOrientation(bool iOrientation);
void SetRatio(double iRatio);
double GetRatio();
}
}Then implement the PointBetween Class.
//PointBetween.cs
using GeometryCoreProject.WireframeBaseClasses;
using GeometryCoreProject.WireframeBaseInterfaces;
using GeometryTypesProject.GeometryTypesInterfaces;
using System;
namespace GeometryTypesProject.GeometryTypesClasses
{
public class PointBetween : PointBase3D, IPointBetween
{
double _Ratio = 0.5;
IVectorBase3D _RefVector
{
get
{
IVectorBase3D ReturnVector = new VectorBase3D();
ReturnVector.I = (this.RefPoint2.X - this.RefPoint1.X);
ReturnVector.J = (this.RefPoint2.Y - this.RefPoint1.Y);
ReturnVector.K = (this.RefPoint2.Z - this.RefPoint1.Z);
return ReturnVector;
}
}
public IPointBase3D RefPoint1 { get; private set; } = null;
public IPointBase3D RefPoint2 { get; private set; } = null;
public bool Orientation { get; private set; } = true;
public PointBetween() { }
public PointBetween(IPointBase3D iPoint1, IPointBase3D iPoint2)
{
this.RefPoint1 = iPoint1;
this.RefPoint2 = iPoint2;
IPointBase3D TranslatedPoint = this.TranslatePointAlongVector(this.RefPoint1, this._RefVector, this._RefVector.Magnitude * this._Ratio);
this.SetCoordinates(TranslatedPoint.GetCoordinates());
}
public PointBetween(IPointBase3D iPoint1, IPointBase3D iPoint2, double iRatio)
{
this.RefPoint1 = iPoint1;
this.RefPoint2 = iPoint2;
this.SetRatio(iRatio);
IPointBase3D TranslatedPoint = this.TranslatePointAlongVector(this.RefPoint1, this._RefVector, this._RefVector.Magnitude * this._Ratio);
this.SetCoordinates(TranslatedPoint.GetCoordinates());
}
public PointBetween(IPointBase3D iPoint1, IPointBase3D iPoint2, double iRatio, bool iOrientation)
{
this.RefPoint1 = iPoint1;
this.RefPoint2 = iPoint2;
this.SetRatio(iRatio);
double CurrentRatio = (iOrientation == true) ? iRatio : 1 - iRatio;
IPointBase3D TranslatedPoint = this.TranslatePointAlongVector(this.RefPoint1, this._RefVector, this._RefVector.Magnitude * CurrentRatio);
this.SetCoordinates(TranslatedPoint.GetCoordinates());
}
public void SetRefPoint1(IPointBase3D iRefPoint)
{
this.RefPoint1 = iRefPoint;
this.UpdateThis();
}
public void SetRefPoint2(IPointBase3D iRefPoint)
{
this.RefPoint2 = iRefPoint;
this.UpdateThis();
}
public void SetRefPoints(IPointBase3D iRefPoint1, IPointBase3D iRefPoint2)
{
this.RefPoint1 = iRefPoint1;
this.RefPoint2 = iRefPoint2;
this.UpdateThis();
}
public void SetOrientation(bool iOrientation)
{
this.Orientation = iOrientation;
this.UpdateThis();
}
public double GetRatio()
{
return this._Ratio;
}
public void SetRatio(double iRatio)
{
if (Math.Abs(iRatio) > 1 || iRatio < 0) { throw new Exception("Ratio Value Must be Between 0 and 1."); }
this._Ratio = (this.Orientation == true) ? iRatio : 1 - iRatio;
this.UpdateThis();
}
void UpdateThis()
{
IPointBase3D RefPoint = (this.Orientation == true) ? this.RefPoint1 : this.RefPoint2;
IVectorBase3D RefVector = (this.Orientation == true) ? this._RefVector : this._RefVector.InverseVector;
IPointBase3D TranslatedPoint = this.TranslatePointAlongVector(RefPoint, RefVector, this._RefVector.Magnitude * this._Ratio);
this.SetCoordinates(TranslatedPoint.GetCoordinates());
}
}
}
Then in the IWireframeFactory Interface and Class, we’ll add a new method for AddNewPointBetween
//IWireframeFactory.cs
using GeometryCoreProject.WireframeBaseInterfaces;
using GeometryTypesProject.GeometryTypesInterfaces;
namespace GeometryFactoriesProject.FactoryBaseInterfaces
{
public interface IWireframeFactory
{
IPointBetween AddNewPointBetween(IPointBase3D iPoint1, IPointBase3D iPoint2, double iRatio = 0.5, bool Orientation = true);
IPointByCoordinates AddNewPointCoord(double iX, double iY, double iZ);
IPointByCoordinates AddNewPointCoordWithReference(double iX, double iY, double iZ, IPointBase3D iRefPoint = null, IAxisSystemBase3D iRefAxisSystem = null);
}
}Then in the WireframeFactory Class we will define the new method for AddNewPointBetween
//WireframeFactory.cs
using GeometryCoreProject.WireframeBaseInterfaces;
using GeometryFactoriesProject.FactoryBaseInterfaces;
using GeometryTypesProject.GeometryTypesClasses;
using GeometryTypesProject.GeometryTypesInterfaces;
namespace GeometryFactoriesProject.FactoryBaseClasses
{
public class WireframeFactory : IWireframeFactory
{
public IPointBetween AddNewPointBetween(IPointBase3D iPoint1, IPointBase3D iPoint2, double iRatio = 0.5, bool iOrientation = true)
{
return new PointBetween(iPoint1, iPoint2, iRatio, iOrientation);
}
public IPointByCoordinates AddNewPointCoord(double iX, double iY, double iZ)
{
return new PointByCoordinates(iX,iY,iZ);
}
public IPointByCoordinates AddNewPointCoordWithReference(double iX, double iY, double iZ, IPointBase3D iRefPoint = null, IAxisSystemBase3D iRefAxisSystem = null)
{
if(iRefPoint == null && iRefAxisSystem ==null)
{
return new PointByCoordinates(iX, iY, iZ);
}
else
{
if (iRefPoint == null)
{
return new PointByCoordinates(iX, iY, iZ, iRefAxisSystem);
}
else if (iRefAxisSystem == null)
{
return new PointByCoordinates(iX, iY, iZ, iRefPoint);
}
else
{
return new PointByCoordinates(iX, iY, iZ, iRefPoint, iRefAxisSystem);
}
}
}
}
}
And finally we need to define a Unit Test Class, to do this we need to add a new Class to the existing PointConstructors Unit Test Folder.

We can now fully define the unit tests for PointBetween
//PointBetweenUnitTest.cs
using GeometryFactoriesProject.FactoryBaseClasses;
using GeometryTypesProject.GeometryTypesInterfaces;
using System;
using Xunit;
using FluentAssertions;
namespace GeometryUnitTestsProject.PointConstructors
{
public class PointBetweenUnitTest
{
// Create an Instance of the Factory
WireframeFactory _WireframeFactory = new WireframeFactory();
IPointByCoordinates _PointByCoordinates1 = null;
IPointByCoordinates _PointByCoordinates2 = null;
// Constructor
public PointBetweenUnitTest()
{
this._PointByCoordinates1 = this._WireframeFactory.AddNewPointCoord(10,10,10);
this._PointByCoordinates2 = this._WireframeFactory.AddNewPointCoord(100, 100, 100);
}
[Fact]
// Create Point at 55,55,55
public void PointBetweenTest1()
{
// Create an Instance of the IPointByCoordinates
IPointBetween PointBetween = this._WireframeFactory.AddNewPointBetween(this._PointByCoordinates1, this._PointByCoordinates2);
// Test the Point X,Y,Z Values
PointBetween.X.Should().Be(55);
PointBetween.Y.Should().Be(55);
PointBetween.Z.Should().Be(55);
}
[Fact]
// Create Point at 32.5,32.5,32.5
public void PointBetweenTest2()
{
// Create an Instance of the IPointByCoordinates
IPointBetween PointBetween = this._WireframeFactory.AddNewPointBetween(this._PointByCoordinates1, this._PointByCoordinates2, 0.25);
// Test the Point X,Y,Z Values
PointBetween.X.Should().Be(32.5);
PointBetween.Y.Should().Be(32.5);
PointBetween.Z.Should().Be(32.5);
}
[Fact]
// Create Point at 77.5,77.5,77.5 by Inverting the Ratio
public void PointBetweenTest3()
{
// Create an Instance of the IPointByCoordinates
IPointBetween PointBetween = this._WireframeFactory.AddNewPointBetween(this._PointByCoordinates1, this._PointByCoordinates2, 0.25,false);
// Test the Point X,Y,Z Values
PointBetween.X.Should().Be(77.5);
PointBetween.Y.Should().Be(77.5);
PointBetween.Z.Should().Be(77.5);
}
[Fact]
/* Create Point at 32.5,32.5,32.5
Then Invert Orientation*/
public void PointBetweenTest4()
{
// Create an Instance of the IPointByCoordinates
IPointBetween PointBetween = this._WireframeFactory.AddNewPointBetween(this._PointByCoordinates1, this._PointByCoordinates2, 0.25);
PointBetween.SetOrientation(false);
// Test the Point X,Y,Z Values
PointBetween.X.Should().Be(77.5);
PointBetween.Y.Should().Be(77.5);
PointBetween.Z.Should().Be(77.5);
}
[Fact]
/* Create Point at 32.5,32.5,32.5
Then Change the Ratio to 0.75*/
public void PointBetweenTest5()
{
// Create an Instance of the IPointByCoordinates
IPointBetween PointBetween = this._WireframeFactory.AddNewPointBetween(this._PointByCoordinates1, this._PointByCoordinates2, 0.25);
PointBetween.SetRatio(0.75);
// Test the Point X,Y,Z Values
PointBetween.X.Should().Be(77.5);
PointBetween.Y.Should().Be(77.5);
PointBetween.Z.Should().Be(77.5);
}
[Fact]
/* Create Point at 32.5,32.5,32.5
Then Change the Ratio to 0.75*/
public void PointBetweenTest6()
{
// Create an Instance of the IPointByCoordinates
IPointBetween PointBetween = this._WireframeFactory.AddNewPointBetween(this._PointByCoordinates1, this._PointByCoordinates2, 0.25);
PointBetween.SetRatio(0.75);
PointBetween.SetOrientation(false);
// Test the Point X,Y,Z Values
PointBetween.X.Should().Be(32.5);
PointBetween.Y.Should().Be(32.5);
PointBetween.Z.Should().Be(32.5);
}
[Fact]
/* Create Point at 32.5,32.5,32.5
Then Replace Point 1*/
public void PointBetweenTest7()
{
// Create an Instance of the IPointByCoordinates
IPointBetween PointBetween = this._WireframeFactory.AddNewPointBetween(this._PointByCoordinates1, this._PointByCoordinates2, 0.25);
// Create a New Point to Replace Point 1
IPointByCoordinates PointByCoordinates1New = this._WireframeFactory.AddNewPointCoord(25, 250, 2.5);
PointBetween.SetRefPoint1(PointByCoordinates1New);
// Test the Point X,Y,Z Values
PointBetween.X.Should().Be(43.75);
PointBetween.Y.Should().Be(212.5);
PointBetween.Z.Should().Be(26.875);
}
[Fact]
/* Create Point at 32.5,32.5,32.5
Then Replace Point 1
Then Repalce Point 2
Change the Ratio to .75
Invert the Orientation*/
public void PointBetweenTest8()
{
// Create an Instance of the IPointByCoordinates
IPointBetween PointBetween = this._WireframeFactory.AddNewPointBetween(this._PointByCoordinates1, this._PointByCoordinates2, 0.25);
// Create a New Point to Replace Point 1
IPointByCoordinates PointByCoordinates1New = this._WireframeFactory.AddNewPointCoord(25, 250, 2.5);
PointBetween.SetRefPoint1(PointByCoordinates1New);
// Create a New Point to Replace Point 2
PointBetween.SetRefPoint2(this._PointByCoordinates1);
// Change the Ratio
PointBetween.SetRatio(0.75);
// Change the Orientation
PointBetween.SetOrientation(false);
// Test the Point X,Y,Z Values
PointBetween.X.Should().Be(21.25);
PointBetween.Y.Should().Be(190);
PointBetween.Z.Should().Be(4.375);
}
[Fact]
/* Create Point at 32.5,32.5,32.5
Then Change the Ratio to 1.5 to throw an Error*/
public void PointBetweenTest9()
{
// Create an Instance of the IPointByCoordinates
IPointBetween PointBetween = this._WireframeFactory.AddNewPointBetween(this._PointByCoordinates1, this._PointByCoordinates2, 0.25);
//Set the ReferencePoint
Action comparison = () => { PointBetween.SetRatio(1.5); };
comparison.Should().Throw<Exception>();
}
}
}