예제 #1
0
        // Создание линии из вершин полилинии
        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);
        }
예제 #2
0
        // Преобразовать эллипс в 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);
        }
예제 #3
0
        // Создать объект 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);
        }