// Создание линии из вершин полилинии public static DxfLine Create(DxfVertex vertex1, DxfVertex vertex2, DxfColors color = DxfColors.MainOutline) { DxfLine line = new DxfLine { Color = color, StartPoint = vertex1.AsDot, EndPoint = DxfEndPoint.EndPointFromDot(vertex2.AsDot) }; CreateRect(line); return(line); }
// Преобразовать эллипс в POLYLINE public DxfPolyline ToPolyline(int precision) { DxfPolyline polyline = DxfPolyline.Create(); // Создать новую полилинию polyline.Color = Color; // присвоить цвет линии как у эллипса polyline.IsBulge = false; // искревленности нет Vector center = new Vector(Center.X, Center.Y); // определить угол поворота эллипса относительно оси 0X double[] ordX = new double[precision]; double[] ordY = new double[precision]; polyline.IsClosed = IsFull ? true : false; // определить тип полилинии // список вершин полилинии List <DxfVertex> vertexes = new List <DxfVertex>(); double step = (EndParam - StartParam) / (precision - 1); // шаг расчета вершин зависит от заданной точности for (int i = 0; i < precision; i++) { double angle = StartParam + step * i; // угол расчета вершины // создать новый вектор для этого угла Vector vector = GetVector(angle, 1, rotateAngle); // создать новую вершину DxfVertex vertex = new DxfVertex(vector); ordX[i] = vector.X; ordY[i] = vector.Y; // добавить вершину в коллекцию vertexes.Add(vertex); } // добавить созданный массив вершин в коллекцию полилинии polyline.AddRangeVerts(vertexes); Array.Sort(ordX); Array.Sort(ordY); Rect rt = new Rect(ordX[0], ordY[0], ordX[ordX.Length - 1] - ordX[0], ordY[ordY.Length - 1] - ordY[0]); polyline.Bound = rt; // вернуть созданную полилинию return(polyline); }
// Создать объект Arc из двух вершин, в первой из который устанолен коэффициет искривления public static DxfArc Create(DxfVertex vertex1, DxfVertex vertex2, DxfColors color = DxfColors.MainOutline) { if (vertex1.Bulge == 0) { throw new ArgumentNullException(Properties.Resource.BulgeNotFound); } DxfArc arc = new DxfArc(); arc.Color = color; // цвет линии // Наити полный угол дуги double angleOfArc = 0; if (Math.Abs(vertex1.Bulge) == 1) { angleOfArc = 180; } else { angleOfArc = Math.Abs(Math.Atan(vertex1.Bulge) * DxfHelper.RadToDeg) * 4; } // Найти хорду и ее длинну, определить начало и конец дуги, // т.к. в файлах DXF направление дуги всегда по часовой стрелке, // если коэффициент искривления вершины имеет отрицательное значение, // то поменять точки местами Vector startPoint = vertex1.Bulge > 0 ? new Vector(vertex1.X, vertex1.Y) : new Vector(vertex2.X, vertex2.Y); // точка начала дуги Vector endPoint = vertex1.Bulge > 0 ? new Vector(vertex2.X, vertex2.Y) : new Vector(vertex1.X, vertex1.Y); // точка конца дуги Vector chord = endPoint - startPoint; // хорда // Радиус дуги // если угол дуги равен 180 градусов, то радиус равен половине длинны хорды if (angleOfArc == 180) { arc.Radius = chord.Length / 2; } else { arc.Radius = Math.Abs((chord.Length / Math.Sin(angleOfArc / 2 * DxfHelper.DegToRad)) / 2); } // найти центр хорды Vector centerChord = startPoint + chord / 2; if (angleOfArc == 180) { arc.Center = new DxfDot(centerChord.X, centerChord.Y); } else { // найти расстояние от центра дуги до середины хорды double length = Math.Sqrt(arc.Radius * arc.Radius - Math.Pow(chord.Length * .5, 2)); // единичный вектор, перпендикулярный хорде Vector perp = angleOfArc > 180 ? DxfHelper.RotateVector(chord, 270) : DxfHelper.RotateVector(chord, 90); perp.Normalize(); // умножить перпендикуляр на расстояние до центра дуги Vector size = perp * length; // найти центр дуги Vector centerArc = centerChord + size; arc.Center = new DxfDot(centerArc.X, centerArc.Y); } // найти начальный и конечный углы дуги arc.StartAngle = GetAngle(arc.Center, startPoint, arc.Radius); arc.EndAngel = arc.StartAngle + angleOfArc; arc.EndAngel = arc.EndAngel >= 360 ? arc.EndAngel - 360 : arc.EndAngel; CreateBound(arc); return(arc); }