Beispiel #1
0
        /// <summary>
        /// Определяет наложение одного полигона на другой
        /// </summary>
        /// <param name="other">Другая фигура</param>
        /// <returns>true - еслиесть наложение, false - иначе</returns>
        public bool IsOverlaps(ITmoOperand other)
        {
            switch (other)
            {
            case Polygon polygon:
                foreach (var point in Vertex)
                {
                    if (polygon.ContainsPoint(point))
                    {
                        return(true);
                    }
                }

                foreach (var point in polygon.Vertex)
                {
                    if (ContainsPoint(point))
                    {
                        return(true);
                    }
                }

                break;

            case TmoObject tmoObject:
                return(tmoObject.IsOverlaps(this));
            }

            return(false);
        }
Beispiel #2
0
 public TmoObject(Color fillColor, int tmo, ITmoOperand operand1, ITmoOperand operand2) : base(fillColor)
 {
     _tmo      = tmo;
     _operand1 = operand1;
     _operand2 = operand2;
     RecalculateSides();
 }
Beispiel #3
0
 private void Clear_Click(object sender, EventArgs e)
 {
     _g.Clear(PictureBox.BackColor);
     _figureList.ForEach(p => p.Clear());
     _figureList.Clear();
     _bezierCurveCache    = null;
     _regularPolygonCache = null;
     _primaryOperand      = null;
     _secondaryOperand    = null;
     _operation           = 1;
     PictureBox.Image     = _image;
 }
Beispiel #4
0
        private void TMO_Click(object sender, EventArgs e)
        {
            var tmo = TmoSelector.SelectedIndex + 1;

            if (_primaryOperand == null || _secondaryOperand == null)
            {
                UiUtils.ShowInfo("Выберите две фигуры (ЛКМ и ПКМ)");
                return;
            }

            _figureList.Remove(_primaryOperand as Drawable);
            _figureList.Remove(_secondaryOperand as Drawable);
            _figureList.Add(new TmoObject(Color.Red, tmo, _primaryOperand, _secondaryOperand));
            _primaryOperand   = null;
            _secondaryOperand = null;

            Redraw();
        }
Beispiel #5
0
        /// <summary>
        /// Выполнение ТМО
        /// </summary>
        /// <param name="operandA">Полигон A</param>
        /// <param name="operandB">Полигон B</param>
        /// <param name="tmo">Индекс ТМО</param>
        /// <param name="width">Ширина полотна</param>
        /// <param name="height">Высота полотна</param>
        /// <returns>Результат ТМО</returns>
        public static Tuple <List <Point>, List <Point> > Exe(ITmoOperand operandA, ITmoOperand operandB, int tmo)
        {
            var setQ = CreateTmoQ(tmo);

            var xal = new List <int>();
            var xar = new List <int>();
            var xbl = new List <int>();
            var xbr = new List <int>();

            var ll = new List <Point>();
            var lr = new List <Point>();

            for (var y = 0; y < UiUtils.CanvasHeight; y++)
            {
                operandA.Bound(xal, xar, y);
                operandB.Bound(xbl, xbr, y);

                var totalM = xal.Count + xar.Count + xbl.Count + xbr.Count;
                if (totalM == 0)
                {
                    continue;
                }

                var mx  = new List <int>(totalM);
                var mdQ = new List <int>(totalM);

                foreach (var x in xal)
                {
                    mx.Add(x);
                    mdQ.Add(2);
                }

                foreach (var x in xar)
                {
                    mx.Add(x);
                    mdQ.Add(-2);
                }

                foreach (var x in xbl)
                {
                    mx.Add(x);
                    mdQ.Add(1);
                }

                foreach (var x in xbr)
                {
                    mx.Add(x);
                    mdQ.Add(-1);
                }

                for (var i = 0; i < totalM; i++)
                {
                    for (var j = i + 1; j < totalM; j++)
                    {
                        if (mx[i] <= mx[j])
                        {
                            continue;
                        }

                        var temp1 = mx[i];
                        mx[i] = mx[j];
                        mx[j] = temp1;

                        temp1  = mdQ[i];
                        mdQ[i] = mdQ[j];
                        mdQ[j] = temp1;
                    }
                }

                var q     = 0;
                var xEmin = 0;
                var xEmax = UiUtils.CanvasWidth;

                var xrl = new List <int>();
                var xrr = new List <int>();

                if (mx[0] >= xEmin && mdQ[0] < 0)
                {
                    xrl.Add(xEmin);
                    q = -mdQ[0];
                }

                for (var i = 0; i < totalM; i++)
                {
                    var x    = mx[i];
                    var qNew = q + mdQ[i];

                    if ((q < setQ[0] || q > setQ[1]) && qNew >= setQ[0] && qNew <= setQ[1])
                    {
                        xrl.Add(x);
                    }

                    if (q >= setQ[0] && q <= setQ[1] && (qNew <setQ[0] || qNew> setQ[1]))
                    {
                        xrr.Add(x);
                    }

                    q = qNew;
                }

                if (q >= setQ[0] && q <= setQ[1])
                {
                    xrr.Add(xEmax);
                }

                if (xrl.Count != xrr.Count)
                {
                    throw new InvalidOperationException($"Размеры правой и левой границе не совпадают. xrr: {xrl.Count}, xrl: {xrr.Count}");
                }

                for (var i = 0; i < xrl.Count; i++)
                {
                    ll.Add(new Point(xrl[i], y));
                    lr.Add(new Point(xrr[i], y));
                }
            }

            return(new Tuple <List <Point>, List <Point> >(ll, lr));
        }
Beispiel #6
0
        /// <summary>
        /// Определяет первичный и вторичный операнды
        /// </summary>
        /// <param name="e">Данные о событии мыши</param>
        private void RecalculateOperands(MouseEventArgs e)
        {
            // выбранная фигура(выделенная)
            var selectedPgn = _figureList.OfType <ITmoOperand>().FirstOrDefault(p => p.ContainsPoint(e.X, e.Y));

            if (selectedPgn == null)
            {
                return;
            }

            switch (e.Button)
            {
            case MouseButtons.Left:
                if (_primaryOperand != null)
                {
                    _primaryOperand.FillColor = Color.Black;
                }

                if (selectedPgn == _secondaryOperand && _primaryOperand != null)
                {
                    _secondaryOperand           = _primaryOperand;
                    _secondaryOperand.FillColor = SecondaryColor;
                }

                _primaryOperand           = selectedPgn;
                _primaryOperand.FillColor = PrimaryColor;
                Redraw();
                break;

            case MouseButtons.Right:
                if (_secondaryOperand != null)
                {
                    _secondaryOperand.FillColor = Color.Black;
                }

                if (selectedPgn == _primaryOperand && _secondaryOperand != null)
                {
                    _primaryOperand           = _secondaryOperand;
                    _primaryOperand.FillColor = PrimaryColor;
                }

                _secondaryOperand           = selectedPgn;
                _secondaryOperand.FillColor = SecondaryColor;
                Redraw();
                break;
            }

            if (_secondaryOperand != null)
            {
                _figureList.Remove(_secondaryOperand as Drawable);
                _figureList.Add(_secondaryOperand as Drawable);
                Redraw();
            }

            if (_primaryOperand != null)
            {
                _figureList.Remove(_primaryOperand as Drawable);
                _figureList.Add(_primaryOperand as Drawable);
                Redraw();
            }
        }
Beispiel #7
0
 public bool IsOverlaps(ITmoOperand other)
 {
     return(_operand1 == other || _operand2 == other || _operand1.IsOverlaps(other) || _operand2.IsOverlaps(other));
 }