Пример #1
0
 static public OrtogoonInt AusPunktZentrumUndGrööse(
     Vektor2DInt ZentrumLaage,
     Vektor2DInt Grööse)
 {
     return(OrtogoonInt.AusPunktMinUndPunktMax(
                (ZentrumLaage - Grööse / 2),
                (ZentrumLaage + ((Grööse + new Vektor2DInt(1, 1)) / 2))));
 }
Пример #2
0
 public OrtogoonInt(
     OrtogoonInt ZuKopiirende)
     :
     this(
         ZuKopiirende.Min0,
         ZuKopiirende.Min1,
         ZuKopiirende.Max0,
         ZuKopiirende.Max1)
 {
 }
Пример #3
0
        static public OrtogoonInt Scnitfläce(OrtogoonInt O0, OrtogoonInt O1)
        {
            var ScnitfläceMin0 = Math.Min(O0.Max0, Math.Max(O0.Min0, O1.Min0));
            var ScnitfläceMin1 = Math.Min(O0.Max1, Math.Max(O0.Min1, O1.Min1));

            return(new OrtogoonInt(
                       ScnitfläceMin0,
                       ScnitfläceMin1,
                       Math.Max(ScnitfläceMin0, Math.Min(O0.Max0, O1.Max0)),
                       Math.Max(ScnitfläceMin1, Math.Min(O0.Max1, O1.Max1))));
        }
Пример #4
0
        static public IEnumerable <OrtogoonInt> Diferenz(
            this OrtogoonInt Minuend,
            OrtogoonInt Subtrahend)
        {
            if (null == Minuend)
            {
                yield break;
            }

            if (null == Subtrahend)
            {
                yield return(Minuend);

                yield break;
            }

            var MinuendMinMax    = new KeyValuePair <Vektor2DInt, Vektor2DInt>(Minuend.PunktMin, Minuend.PunktMax);
            var SubtrahendMinMax = new KeyValuePair <Vektor2DInt, Vektor2DInt>(Subtrahend.PunktMin, Subtrahend.PunktMax);

            if (MinuendMinMax.Value.A <= SubtrahendMinMax.Key.A ||
                MinuendMinMax.Value.B <= SubtrahendMinMax.Key.B ||
                SubtrahendMinMax.Value.A <= MinuendMinMax.Key.A ||
                SubtrahendMinMax.Value.B <= MinuendMinMax.Key.B)
            {
                //	Scpez Fal kaine Scnitmenge
                yield return(Minuend);

                yield break;
            }

            if (MinuendMinMax.Value.A <= SubtrahendMinMax.Value.A &&
                MinuendMinMax.Value.B <= SubtrahendMinMax.Value.B &&
                SubtrahendMinMax.Key.A <= MinuendMinMax.Key.A &&
                SubtrahendMinMax.Key.B <= MinuendMinMax.Key.B)
            {
                //	Scpez Fal Minuend liigt volsctändig in Subtrahend
                yield break;
            }

            Int64[] RictungAMengeScranke =
                ListeGrenzeAusÜberscnaidung1D(
                    MinuendMinMax.Key.A,
                    MinuendMinMax.Value.A,
                    SubtrahendMinMax.Key.A,
                    SubtrahendMinMax.Value.A)
                .OrderBy((t) => t)
                .ToArray();

            Int64[] RictungBMengeScranke =
                ListeGrenzeAusÜberscnaidung1D(
                    MinuendMinMax.Key.B,
                    MinuendMinMax.Value.B,
                    SubtrahendMinMax.Key.B,
                    SubtrahendMinMax.Value.B)
                .OrderBy((t) => t)
                .ToArray();

            if (RictungAMengeScranke.Length < 1 || RictungBMengeScranke.Length < 1)
            {
                //	Scpez Fal kaine Scnitmenge,	(Redundant zur Prüüfung oobn)
                yield return(Minuend);

                yield break;
            }

            var RictungAMengeScrankeMitMinuendGrenze =
                new Int64[] { MinuendMinMax.Key.A }.Concat(RictungAMengeScranke).Concat(new Int64[] { MinuendMinMax.Value.A }).ToArray();

            for (int RictungAScrankeIndex = 0; RictungAScrankeIndex < RictungAMengeScrankeMitMinuendGrenze.Length - 1; RictungAScrankeIndex++)
            {
                var RictungAScrankeMinLaage = RictungAMengeScrankeMitMinuendGrenze[RictungAScrankeIndex];

                var RictungAScrankeMaxLaage = RictungAMengeScrankeMitMinuendGrenze[RictungAScrankeIndex + 1];

                if (SubtrahendMinMax.Value.A <= RictungAScrankeMinLaage ||
                    RictungAScrankeMaxLaage <= SubtrahendMinMax.Key.A)
                {
                    //	in RictungB unbescrankter Abscnit
                    yield return(new OrtogoonInt(RictungAScrankeMinLaage, RictungAScrankeMaxLaage, MinuendMinMax.Key.B, MinuendMinMax.Value.B));
                }
                else
                {
                    var RictungBMengeScrankeFrüheste = RictungBMengeScranke.First();
                    var RictungBMengeScrankeLezte    = RictungBMengeScranke.Last();

                    if (MinuendMinMax.Key.B < SubtrahendMinMax.Key.B)
                    {
                        yield return(new OrtogoonInt(RictungAScrankeMinLaage, RictungAScrankeMaxLaage, MinuendMinMax.Key.B, SubtrahendMinMax.Key.B));
                    }

                    if (SubtrahendMinMax.Value.B < MinuendMinMax.Value.B)
                    {
                        yield return(new OrtogoonInt(RictungAScrankeMinLaage, RictungAScrankeMaxLaage, SubtrahendMinMax.Value.B, MinuendMinMax.Value.B));
                    }
                }
            }
        }