Example #1
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);
        }
Example #2
0
        // Определение координат точки, параметр угол в радианах
        private Vector GetVector(double param, double scale, double rotate)
        {
            Vector vector = DxfHelper.RotateVector(new Vector(scale * majorRadius * Math.Cos(param), scale * minorRadius * Math.Sin(param)), rotate);

            return(scale * center + vector);
        }