/// <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); }
public TmoObject(Color fillColor, int tmo, ITmoOperand operand1, ITmoOperand operand2) : base(fillColor) { _tmo = tmo; _operand1 = operand1; _operand2 = operand2; RecalculateSides(); }
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; }
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(); }
/// <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)); }
/// <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(); } }
public bool IsOverlaps(ITmoOperand other) { return(_operand1 == other || _operand2 == other || _operand1.IsOverlaps(other) || _operand2.IsOverlaps(other)); }