Ejemplo n.º 1
0
            private void CalculatePolyline()
            {
                // Строим временный отрезок из точки 1 в точку 2
                var tmpLine = new Line(_fPoint, _sPoint);

                // Строим три вспомогательных вектора
                var vecCurrentToFirst  = _currPoint - _fPoint;
                var vecCurrentToSecond = _currPoint - _sPoint;
                var vecSecondToFirst   = _sPoint - _fPoint;

                /* Определим катет в треугольнике, которой образуется текущей точкой и второй точкой
                 * через угол между векторами
                 */
                var katet = Math.Sin(vecCurrentToSecond.GetAngleTo(vecSecondToFirst)) * vecCurrentToSecond.Length;

                // Найдем угол между вектором из текущей точки к первой точке и вспомогательной линией
                var angleOnToTmpLinePlane = vecCurrentToFirst.GetAngleTo(vecSecondToFirst, tmpLine.Normal);

                // Получим знак (направление) в зависимости от угла (изменим знак переменной "катет")
                if (angleOnToTmpLinePlane < Math.PI)
                {
                    katet = -katet;
                }

                // Получим 3 точку по направлению и катету и вектор
                var thPoint          = _sPoint + (vecSecondToFirst.GetPerpendicularVector().GetNormal() * katet);
                var vecThirdToSecond = thPoint - _sPoint;

                // Получим 4 точку по тому-же принципу. Для откладывания длины использовать абс.значение!
                Point3d fourPoint;

                if (angleOnToTmpLinePlane < Math.PI)
                {
                    fourPoint = thPoint - (vecThirdToSecond.GetPerpendicularVector().GetNormal() * tmpLine.Length);
                }
                else
                {
                    fourPoint = thPoint + (vecThirdToSecond.GetPerpendicularVector().GetNormal() * tmpLine.Length);
                }

                _polyline.Reset(true, 4);
                _polyline.AddVertexAt(0, new Point2d(_fPoint.X, _fPoint.Y), 0.0, 0.0, 0.0);
                _polyline.AddVertexAt(1, new Point2d(_sPoint.X, _sPoint.Y), 0.0, 0.0, 0.0);
                _polyline.AddVertexAt(2, new Point2d(thPoint.X, thPoint.Y), 0.0, 0.0, 0.0);
                _polyline.AddVertexAt(3, new Point2d(fourPoint.X, fourPoint.Y), 0.0, 0.0, 0.0);
                _polyline.SetDatabaseDefaults();
                _polyline.Closed = true;
            }