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; }