示例#1
0
        static public double Rotatioon(
            Vektor2DDouble Vektor0,
            Vektor2DDouble Vektor1)
        {
            var Richtung0 = Vektor0.Normalisiirt();
            var Richtung1 = Vektor1.Normalisiirt();

            var Punktprodukt = Math.Min(1, Math.Max(-1, Vektor2DDouble.Skalarprodukt(Richtung0, Richtung1)));

            var Rotatioon = Math.Acos(Punktprodukt) / Math.PI / 2;

            return(Rotatioon);
        }
示例#2
0
        static public Vektor2DDouble NääxterPunktAufGeraadeSegment(
            Vektor2DDouble GeraadeSegmentBegin,
            Vektor2DDouble GeraadeSegmentEnde,
            Vektor2DDouble SuuceUrscprungPunktLaage,
            out double AufGeraadeNääxtePunktLaage)
        {
            var GeraadeSegmentLängeQuadraat = (GeraadeSegmentEnde - GeraadeSegmentBegin).BetraagQuadriirt;

            if (GeraadeSegmentLängeQuadraat <= 0)
            {
                if (SuuceUrscprungPunktLaage == GeraadeSegmentBegin)
                {
                    AufGeraadeNääxtePunktLaage = 0;
                }
                else
                {
                    AufGeraadeNääxtePunktLaage = double.PositiveInfinity;
                }

                return(GeraadeSegmentBegin);
            }

            AufGeraadeNääxtePunktLaage =
                Vektor2DDouble.Skalarprodukt(
                    SuuceUrscprungPunktLaage - GeraadeSegmentBegin,
                    GeraadeSegmentEnde - GeraadeSegmentBegin) /
                GeraadeSegmentLängeQuadraat;

            if (AufGeraadeNääxtePunktLaage < 0)
            {
                return(GeraadeSegmentBegin);
            }

            if (1 < AufGeraadeNääxtePunktLaage)
            {
                return(GeraadeSegmentEnde);
            }

            return
                (GeraadeSegmentBegin +
                 AufGeraadeNääxtePunktLaage * (GeraadeSegmentEnde - GeraadeSegmentBegin));
        }
示例#3
0
        /// <summary>
        /// http://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect
        /// </summary>
        /// <param name="GeraadeSegment0Begin"></param>
        /// <param name="GeraadeSegment0Ende"></param>
        /// <param name="GeraadeSegment1Begin"></param>
        /// <param name="GeraadeSegment1Ende"></param>
        /// <param name="Paralel"></param>
        /// <returns></returns>
        static public Vektor2DDouble?ScnitpunktGeraadeSegmentMitGeraadeSegment(
            Vektor2DDouble GeraadeSegment0Begin,
            Vektor2DDouble GeraadeSegment0Ende,
            Vektor2DDouble GeraadeSegment1Begin,
            Vektor2DDouble GeraadeSegment1Ende,
            out bool Paralel,
            out bool Kolinear,
            out bool Überlapend)
        {
            Kolinear   = false;
            Überlapend = false;

            //	Suppose the two line segments run from p to p + r and from q to q + s
            var Segment0Vektor = GeraadeSegment0Ende - GeraadeSegment0Begin;
            var Segment1Vektor = GeraadeSegment1Ende - GeraadeSegment1Begin;

            var VektorKroizprodukt =
                Vektor2DDouble.Kroizprodukt(Segment0Vektor, Segment1Vektor);

            //	 Then any point on the first line is representable as p + t r (for a scalar parameter t)
            //	and any point on the second line as q + u s (for a scalar parameter u).

            //	t = (q − p) × s / (r × s)
            var ScnitpunktAufSegment0Antail =
                Vektor2DDouble.Kroizprodukt((GeraadeSegment1Begin - GeraadeSegment0Begin), Segment1Vektor) /
                VektorKroizprodukt;

            //	u = (q − p) × r / (r × s)
            var ScnitpunktAufSegment1Antail =
                Vektor2DDouble.Kroizprodukt((GeraadeSegment1Begin - GeraadeSegment0Begin), Segment0Vektor) /
                VektorKroizprodukt;

            if (0 == VektorKroizprodukt)
            {
                Paralel = true;

                if (0 == Vektor2DDouble.Kroizprodukt((GeraadeSegment1Begin - GeraadeSegment0Begin), Segment0Vektor))
                {
                    //	1.If r × s = 0 and (q − p) × r = 0, then the two lines are collinear.
                    Kolinear = true;

                    var Temp0 = Vektor2DDouble.Skalarprodukt(GeraadeSegment1Begin - GeraadeSegment0Begin, Segment0Vektor);
                    var Temp1 = Vektor2DDouble.Skalarprodukt(GeraadeSegment0Begin - GeraadeSegment1Begin, Segment1Vektor);

                    if (
                        0 <= Temp0 && Temp0 <= Vektor2DDouble.Skalarprodukt(Segment0Vektor, Segment0Vektor) ||
                        0 <= Temp1 && Temp1 <= Vektor2DDouble.Skalarprodukt(Segment1Vektor, Segment1Vektor))
                    {
                        //	If in addition, either 0 ≤ (q − p) · r ≤ r · r or 0 ≤ (p − q) · s ≤ s · s, then the two lines are overlapping.

                        Überlapend = true;
                        return(null);
                    }
                }
            }
            else
            {
                Paralel = false;

                //	4.If r × s ≠ 0 and 0 ≤ t ≤ 1 and 0 ≤ u ≤ 1, the two line segments meet at the point p + t r = q + u s.
                if (0 <= ScnitpunktAufSegment0Antail && ScnitpunktAufSegment0Antail <= 1 &&
                    0 <= ScnitpunktAufSegment1Antail && ScnitpunktAufSegment1Antail <= 1)
                {
                    return(GeraadeSegment0Begin + ScnitpunktAufSegment0Antail * Segment0Vektor);
                }
            }

            return(null);
        }
示例#4
0
 /// <summary>
 /// Links &lt; 0;
 /// Rechts &gt; 0;
 /// </summary>
 /// <param name="GeraadeRictung"></param>
 /// <param name="Punkt"></param>
 /// <returns></returns>
 static public int SaiteVonGeraadeZuPunkt(
     Vektor2DDouble GeraadeRictung,
     Vektor2DDouble Punkt)
 {
     return(Math.Sign(Vektor2DDouble.Skalarprodukt(Punkt, new Vektor2DDouble(-GeraadeRictung.B, GeraadeRictung.A))));
 }