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)))); }
public OrtogoonInt( OrtogoonInt ZuKopiirende) : this( ZuKopiirende.Min0, ZuKopiirende.Min1, ZuKopiirende.Max0, ZuKopiirende.Max1) { }
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)))); }
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)); } } } }