public gEdge(gVertex start, gVertex end) { StartVertex = start; EndVertex = end; Length = StartVertex.DistanceTo(EndVertex); Direction = gVector.ByTwoVertices(StartVertex, EndVertex); }
internal gVertex Translate(gVector vector, double distance) { gVector normalized = vector.Normalized(); gVector distVector = normalized * distance; return(this.Translate(distVector)); }
public bool IsCoplanarTo(gEdge edge) { // http://mathworld.wolfram.com/Coplanar.html gVector a = this.Direction; gVector b = edge.Direction; gVector c = gVector.ByTwoVertices(this.StartVertex, edge.StartVertex); return(c.Dot(a.Cross(b)) == 0); }
public double DistanceTo(gEdge edge) { // http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html gVector v1 = gVector.ByTwoVertices(this, edge.StartVertex); gVector v2 = gVector.ByTwoVertices(this, edge.EndVertex); gVector numerator = v1.Cross(v2); gVector denominator = gVector.ByTwoVertices(edge.EndVertex, edge.StartVertex); return(numerator.Length / denominator.Length); }
public gVector Cross(gVector vector) { double x = (this.Y * vector.Z) - (this.Z * vector.Y); double y = (this.Z * vector.X) - (this.X * vector.Z); double z = (this.X * vector.Y) - (this.Y * vector.X); double angle = ToRadians(this.Angle(vector)); double length = this.Length * vector.Length * Math.Sin(angle); return(new gVector(x, y, z, length)); }
public double Angle(gVector vector) { double dot = this.Dot(vector); double cos = dot / (this.Length * vector.Length); if (cos > 1) { return(ToDegrees(Math.Acos(1))); } else if (cos < -1) { return(ToDegrees(Math.Acos(-1))); } else { return(ToDegrees(Math.Acos(cos))); } }
public bool OnEdge(gVertex start, gVertex end) { if (this.Equals(start) || this.Equals(end)) { return(true); } // https://www.lucidarme.me/check-if-a-point-belongs-on-a-line-segment/ gVector startEnd = gVector.ByTwoVertices(start, end); gVector startMid = gVector.ByTwoVertices(start, this); gVector endMid = gVector.ByTwoVertices(this, end); if (!startMid.IsParallelTo(endMid)) { return(false); } // Not aligned double dotAC = startEnd.Dot(startMid); double dotAB = startEnd.Dot(startEnd); return(0 <= dotAC && dotAC <= dotAB); }
public double DistanceTo(gEdge edge) { // http://mathworld.wolfram.com/Line-LineDistance.html if (this.IsCoplanarTo(edge)) { var distances = new double[4] { StartVertex.DistanceTo(edge), EndVertex.DistanceTo(edge), edge.StartVertex.DistanceTo(this), edge.EndVertex.DistanceTo(this) }; return(distances.Min()); } else { var a = this.Direction; var b = edge.Direction; var c = gVector.ByTwoVertices(this.StartVertex, edge.StartVertex); gVector cross = a.Cross(b); double numerator = c.Dot(cross); double denominator = cross.Length; return(Math.Abs(numerator) / Math.Abs(denominator)); } }
internal gVertex Translate(gVector vector) { return(gVertex.ByCoordinates(this.X + vector.X, this.Y + vector.Y, this.Z + vector.Z)); }
public double Dot(gVector vector) { return((this.X * vector.X) + (this.Y * vector.Y) + (this.Z * vector.Z)); }
public bool IsParallelTo(gVector vector) { var dot = this.Normalized().Dot(vector.Normalized()); return(Threshold(dot, 1)); }