private void PictureBoxMouseDoubleClick(object sender, MouseEventArgs e) { var fr = _stack.Peek(); var r = fr.Rectangle; var pixWd = r.Width / pictureBox.Width; var pixHt = r.Height / pictureBox.Height; var newX = r.X + e.X * pixWd; var newY = r.Y + e.Y * pixHt; if (_pointSelecting) { var rp = newX; var gp = newY; var cpt = new RGPoint(rp, gp); _pointSelected = cpt; PointNumber = 0; DrawPoint(); _pointSelecting = false; var tr = new TrackPoint(this, PointTrack.Count); tr.Show(this); } else { var newW = 20 * pixWd; var newH = 20 * pixHt; var newRect = new DRect { X = newX, Y = newY, Width = newW, Height = newH }; var newFr = new ProcessingFrame { Rectangle = newRect }; _stack.Push(newFr); Redraw(); } }
private void RedrawWithArea() { if (_bgWithArea != null) { _bgWithArea.Dispose(); } _bgWithArea = _bg.Clone() as Bitmap; var initialLstPositive = (_arc ? RGPoint.GetArcPositive(_h1, _h2, _ypxsz, CProjection.UpC1C2) : RGPoint.GetTrianglePositive(_h1, _h2, _xpxsz, _ypxsz, CProjection.UpC1C2)).ToList(); var initialLstNegative = (_arc ? RGPoint.GetArcNegative(_h1, _h2, _ypxsz, CProjection.UpC1C2) : RGPoint.GetTriangleNegative(_h1, _h2, _xpxsz, _ypxsz, CProjection.UpC1C2)).ToList(); _areaInitialSetCPositive = initialLstPositive.Select(e => e.Key).ToList(); _areaInitialSetCNegative = initialLstNegative.Select(e => e.Key).ToList(); RG.FillArea(X, Y, _xpxsz, _ypxsz, _sz, Config.Yellow, _areaInitialSetCPositive, _bgWithArea, CProjection.UpC1C2); RG.FillArea(X, Y, _xpxsz, _ypxsz, _sz, Config.Red, _areaInitialSetCNegative, _bgWithArea, CProjection.UpC1C2); var iteratedPositive = RGPoint.DirectIteratedMany(_areaInitialSetCPositive, trackArea.Maximum, CProjection.C1C2).ToList(); var iteratedNegative = RGPoint.DirectIteratedMany(_areaInitialSetCNegative, trackArea.Maximum, CProjection.C1C2).ToList(); _iteratedAreasCPositive = iteratedPositive.Select(e => e.Key.ToList()).ToList(); _iteratedAreasCPositive.Insert(0, _areaInitialSetCPositive); _iteratedAreasCNegative = iteratedNegative.Select(e => e.Key.ToList()).ToList(); _iteratedAreasCNegative.Insert(0, _areaInitialSetCNegative); ChangePictureBoxPicture(_bgWithArea); pictureBox.Update(); }
private void _plot_MouseClick(object sender, MouseEventArgs e) { if (_plot.Image != null) { _plot.Image.Dispose(); } var bmp = new Bitmap(_originalBitmap); var gr = Graphics.FromImage(bmp); var ptF = MapFromPlot(_plot.Size, e.Location); var rg = new RGPoint(ptF.X, ptF.Y); var iterated = RGPoint.DirectIterations(rg, _iterations).ToList(); var redPen = new Pen(Color.Red); var bluePen = new Pen(Color.Blue); for (var i = 0; i < iterated.Count - 1; i++) { var pt1 = MapToPlot(_plot.Size, new PointF((float)iterated[i].R, (float)iterated[i].G)); var pt2 = MapToPlot(_plot.Size, new PointF((float)iterated[i + 1].R, (float)iterated[i + 1].G)); gr.DrawEllipse(redPen, pt1.X, pt1.Y, 2, 2); gr.DrawEllipse(redPen, pt2.X, pt2.Y, 2, 2); gr.DrawLine(bluePen, pt1, pt2); } _plot.Image = bmp; }
private void FillPoint(RGPoint p1, Color clr) { var np = NPt(p1); var gr = Graphics.FromImage(pictureBox.Image); var bgClr = RG.GetColorDirect(new RGPoint(p1), CProjection.UpC1C2); var blend = RG.Blend(clr, bgClr); gr.TryDraw(g => g.FillEllipse(new SolidBrush(clr), np.X - 2, np.Y - 2, 4, 4)); gr.TryDraw(g => g.DrawRectangle(new Pen(blend), np.X - 10, np.Y - 10, 20, 20)); }
bool InTriangle(RGPoint rg) { if (rg.G > 0) { return(false); } var c = RgSettings.Const; if ( (rg.G >= rg.R - c && rg.R <= c && rg.R >= 0) || (rg.G >= -rg.R - c && rg.R > -c && rg.R <= 0) ) { return(true); } return(false); }
private void FillPixel(Bitmap bmp, double x, double y) { var r = x; var g = y; var pt = NPt(r, g); var cpt = new RGPoint(r, g); var color = RG.GetColorDirect(cpt, CProjection.UpC1C2); SetPixel(bmp, pt.X, pt.Y, color); var orig = new RGPoint(r, g); if (InTriangle(orig)) { var oneIteration = orig.DirectIterated(); var pt1 = NPt(oneIteration.R, oneIteration.G); if (pt1.X >= 0 && pt1.Y >= 0 && pt1.X < bmp.Size.Width && pt1.Y < bmp.Size.Height) { var clrR = Math.Max(0, color.R - 50); var clrG = Math.Max(0, color.G - 50); var clrB = Math.Max(0, color.B - 50); SetPixel(bmp, pt1.X, pt1.Y, Color.Black); } } }
private void RedrawWithLines() { if (_bgWithLines != null) { _bgWithLines.Dispose(); } _bgWithLines = _bg.Clone() as Bitmap; _rline1 = RGPoint.ParabolaDirect(_a, _b, _rmin, _rmax, _rstep).ToList(); _line1 = _rline1.Select(rg => rg.Value.CDirect).ToList(); /* * _criticalLine = RGPoint.CriticalLineDirect(_rmin, _rmax, _rstep, _a, _b).ToList(); */ if (DrawTransformedLine) { _rline2 = new List <RGPoint>(); foreach (var rp1 in _rline1) { var r = rp1.Value.R; var r1 = RgSettings.Lambda * ((_a - _b - 1 + RgSettings.NMinus1) / (1 - RgSettings.NMinus1)) * ((r - _a1) / (r - _b1)); var g1 = (r1 - _a11) / (r1 - _b11) * Math.Pow(r1 + RgSettings.Lambda, 2); var rp2 = new RGPoint { R = r1, G = g1 }; _rline2.Add(rp2); } _line2 = _rline2.Select(rg => rg.CDirect).ToList(); } else { _rline2 = new List <RGPoint>(); _line2 = new List <CPoint>(); } if (_bgWithLines != null) { var gr = Graphics.FromImage(_bgWithLines); for (var i = 0; i < _rline1.Count - 1; i++) { var rpt1 = _rline1[i]; var rpt2 = _rline1[i + 1]; var c1 = rpt1.Value.CDirect; var c2 = rpt2.Value.CDirect; var pen = new Pen(rpt1.Color); RG.DrawLine(X, Y, _xpxsz, _ypxsz, _sz, pen, c1, c2, gr, CProjection.UpC1C2); } if (DrawTransformedLine) { for (var i = 0; i < _line2.Count - 1; i++) { var c1 = _line2[i]; var c2 = _line2[i + 1]; RG.DrawLine(X, Y, _xpxsz, _ypxsz, _sz, Config.WhitePen, c1, c2, gr, CProjection.UpC1C2); } } /* * for (var i = 0; i < _criticalLine.Count - 1; i++) * { * var pt1 = _criticalLine[i]; * var pt2 = _criticalLine[i]; * RG.DrawLine(X, Y, _xpxsz, _ypxsz, _sz, Config.FuchsiaPen, pt1, pt2, gr, CProjection.UpC1C2); * } * */ gr.Save(); } ChangePictureBoxPicture(_bgWithLines); pictureBox.Update(); }
private Point NPt(RGPoint p) { return(NPt(p.R, p.G)); }
public void CleanPoint(object sender, EventArgs e) { _pointSelected = null; _pointTrack = null; RedrawScene(); }
private void RedrawWithLines() { if (_bgWithLines != null) { _bgWithLines.Dispose(); } _bgWithLines = _bg.Clone() as Bitmap; _rline1 = RGPoint.ParabolaReversed(_a, _b, _rmin, _rmax, _rstep).ToList(); _line1 = _rline1.Select(rg => rg.CReversed).ToList(); _rline2 = new List <RGPoint>(); foreach (var rp1 in _rline1) { var r = rp1.R; var r1 = RgSettings.Lambda * ((_a - _b + (RgSettings.N - 1) * Math.Pow(RgSettings.Lambda, -1)) / (1 - RgSettings.N)) * ((r - _a1) / (r - _b1)); var g1 = (r1 - _a11) / (r1 - _b11) * Math.Pow(r1 + 1, 2); var rp2 = new RGPoint { R = r1, G = g1 }; _rline2.Add(rp2); } _line2 = _rline2.Select(rg => rg.CReversed).ToList(); var nearestToB = _rline1.OrderBy(rp => Math.Abs(rp.R - _b)).FirstOrDefault(); var nearestToL = _rline1.OrderBy(rp => Math.Abs(rp.R - -Math.Pow(RgSettings.Lambda, -1))).FirstOrDefault(); var cNearestToB = nearestToB != null ? nearestToB.CReversed : null; var cNearesToL = nearestToL != null ? nearestToL.CReversed : null; if (_bgWithLines != null) { var gr = Graphics.FromImage(_bgWithLines); var pen1 = new Pen(Config.Black); for (var i = 0; i < _line1.Count - 1; i++) { var c1 = _line1[i]; var c2 = _line1[i + 1]; RG.DrawLine(X, Y, _xpxsz, _ypxsz, _sz, pen1, c1, c2, gr, CProjection.UpC0C1); } var pen2 = new Pen(Config.White); for (var i = 0; i < _line2.Count - 1; i++) { var c1 = _line2[i]; var c2 = _line2[i + 1]; RG.DrawLine(X, Y, _xpxsz, _ypxsz, _sz, pen2, c1, c2, gr, CProjection.UpC0C1); } if (cNearestToB != null) { RG.FillPoint(X, Y, _xpxsz, _ypxsz, _sz, Config.Red, cNearestToB, gr, CProjection.UpC0C1); } if (cNearesToL != null) { RG.FillPoint(X, Y, _xpxsz, _ypxsz, _sz, Config.Yellow, cNearesToL, gr, CProjection.UpC0C1); } gr.Save(); } ChangePictureBoxPicture(_bgWithLines); pictureBox.Update(); }
private static void DrawParabolaReversed(double a, double b, Graphics gr, DashStyle dash = DashStyle.Dot, bool beforeTrans = true) { var rgParabola = RGPoint.ParabolaReversed(a, b, -1000, 1000, 0.1, beforeTrans); var rgPoints = rgParabola as RGPoint[] ?? rgParabola.ToArray(); var beforeB = rgPoints.Where(rg => rg.R <= b).ToList(); var fromBtoL = rgPoints.Where(rg => rg.R >= b && rg.R <= RgSettings.LambdaMinus1).ToList(); var fromLtoB = rgPoints.Where(rg => rg.R >= RgSettings.LambdaMinus1 && rg.R <= b).ToList(); var fromL = rgPoints.Where(rg => rg.R >= RgSettings.LambdaMinus1).ToList(); var cParabola1 = beforeB.Select(rg => rg.CReversed).ToList(); var cParabola2 = fromBtoL.Select(rg => rg.CReversed).ToList(); var cParabola3 = fromLtoB.Select(rg => rg.CReversed).ToList(); var cParabola4 = fromL.Select(rg => rg.CReversed).ToList(); var pen1 = new Pen(Color.Red, 2) { DashStyle = dash }; for (var i = 0; i < cParabola1.Count - 1; i++) { var cp1 = cParabola1[i]; var cp2 = cParabola1[i + 1]; var realPen = pen1; DrawLine(realPen, cp1, cp2, gr); } if (cParabola1.Any()) { var first = cParabola1.First(); var last = cParabola1.Last(); FillPoint(Color.Red, first, gr); FillPoint(Color.Red, last, gr); } var pen2 = new Pen(Color.LemonChiffon, 2) { DashStyle = dash }; for (var i = 0; i < cParabola2.Count - 1; i++) { var cp1 = cParabola2[i]; var cp2 = cParabola2[i + 1]; var realPen = pen2; DrawLine(realPen, cp1, cp2, gr); } if (cParabola2.Any()) { var first = cParabola2.First(); var last = cParabola2.Last(); FillPoint(Color.LemonChiffon, first, gr); FillPoint(Color.LemonChiffon, last, gr); } var pen3 = new Pen(Color.Yellow, 2) { DashStyle = dash }; for (var i = 0; i < cParabola3.Count - 1; i++) { var cp1 = cParabola3[i]; var cp2 = cParabola3[i + 1]; var realPen = pen3; DrawLine(realPen, cp1, cp2, gr); } if (cParabola3.Any()) { var first = cParabola3.First(); var last = cParabola3.Last(); FillPoint(Color.Yellow, first, gr); FillPoint(Color.Yellow, last, gr); } var pen4 = new Pen(Color.DarkViolet, 2) { DashStyle = dash }; for (var i = 0; i < cParabola4.Count - 1; i++) { var cp1 = cParabola4[i]; var cp2 = cParabola4[i + 1]; var realPen = pen4; DrawLine(realPen, cp1, cp2, gr); } if (cParabola4.Any()) { var first = cParabola4.First(); var last = cParabola4.Last(); FillPoint(Color.DarkViolet, first, gr); FillPoint(Color.DarkViolet, last, gr); } }