private void button8_Click(object sender, EventArgs e) { var obj = new ChartEllipse(chart1, new DPoint(1, 1), new DSize(7, 4)); obj.Text = "ddd"; obj.Font = new Font("Courier New", 14); obj.TextBrush = new SolidBrush(Color.Red); obj.IsFilled = true; obj.FillBrush = new SolidBrush(Color.Blue); chart1.PinMovableObjectAndAdd(obj); }
/// <summary> /// Получить описывающий /// </summary> /// <param name="candles"></param> /// <param name="start"></param> /// <param name="end"></param> /// <returns></returns> private ChartEllipse BuildInclusiveEllipse(StockSeriesData candles, int start, int end) { if (start == end) { return(null); } float startvalue, endvalue; if (candles[start].high > candles[end].high) { startvalue = candles[start].high; endvalue = candles[end].low; } else { startvalue = candles[start].low; endvalue = candles[end].high; } var A = new PointD(start, Convert.ToDouble(startvalue)); var B = new PointD(end, Convert.ToDouble(endvalue)); var C = new PointD(); double angle; float cx, cy, a, b; var S = float.NaN; bool correctEllipse = false; // поиск охватывающего эллипса for (var i = start; i <= end; i++) { var d = new PointD(i, Convert.ToDouble(candles[i].high)); correctEllipse = Geometry.GetEllipseParams(A.ToPointF(), B.ToPointF(), d.ToPointF(), out angle, out a, out b, out cx, out cy); if (float.IsNaN(S) || (correctEllipse && S < b)) { S = b; C = d; } d = new PointD(i, Convert.ToDouble(candles[i].low)); correctEllipse = Geometry.GetEllipseParams(A.ToPointF(), B.ToPointF(), d.ToPointF(), out angle, out a, out b, out cx, out cy); if (float.IsNaN(S) || (correctEllipse && S < b)) { S = b; C = d; } } correctEllipse = // пересчитываем параметры эллипса Geometry.GetEllipseParams(A.ToPointF(), B.ToPointF(), C.ToPointF(), out angle, out a, out b, out cx, out cy); if (correctEllipse) { // можно построить эллипс - рисуем его var newEllipse = new ChartEllipse { BuildTangent = true, angle = angle, a = a, b = b, cx = cx, cy = cy }; newEllipse.AddPoint((float)A.X, (float)A.Y); newEllipse.AddPoint((float)B.X, (float)B.Y); newEllipse.AddPoint((float)C.X, (float)C.Y); var minIndex = newEllipse.points.Min(p => p.X); newEllipse.DateStart = owner.StockSeries.GetCandleOpenTimeByIndex((int)minIndex); return(newEllipse); } return(null); }