Ejemplo n.º 1
0
 public gEdge(gVertex start, gVertex end)
 {
     StartVertex = start;
     EndVertex   = end;
     Length      = StartVertex.DistanceTo(EndVertex);
     Direction   = gVector.ByTwoVertices(StartVertex, EndVertex);
 }
Ejemplo n.º 2
0
        internal gVertex Translate(gVector vector, double distance)
        {
            gVector normalized = vector.Normalized();
            gVector distVector = normalized * distance;

            return(this.Translate(distVector));
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
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);
        }
Ejemplo n.º 5
0
        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));
        }
Ejemplo n.º 6
0
        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)));
            }
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
 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));
     }
 }
Ejemplo n.º 9
0
 internal gVertex Translate(gVector vector)
 {
     return(gVertex.ByCoordinates(this.X + vector.X, this.Y + vector.Y, this.Z + vector.Z));
 }
Ejemplo n.º 10
0
 public double Dot(gVector vector)
 {
     return((this.X * vector.X) + (this.Y * vector.Y) + (this.Z * vector.Z));
 }
Ejemplo n.º 11
0
        public bool IsParallelTo(gVector vector)
        {
            var dot = this.Normalized().Dot(vector.Normalized());

            return(Threshold(dot, 1));
        }