public bool pointFitsArc(MyPoint point, MyArc arc, checkType comparePrecision)
        {
            double radius    = Mathematics.FindDist(arc.CenterPoint, arc.StartPoint);
            bool   pointFits = false;

            switch (comparePrecision)
            {
            case checkType.clickPrecision:
                pointFits = Math.Abs(Mathematics.FindDist(point, arc.CenterPoint) - radius) < visualizer.pointLocality / 2.0;
                break;

            case checkType.doublePrecision:
                pointFits = Math.Abs(Mathematics.FindDist(point, arc.CenterPoint) - radius) < 0.000000001;
                break;

            case checkType.boundPrecision:
                pointFits = Math.Abs(Mathematics.FindDist(point, arc.CenterPoint) - radius) < radius * ProjectForm.toch;
                break;
            }

            if (pointFits)
            {
                return(Mathematics.checkValidPointOnArc(point, arc));
            }

            return(false);
        }
        void splitCircleByPoint(MyCircle circle, MyPoint point)
        {
            double x  = point.X;
            double y  = point.Y;
            double x1 = (-1) * (x - circle.CenterPoint.X) + circle.CenterPoint.X;
            double y1 = (-1) * (y - circle.CenterPoint.Y) + circle.CenterPoint.Y;

            if (addPointControl == null)
            {
                addPointControl = new AddPointsControl(this);
                this.Controls.Add(addPointControl);
            }
            MyPoint newAutoPoint = this.addPointControl.CreatePoint(this.currentFullModel.geometryModel.NumOfPoints + 1, x1, y1); // создаем автоточку, диаметрально противоположную нашей новой точке

            // созаем и рисуем первую дугу
            MyArc newArc = new MyArc(this.currentFullModel.geometryModel.NumOfLines + 1, true, point, newAutoPoint, circle.CenterPoint);

            this.currentFullModel.geometryModel.Arcs.Add(newArc);
            this.currentFullModel.geometryModel.NumOfLines++;

            // создаем и рисуем вторую дугу
            newArc = new MyArc(this.currentFullModel.geometryModel.NumOfLines + 1, true, newAutoPoint, point, circle.CenterPoint);

            this.currentFullModel.geometryModel.Arcs.Add(newArc);
            this.currentFullModel.geometryModel.NumOfLines++;

            // удаляем окружность
            circle.CenterPoint.CircleNumbers.Remove(circle.Id);
            this.currentFullModel.geometryModel.Circles.Remove(circle);
            this.ReDrawAll();
            if (addPointControl != null)
            {
                disposeControl(addPointControl);
            }
        }
Beispiel #3
0
        private void _timerReceive_Tick(object sender, EventArgs e)
        {
            lblDeltaR.Content = DateTime.Now.Subtract(dtG).Milliseconds.ToString() + " ms";
            dtG = DateTime.Now;

            //    _timerReceive.Stop();

            if (flagReady & _countRImage == 0)
            {
                TransformMethods.MyArc objA = new MyArc();
                sbyte[,] Z = new sbyte[1024, 256];
                Z          = objA.unArcWithTable(outByte);

                TransformMethods.TransferTo objT = new TransferTo();

                imgRecieveHaar = new WriteableBitmap(objT.convertSByte256ToGrayImg(Z));

                rRecieveHaar.Fill = new ImageBrush()
                {
                    ImageSource = imgRecieveHaar
                };

                TransformMethods.WaveLetHaar  objH = new WaveLetHaar();
                TransformMethods.WaveLetCDF97 objD = new WaveLetCDF97();

                if (rbH.IsChecked == true)
                {
                    objH.Haar2DInverse(ref Z, vHaar, hHaar);
                }
                else
                {
                    objD.CDF2DInverse(ref Z, vHaar, hHaar);
                }

                imgReceive1024x256 = new WriteableBitmap(objT.convertSByte256ToGrayImgReceive(Z));

                rRecieveCombine.Fill = new ImageBrush()
                {
                    ImageSource = imgReceive1024x256
                };

                _imagesReceive = objT.convertGray1024x256ToGrayImgCollection(imgReceive1024x256);

                flagReady = false;
            }

            rReceive.Fill = new ImageBrush()
            {
                ImageSource = _imagesReceive[_countRImage]
            };

            _countRImage += 1;

            if (_countRImage == _intPackImage)
            {
                _countRImage = 0;
            }

            //     _timerReceive.Start();
        }
        public void BoundLine(MyLine tempLine)
        {
            int currentModel           = this.parent.GetCurrentModelIndex();
            MyFiniteElementModel model = this.parent.currentFullModel.FiniteElementModels[currentModel];

            this.errorNoLine.Visible = false;

            tempLine.BoundType = GetBoundType();

            List <MyNode> nodes = new List <MyNode>();

            if (tempLine is MyStraightLine)
            {
                nodes = model.Nodes.FindAll(node => Mathematics.pointOnLine(node.X, node.Y, (MyStraightLine)tempLine) && model.INOUT[node.Id] != 0);
            }
            else
            {
                MyArc  a         = tempLine as MyArc;
                double r         = Mathematics.FindDist(a.CenterPoint, a.StartPoint);
                double precision = NewMethod(model);
                nodes = model.Nodes.FindAll(node => Mathematics.pointFitsArc(node, (MyArc)tempLine, precision) && model.INOUT[node.Id] != 0);
            }

            foreach (MyNode node in nodes)
            {
                BoundNode(node, tempLine.BoundType);
            }
            // сохраняем закрепления в массив NFIX
            renewNfixNB(currentModel);
            this.parent.DrawFEBounds(Color.Brown);

            this.txtLine.Text = "";
            this.txtLine.Select();
        }
Beispiel #5
0
        private bool PointFits(MyArea area, List <MyNode> existingNodes, MyNode p, double h = -1)
        {
            double x = p.X, y = p.Y;

            if (h < 0)
            {
                h = (double)nudMinDistance.Value;
            }
            bool inside = Mathematics.ContainsPoint(area.Nodes, x, y) ||
                          area.StraightLines.Find(l => Mathematics.pointOnLine(x, y, l)) != null ||
                          area.Arcs.Find(a => Mathematics.pointFitsArc(p, a, 0.01)) != null;

            if (!inside)
            {
                return(false);
            }

            foreach (MyStraightLine line in area.StraightLines)
            {
                MyPoint cp;
                if (Mathematics.pointOnLine(x, y, line))
                {
                    cp = p;
                }
                else
                {
                    cp = Mathematics.crossPoint(p, line);
                }
                if (Mathematics.FindDist(cp, p) < h)
                {
                    if (existingNodes.TrueForAll(n => Mathematics.FindDist(n, cp).MoreOrEqual(h)))
                    {
                        p.X = cp.X; p.Y = cp.Y;
                        return(true);
                    }
                }
            }

            MyArc arc = area.Arcs.Find(a => Mathematics.pointFitsArc(p, a, h - 0.001));

            if (arc != null)
            {
                MyPoint cp = new MyPoint();
                double  k  = Mathematics.FindDist(arc.EndPoint, arc.CenterPoint) / Mathematics.FindDist(p, arc.CenterPoint);
                cp.X = arc.CenterPoint.X + (p.X - arc.CenterPoint.X) * k;
                cp.Y = arc.CenterPoint.Y + (p.Y - arc.CenterPoint.Y) * k;
                if (existingNodes.TrueForAll(n => Mathematics.FindDist(n, cp).MoreOrEqual(h)))
                {
                    p.X = cp.X; p.Y = cp.Y;
                    return(true);
                }
            }

            if (existingNodes.TrueForAll(n => Mathematics.FindDist(n, p).MoreOrEqual(h)))
            {
                return(true);
            }
            return(false);
        }
        static public double ArcAngle(MyArc arc, MyPoint point) // функция вычисляет угол между осью Х и прямой проходящей через центр дуги и точку на дуге. точка должна лежать на дуге
        {
            double  angle       = 0;
            MyPoint centerPoint = arc.CenterPoint;

            angle = Math.Atan2(point.Y - centerPoint.Y, point.X - centerPoint.X);
            return(angle);
        }
        public bool TestArc(MyArc testingArc)
        {
            bool goodArc = false;

            // проверяем расстояния от центральной точки до двух крайних
            double r1 = Mathematics.FindDist(testingArc.CenterPoint, testingArc.StartPoint);
            double r2 = Mathematics.FindDist(testingArc.CenterPoint, testingArc.EndPoint);

            if (Math.Abs(r1 - r2) > 0.1)
            {
                return(false);                                                                               // если радиусы не равны, то дугу построить невозможно
            }
            double startAngle = (180.0 / Math.PI) * ProjectForm.ArcAngle(testingArc, testingArc.StartPoint); // вычисляем углы начальной и конечной точек дуги - меряются они от оси Х против часовой стрелки (в градусах)
            double endAngle   = (180.0 / Math.PI) * ProjectForm.ArcAngle(testingArc, testingArc.EndPoint);

            double sweepAngle = 0; // угол дуги

            if (testingArc.Clockwise && startAngle > endAngle)
            {
                sweepAngle = (startAngle - endAngle);
            }
            if (testingArc.Clockwise && startAngle < endAngle)
            {
                sweepAngle = 360.0 - (endAngle - startAngle);
            }
            if (!testingArc.Clockwise && startAngle > endAngle)
            {
                sweepAngle = 360.0 - (startAngle - endAngle);
            }
            if (!testingArc.Clockwise && startAngle < endAngle)
            {
                sweepAngle = (endAngle - startAngle);
            }

            if (sweepAngle > 0.0 && sweepAngle <= 180.9)
            {
                if (testingArc.Clockwise)
                {
                    goodArc = true;
                }
                else
                {
                    goodArc = true;
                }
            }
            if (sweepAngle < 0.0 && sweepAngle >= -180.9)
            {
                if (testingArc.Clockwise)
                {
                    goodArc = true;
                }
                else
                {
                    goodArc = true;
                }
            }
            return(goodArc);
        }
Beispiel #8
0
 private void findNodesAtArc(ref List <MyNode> forcedNodes, MyArc arc, int currentModel)
 {
     foreach (MyNode node in this.parent.currentFullModel.FiniteElementModels[currentModel].Nodes)
     {
         if (this.parent.pointFitsArc(new MyPoint(node.X, node.Y, MyPoint.PointType.IsGeometryPoint), arc, ProjectForm.checkType.boundPrecision) == true)
         {
             if (forcedNodes.IndexOf(node) == -1)
             {
                 forcedNodes.Add(node);
             }
         }
     }
 }
 private void findNodesAtArc(List <MyNode> notMoveableNodes, MyArc notMoveArc)
 {
     foreach (MyNode node in currentModel.Nodes)
     {
         // уравнение окружности
         if (parent.pointFitsArc(node.X, node.Y, notMoveArc, ProjectForm.checkType.doublePrecision))
         {
             if (notMoveableNodes.IndexOf(node) == -1)
             {
                 notMoveableNodes.Add(node);
             }
         }
     }
 }
        private bool LineCrossingArc(MyStraightLine line, MyArc arc)
        {
            double r, a, b, c;

            if (Math.Abs(line.StartPoint.X - line.EndPoint.X) < 0.01)
            {
                b = 0; a = 1; c = -arc.CenterPoint.X;
            }
            else if (Math.Abs(line.StartPoint.Y - line.EndPoint.Y) < 0.01)
            {
                b = 1; a = 0; c = -arc.CenterPoint.Y;
            }
            else
            {
                double k, bx;
                k  = (line.EndPoint.Y - line.StartPoint.Y) / (line.EndPoint.X - line.StartPoint.X);
                bx = line.EndPoint.Y - k * line.EndPoint.X;
                a  = -k;
                c  = -(bx + k * arc.CenterPoint.X - arc.CenterPoint.Y);
                b  = 1;
            }
            r = Mathematics.FindDist(arc.StartPoint, arc.CenterPoint);
            double x0 = -a * c / (a * a + b * b), y0 = -b * c / (a * a + b * b);

            if (c * c > r * r * (a * a + b * b) + 0.01)
            {
                return(false);
            }
            else if (Math.Abs(c * c - r * r * (a * a + b * b)) < 0.01)
            {
                MyPoint xPoint = new MyPoint(x0, y0, MyPoint.PointType.IsGeometryPoint);
                return(pointFitsArc(xPoint, arc, checkType.doublePrecision) && Mathematics.FindDist(xPoint, line.EndPoint) > 0.01 && Mathematics.pointOnLine(xPoint, line));
            }
            else
            {
                double d = r * r - c * c / (a * a + b * b);
                double mult = Math.Sqrt(d / (a * a + b * b));
                double ax, ay, bx, by;
                ax = arc.CenterPoint.X + x0 + b * mult;
                bx = arc.CenterPoint.X + x0 - b * mult;
                ay = arc.CenterPoint.Y + y0 - a * mult;
                by = arc.CenterPoint.Y + y0 + a * mult;
                MyPoint xPoint1 = new MyPoint(ax, ay, MyPoint.PointType.IsGeometryPoint);
                MyPoint xPoint2 = new MyPoint(bx, by, MyPoint.PointType.IsGeometryPoint);
                return((pointFitsArc(xPoint1, arc, checkType.doublePrecision) && Mathematics.FindDist(xPoint1, line.EndPoint) > 0.01 && Mathematics.pointOnLine(xPoint1, line)) ||
                       (pointFitsArc(xPoint2, arc, checkType.doublePrecision) && Mathematics.FindDist(xPoint2, line.EndPoint) > 0.01 && Mathematics.pointOnLine(xPoint2, line)));
            }
        }
Beispiel #11
0
        private List <MyNode> findNodesAtArc(List <MyNode> nodes, MyArc arc)
        {
            List <MyNode> result = new List <MyNode>();

            foreach (MyNode node in nodes)
            {
                // уравнение окружности
                if (parent.pointFitsArc(node.X, node.Y, arc, ProjectForm.checkType.doublePrecision))
                {
                    if (result.IndexOf(node) == -1)
                    {
                        result.Add(node);
                    }
                }
            }
            return(result);
        }
        // метод для общих целей
        public static bool pointFitsArc(MyPoint point, MyArc arc, double precision)
        {
            double radius    = Mathematics.FindDist(arc.CenterPoint, arc.StartPoint);
            bool   pointFits = false;

            if (precision < 0)
            {
                double r = Mathematics.FindDist(arc.CenterPoint, arc.StartPoint);
                precision = r * 0.05;
            }
            pointFits = Math.Abs(Mathematics.FindDist(point, arc.CenterPoint) - radius) < precision;
            if (pointFits)
            {
                return(checkValidPointOnArc(point, arc));
            }
            else
            {
                return(false);
            }
        }
        private void constructionArea_MouseMove(object sender, MouseEventArgs e)
        {
            mouseAboveArea = true;
            MyPoint clickPoint = visualizer.getClickPoint(e.X, e.Y);

            if (mouseXcord.Equal(clickPoint.X) && mouseYcord.Equal(clickPoint.Y))
            {
                return;
            }
            mouseXcord = clickPoint.X;
            mouseYcord = clickPoint.Y;

            if (e.Button == MouseButtons.Left)
            {
                // кусочек, который отвечает за перетаскивание области построения
                if (!this.mouseAboveEditedPoint && !this.mouseAboveEditedNode && this.currentFullModel.geometryModel.editedPoint == null)
                {
                    this.mouseMoved = true;
                    visualizer.MoveBy((e.X - mouseX), (e.Y - mouseY), showGrid.Checked);
                    mouseX = e.X;
                    mouseY = e.Y;
                }

                // кусочек, который отвечает за перетаскивание точки в режиме редактирования точки
                if (this.editPointsControl != null && this.editPointsControl.IsHandleCreated && this.mouseAboveEditedPoint)
                {
                    if (this.currentFullModel.geometryModel.editedPoint != null)
                    {
                        if (currentFullModel.geometryModel.editedPoint.IsCenterOfArc)
                        {
                            MessageBox.Show("Изменение центра дуги невозможно!");
                            this.mouseAboveEditedPoint = false;
                        }
                        else
                        {
                            MyPoint ePoint = currentFullModel.geometryModel.editedPoint;
                            if (currentFullModel.geometryModel.editedPoint.IsStartOfArc || currentFullModel.geometryModel.editedPoint.IsEndOfArc)
                            {
                                MyArc[] incidentArcs = currentFullModel.geometryModel.Arcs.Where(a => a.StartPoint == currentFullModel.geometryModel.editedPoint || a.EndPoint == currentFullModel.geometryModel.editedPoint).ToArray();
                                if (incidentArcs.Length > 0)
                                {
                                    MyPoint commonCenter;
                                    commonCenter = incidentArcs[0].CenterPoint;

                                    double R = Mathematics.FindDist(currentFullModel.geometryModel.editedPoint, commonCenter);
                                    double x;
                                    double y;
                                    double angle = Math.Atan2(clickPoint.Y - commonCenter.Y, clickPoint.X - commonCenter.X);
                                    x = commonCenter.X + R * Math.Cos(angle);
                                    y = commonCenter.Y + R * Math.Sin(angle);

                                    bool PointFits = true;
                                    foreach (MyArc arc in incidentArcs)
                                    {
                                        MyArc testArc;
                                        if (arc.EndPoint == currentFullModel.geometryModel.editedPoint)
                                        {
                                            testArc = new MyArc(0, arc.Clockwise, arc.StartPoint, new MyPoint(x, y, MyPoint.PointType.IsGeometryPoint), arc.CenterPoint);
                                        }
                                        else
                                        {
                                            testArc = new MyArc(0, arc.Clockwise, new MyPoint(x, y, MyPoint.PointType.IsGeometryPoint), arc.EndPoint, arc.CenterPoint);
                                        }

                                        if (!TestArc(testArc))
                                        {
                                            PointFits = false;
                                            break;
                                        }
                                    }
                                    if (PointFits)
                                    {
                                        currentFullModel.geometryModel.editedPoint.X = x;
                                        currentFullModel.geometryModel.editedPoint.Y = y;
                                    }
                                }
                                else
                                {
                                    currentFullModel.geometryModel.editedPoint.X = clickPoint.Y;
                                    currentFullModel.geometryModel.editedPoint.Y = clickPoint.Y;
                                }
                            }

                            else
                            {
                                currentFullModel.geometryModel.editedPoint.X = clickPoint.X;
                                currentFullModel.geometryModel.editedPoint.Y = clickPoint.Y;
                            }
                            if (currentFullModel.geometryModel.editedPoint.NodeReference != null) // точка может и не иметь ссылки на узел - если это центральная точка дуги, например
                            {
                                currentFullModel.geometryModel.editedPoint.NodeReference.X = this.currentFullModel.geometryModel.editedPoint.X;
                                currentFullModel.geometryModel.editedPoint.NodeReference.Y = this.currentFullModel.geometryModel.editedPoint.Y;
                            }
                            // отображаем id, x и y точки
                            this.editPointsControl.number.Text = this.currentFullModel.geometryModel.editedPoint.Id.ToString();
                            this.editPointsControl.x.Text      = Mathematics.floor(this.currentFullModel.geometryModel.editedPoint.X, Mathematics.accuracy_medium).ToString();
                            this.editPointsControl.y.Text      = Mathematics.floor(this.currentFullModel.geometryModel.editedPoint.Y, Mathematics.accuracy_medium).ToString();
                            ReDrawAll(true);
                        }
                    }
                }

                // кусочек, который отвечает за перетаскивание узла зоны в режиме редактирования узлов зоны
                if (this.editNodesControl != null && this.editNodesControl.IsHandleCreated && this.mouseAboveEditedNode)
                {
                    if (this.currentFullModel.geometryModel.editedNode != null)
                    {
                        this.currentFullModel.geometryModel.editedNode.X = clickPoint.X;
                        this.currentFullModel.geometryModel.editedNode.Y = clickPoint.Y;
                        if (currentFullModel.geometryModel.editedNode.PointReference != null) // точка может и не иметь ссылки на узел - если это центральная точка дуги, например
                        {
                            if (!(currentFullModel.geometryModel.editedNode.PointReference.IsCenterOfArc || currentFullModel.geometryModel.editedNode.PointReference.IsStartOfArc || currentFullModel.geometryModel.editedNode.PointReference.IsEndOfArc))
                            {
                                currentFullModel.geometryModel.editedNode.PointReference.X = this.currentFullModel.geometryModel.editedNode.X;
                                currentFullModel.geometryModel.editedNode.PointReference.Y = this.currentFullModel.geometryModel.editedNode.Y;
                            }
                        }

                        // отображаем id, x и y точки
                        this.editNodesControl.number.Text = this.currentFullModel.geometryModel.editedNode.Id.ToString();
                        this.editNodesControl.x.Text      = Mathematics.floor(this.currentFullModel.geometryModel.editedNode.X, Mathematics.accuracy_medium).ToString();
                        this.editNodesControl.y.Text      = Mathematics.floor(this.currentFullModel.geometryModel.editedNode.Y, Mathematics.accuracy_medium).ToString();
                        ReDrawAll(true);
                    }
                }
            }
            else
            {
                // подсвечиваем точки и линии

                MyPoint nearestPoint;
                if ((nearestPoint = currentFullModel.geometryModel.Points.Find(p => Math.Abs(clickPoint.X - p.X) < (double)visualizer.pointLocality && Math.Abs(clickPoint.Y - p.Y) < (double)visualizer.pointLocality)) != null)
                {
                    hoveredPoint = nearestPoint;
                    mouseXcord   = nearestPoint.X;
                    mouseYcord   = nearestPoint.Y;
                    ReDrawAll(true);
                }
                else
                {
                    if (hoveredPoint != null)
                    {
                        hoveredPoint = null;
                        ReDrawAll(true);
                    }
                }

                if (creatingCircle) // если мы в режиме рисования окружности
                {
                    if (this.currentFullModel.geometryModel.centerOfCircle != null)
                    {
                        double x1, y1;
                        if (hoveredPoint == null)
                        {
                            x1 = clickPoint.X; y1 = clickPoint.Y;
                        }
                        else
                        {
                            x1 = hoveredPoint.X; y1 = hoveredPoint.Y;
                        }

                        double radius = Mathematics.FindDist(x1, y1, currentFullModel.geometryModel.centerOfCircle.X, currentFullModel.geometryModel.centerOfCircle.Y);
                        if (this.addCirclesControl != null)
                        {
                            this.addCirclesControl.radius.Text = Mathematics.floor(radius, Mathematics.accuracy_medium).ToString();
                        }
                        currentFullModel.geometryModel.tempCircle = new MyCircle(this.currentFullModel.geometryModel.NumOfCircles + 1, this.currentFullModel.geometryModel.centerOfCircle, radius);
                        ReDrawAll(true);
                    }
                }
                if (activeControl is GridAnalysis)
                {
                    MyFiniteElementModel model = currentFullModel.FiniteElementModels.Find(m => m.ModelName == currentFullModel.currentGridName);
                    MyFiniteElement      elem  = model.FiniteElements.Find(el => Mathematics.ContainsPoint(el.Nodes.ToArray(), clickPoint));
                    if (elem != null)
                    {
                        elemInfoTooltip.ToolTipTitle = "Элемент №" + elem.Id.ToString();
                        StringBuilder tooltipText = new StringBuilder();
                        tooltipText.AppendLine("Площадь: " + Mathematics.floor(Mathematics.GeronLaw(elem.Nodes), 0.01));
                        double[] angles = Mathematics.getFEangles(elem);
                        for (int i = 0; i < 3; i++)
                        {
                            tooltipText.AppendLine("Угол " + (i + 1).ToString() + ": " + angles[i].ToString("###.##"));
                        }

                        elemInfoTooltip.Show(tooltipText.ToString(), constructionArea, new Point(e.X, e.Y));
                    }
                    else
                    {
                        elemInfoTooltip.Hide(constructionArea);
                    }
                }
            }
            this.textBox1.Text = Mathematics.floor(mouseXcord, Mathematics.accuracy_medium).ToString();
            this.textBox2.Text = Mathematics.floor(mouseYcord, Mathematics.accuracy_medium).ToString();
        }
Beispiel #14
0
        public void EditPoint(int number, double x, double y)
        {
            MyPoint point = parent.currentFullModel.geometryModel.Points.Find(p => p.Id == number);

            if (point != null)
            {
                if (point.IsCenterOfArc)
                {
                    MessageBox.Show("Нельзя перемещать центр дуги!");
                    return;
                }
                else if (point.IsEndOfArc || point.IsStartOfArc)
                {
                    MyArc[] incidentArcs = parent.currentFullModel.geometryModel.Arcs.Where(a => a.StartPoint == point || a.EndPoint == point).ToArray();

                    if (incidentArcs.Length > 0)
                    {
                        bool PointFits = true;
                        foreach (MyArc arc in incidentArcs)
                        {
                            MyArc testArc;
                            if (arc.EndPoint == point)
                            {
                                testArc = new MyArc(0, arc.Clockwise, arc.StartPoint, new MyPoint(x, y, MyPoint.PointType.IsGeometryPoint), arc.CenterPoint);
                            }
                            else
                            {
                                testArc = new MyArc(0, arc.Clockwise, new MyPoint(x, y, MyPoint.PointType.IsGeometryPoint), arc.EndPoint, arc.CenterPoint);
                            }

                            if (!parent.TestArc(testArc))
                            {
                                PointFits = false;
                                break;
                            }
                        }
                        if (PointFits)
                        {
                            point.X = x;
                            point.Y = y;
                        }
                        else
                        {
                            MessageBox.Show("Новые координаты точки не удовлетворяют условию принадлежности точки к дуге!");
                        }
                    }
                    else
                    {
                        point.X = x;
                        point.Y = y;
                    }
                }
                else
                {
                    point.X = x;
                    point.Y = y;
                }

                if (point.NodeReference != null) // точка может и не иметь ссылки на узел - если это центральная точка дуги, например
                {
                    point.NodeReference.X = x;
                    point.NodeReference.Y = y;
                }
                this.parent.ReDrawAll();

                this.number.Text = "";
                this.x.Text      = "";
                this.y.Text      = "";

                this.number.TextChanged += new System.EventHandler(this.number_TextChanged);
                this.x.TextChanged      += new System.EventHandler(this.x_TextChanged);
                this.y.TextChanged      += new System.EventHandler(this.y_TextChanged);

                this.number.Select();
            }
            else
            {
                this.errorPointDoesNotExist.Visible = true;
            }
        }
Beispiel #15
0
        private void _timerSend_Tick(object sender, EventArgs e)
        {
            if (_images.Count == 1)
            {
                //    _timerSend.Stop();

                TransformMethods.TransferTo objT = new TransferTo();

                _imagesSend.Add(objT.convertImgAnySizeTo256x256(_images[0]));

                rSend.Fill = new ImageBrush()
                {
                    ImageSource = _imagesSend[_countImage]
                };

                switch (_countImage)
                {
                case 0:
                    rS0.Fill = new ImageBrush()
                    {
                        ImageSource = _imagesSend[_countImage]
                    };
                    break;

                case 1:
                    rS1.Fill = new ImageBrush()
                    {
                        ImageSource = _imagesSend[_countImage]
                    };
                    break;

                case 2:
                    rS2.Fill = new ImageBrush()
                    {
                        ImageSource = _imagesSend[_countImage]
                    };

                    break;

                case 3:
                    rS3.Fill = new ImageBrush()
                    {
                        ImageSource = _imagesSend[_countImage]
                    };

                    break;

                default:;
                    break;
                }
                _countImage += 1;
                _images.Clear();
            }

            TransformMethods.WaveLetHaar  objH = new WaveLetHaar();
            TransformMethods.WaveLetCDF97 objD = new WaveLetCDF97();

            //START NEW CICKLE----------------------------------------------------------------------------------------------------------------------

            if (_countImage == _intPackImage)
            {
                DateTime dt0 = DateTime.Now;

                TransformMethods.TransferTo objT = new TransferTo();
                imgOut1024x256 = objT.convertGrayImgToGray1024x256(_imagesSend);

                rSendCombine.Fill = new ImageBrush()
                {
                    ImageSource = imgOut1024x256
                };
                //========================================================================
                sbyte[,] sbHaar;
                sbHaar = objT.convertGrayImgToSByte256(imgOut1024x256);

                if (rbH.IsChecked == true)
                {
                    objH.Haar2DByteForward(ref sbHaar, bLoss, vHaar, hHaar);
                }
                else
                {
                    objD.CDF2DForward(ref sbHaar, bLoss, vHaar, hHaar);
                }

                rSendHaar.Fill = new ImageBrush()
                {
                    ImageSource = objT.convertSByte256ToGrayImg(sbHaar)
                };

                TransformMethods.MyArc objA  = new MyArc();
                List <byte>            outBt = objA.archiveWithTable(sbHaar);

                lblSize.Content = outBt.Count.ToString() + " bytes ... (" + (256 * 256 * 4).ToString() + ")";

                outByte = new List <byte>(outBt);

                flagReady = true;

                DateTime dt1 = DateTime.Now;
                lblDelta.Content = dt1.Subtract(dt0).Milliseconds.ToString() + " ms";

                _countImage = 0;
                _imagesSend.Clear();
            }

            if (_captureSource.State == System.Windows.Media.CaptureState.Started)
            {
                _captureSource.CaptureImageAsync();    // Start Image Async...

                //    _timerSend.Start();                     // Start Timer
            }

            //START NEW CICKLE----------------------------------------------------------------------------------------------------------------------
        }
        public void DrawArc(MyArc arc, Color color, bool drawId = true, double width = 2.0)
        {
            MyPoint pStart = arc.StartPoint, pEnd = arc.EndPoint, pCenter = arc.CenterPoint;

            if (!arc.Clockwise)
            {
                MyPoint p = pStart;
                pStart = pEnd;
                pEnd   = p;
            }
            List <float> nodes      = new List <float>();
            float        radius     = (float)PointsDistance(pCenter, pEnd);
            float        startAngle = (float)ArcAngle(arc, pEnd);

            if (startAngle < 0)
            {
                startAngle += 2.0f * (float)Math.PI;
            }
            float endAngle = (float)ArcAngle(arc, pStart);

            if (endAngle < 0)
            {
                endAngle += 2.0f * (float)Math.PI;
            }

            float h = (endAngle < startAngle) ? (float)(Math.PI * 2.0 - startAngle + endAngle) : (float)(endAngle - startAngle);

            double[] colArray = colorArray(color);
            int      list     = Gl.glGenLists(1);

            Gl.glNewList(list, Gl.GL_COMPILE);
            Gl.glLineWidth((float)width);
            Gl.glColor3dv(colArray);
            Gl.glEndList();
            h /= 50f;
            int i = 0;

            for (float angle = startAngle; i <= 50; angle += h, i++)
            {
                if (angle > 2.0 * Math.PI)
                {
                    angle -= (float)(2.0 * Math.PI);
                }
                if (i == 25)
                {
                    if (drawId)
                    {
                        DrawString("L" + arc.Id.ToString(), (float)(pCenter.X + (radius) * Math.Cos(angle)), (float)(pCenter.Y + (radius) * Math.Sin(angle)));
                    }
                }

                nodes.Add((float)(pCenter.X + radius * Math.Cos(angle)));
                nodes.Add((float)(pCenter.Y + radius * Math.Sin(angle)));
            }
            nodes.Add((float)(pCenter.X + radius * Math.Cos(endAngle)));
            nodes.Add((float)(pCenter.Y + radius * Math.Sin(endAngle)));
            if (drawId)
            {
                FlushText(color);
            }
            float[] pts   = nodes.ToArray();
            int     count = nodes.Count / 2;

            drawBuffer.Add(new DrawingOperation(Gl.GL_LINE_STRIP, pts, list));
        }
 public bool pointFitsArc(double x, double y, MyArc arc, checkType comparePrecision)
 {
     return(pointFitsArc(new MyPoint(x, y, MyPoint.PointType.IsGeometryPoint), arc, comparePrecision));
 }
Beispiel #18
0
        private void OK()
        {
            if (this.number.Text == "")
            {
                MessageBox.Show("Не введены номера линий!");
                return;
            }

            if (this.function.Enabled == true && this.function.Text == "")
            {
                MessageBox.Show("Не введена функция нагрузки!");
                return;
            }
            if (trytocalculateExpression() == false)
            {
                MessageBox.Show("Неверный формат функции нагрузки!");
                return;
            }
            int    x = 0;
            double x1;

            if (this.tb.Text == "")
            {
                x++;
            }
            else
            {
                if (double.TryParse(tb.Text, out x1))
                {
                    ProjectForm.toch = x1;
                }
                else
                {
                    MessageBox.Show("Неверный формат ввода точности нагрузки!");
                    return;
                }
            }
            this.parent.precision = this.parent.DefinePrecision();

            int currentModel = this.parent.GetCurrentModelIndex();

            string[] textlinesnumbers   = this.number.Text.Split(',');
            List <MyStraightLine> lines = new List <MyStraightLine>();
            List <MyArc>          arcs  = new List <MyArc>();

            foreach (string textlinenumber in textlinesnumbers)
            {
                MyStraightLine line = this.parent.currentFullModel.geometryModel.StraightLines.Find(
                    thisline => thisline.Id == Convert.ToInt32(textlinenumber));
                MyArc arc = this.parent.currentFullModel.geometryModel.Arcs.Find(
                    thisline => thisline.Id == Convert.ToInt32(textlinenumber));
                if (line == null && arc == null)
                {
                    //this.number.Clear();
                    this.parent.clearSelection();
                    MessageBox.Show("Неверно заданы линии!");
                    return;
                }
                else if (line != null && arc == null)
                {
                    lines.Add(line);
                }
                else if (line == null && arc != null)
                {
                    arcs.Add(arc);
                }
            }
            if (lines.Count != 0 && arcs.Count != 0)
            {
                //this.number.Clear();
                this.parent.clearSelection();
                MessageBox.Show("Неверно заданы линии!");
                return;
            }
            else if (lines.Count != 0)
            {
                List <MyPoint> points = new List <MyPoint>();
                if (checkLinesConnect(ref lines, ref points, currentModel) == false)
                {
                    //this.number.Clear();
                    this.parent.clearSelection();
                    MessageBox.Show("Неверно заданы линии!");
                    return;
                }
                LineType linesposition = checkLinesPosition(points);
                if (checkLinesOnLine(points, linesposition) == false)
                {
                    //this.number.Clear();
                    this.parent.clearSelection();
                    MessageBox.Show("Неверно заданы линии!");
                    return;
                }
                List <MyNode> nodes = new List <MyNode>();
                getNodesOnLine(lines, ref nodes, currentModel, linesposition);
                this.calculateForceAtNodes(nodes, linesposition, null, currentModel);
            }
            else if (arcs.Count != 0)
            {
                List <MyPoint> points = new List <MyPoint>();
                if (checkArcsConnect(ref arcs, ref points, currentModel) == false)
                {
                    //this.number.Clear();
                    this.parent.clearSelection();
                    MessageBox.Show("Неверно заданы линии!");
                    return;
                }
                LineType      linesposition = LineType.IsArc;
                List <MyNode> nodes         = new List <MyNode>();
                getNodesOnArc(arcs, ref nodes, currentModel, linesposition);
                this.number.Text = Convert.ToString(nodes.Count);
                this.calculateForceAtNodes(nodes, LineType.IsArc, arcs.ElementAt(0), currentModel);
            }
            parent.clearSelection();
            if (this.parent.currentFullModel.FiniteElementModels[currentModel].R.Count == 0)
            {
                for (int i = 0; i <= this.parent.currentFullModel.FiniteElementModels[currentModel].Nodes.Count * 2; i++)
                {
                    this.parent.currentFullModel.FiniteElementModels[currentModel].R.Add(0.0);
                }
            }
            int m = 1;

            foreach (MyNode node in this.parent.currentFullModel.FiniteElementModels[currentModel].Nodes)
            {
                this.parent.currentFullModel.FiniteElementModels[currentModel].R[2 * (m - 1) + 1] = node.ForceX;
                this.parent.currentFullModel.FiniteElementModels[currentModel].R[2 * (m - 1) + 2] = node.ForceY;
                m++;
            }

            this.parent.DrawForces(Color.Purple);
            this.parent.currentFullModel.FiniteElementModels[currentModel].NLD++;
            if (this.parent.showForces.Checked != true)
            {
                this.parent.showForces.Checked = true;
            }

            this.number.TextChanged -= new System.EventHandler(this.number_TextChanged);
            this.number.Text         = "";
            this.number.TextChanged += new System.EventHandler(this.number_TextChanged);
            this.number.Select();

            this.parent.currentFullModel.geometryModel.highlightStraightLines.Clear();
            this.parent.currentFullModel.geometryModel.highlightArcs.Clear();
            this.parent.ReDrawAll();
            this.parent.clearSelection();
        }
Beispiel #19
0
        /// <summary>
        /// функция, реализующая расчет приложенной нагрузки в узлах, лежащих на прямой
        /// </summary>
        /// <param name="nodes">Список узлов, лежащих на линии</param>
        /// <param name="type">Тип линии</param>
        private void calculateForceAtNodes(List <MyNode> nodes, LineType type, MyArc arc, int currentModel)
        {
            // количество итераций для алгоритма симпсона
            int splitCount = 500;

            // мы имеем список узлов, лежащих на стороне, к которой приложенна нагрузка. надо их отсортировать по возрастанию координат
            switch (type)
            {
            case LineType.ParallelOX:
                if (this.ascSort.Checked)
                {
                    nodes.Sort(delegate(MyNode node1, MyNode node2)
                               { return(node1.X.CompareTo(node2.X)); });
                }
                else
                {
                    nodes.Sort(delegate(MyNode node1, MyNode node2)
                               { return(-node1.X.CompareTo(node2.X)); });
                }
                break;

            case LineType.ParallelOY:
                if (this.ascSort.Checked)
                {
                    nodes.Sort(delegate(MyNode node1, MyNode node2)
                               { return(node1.Y.CompareTo(node2.Y)); });
                }
                else
                {
                    nodes.Sort(delegate(MyNode node1, MyNode node2)
                               { return(-node1.Y.CompareTo(node2.Y)); });
                }
                break;

            case LineType.NotParallel:
                if (this.ascSort.Checked)
                {
                    if (this.sortByX.Checked == true)
                    {
                        nodes.Sort(delegate(MyNode node1, MyNode node2)
                                   { return(node1.X.CompareTo(node2.X)); });
                    }
                    else
                    {
                        nodes.Sort(delegate(MyNode node1, MyNode node2)
                                   { return(node1.Y.CompareTo(node2.Y)); });
                    }
                }
                else
                {
                    if (this.sortByX.Checked == true)
                    {
                        nodes.Sort(delegate(MyNode node1, MyNode node2)
                                   { return(-node1.X.CompareTo(node2.X)); });
                    }
                    else
                    {
                        nodes.Sort(delegate(MyNode node1, MyNode node2)
                                   { return(-node1.Y.CompareTo(node2.Y)); });
                    }
                }
                break;

            case LineType.IsArc:
                // упорядочиваем точки дуги по часовой
                if (ascSort.Checked)
                {
                    nodes.Sort(delegate(MyNode point1, MyNode point2)
                    {
                        double phi1 = Math.Atan2(point1.Y - arc.CenterPoint.Y, point1.X - arc.CenterPoint.X);
                        double phi2 = Math.Atan2(point2.Y - arc.CenterPoint.Y, point2.X - arc.CenterPoint.X);
                        if (Math.Abs(phi2 - phi1) < Math.PI)
                        {
                            return(-phi1.CompareTo(phi2));
                        }
                        else
                        {
                            return(phi1.CompareTo(phi2));
                        }
                    });
                }
                else
                {
                    nodes.Sort(delegate(MyNode point1, MyNode point2)
                    {
                        double phi1 = Math.Atan2(point1.Y - arc.CenterPoint.Y, point1.X - arc.CenterPoint.X);
                        double phi2 = Math.Atan2(point2.Y - arc.CenterPoint.Y, point2.X - arc.CenterPoint.X);
                        if (Math.Abs(phi2 - phi1) < Math.PI)
                        {
                            return(phi1.CompareTo(phi2));
                        }
                        else
                        {
                            return(-phi1.CompareTo(phi2));
                        }
                    });
                }
                break;
            }
            List <MyNode> excludedNodes = new List <MyNode>();

            if (cbxExcludeNodes.Checked)
            {
                string[] strNumbers = txtExcludedNodes.Text.Split(',');
                for (int i = 0; i < strNumbers.Length; i++)
                {
                    int    num;
                    MyNode node;
                    bool   error = false;
                    if (!int.TryParse(strNumbers[i], out num))
                    {
                        error = true;
                    }
                    else
                    {
                        node = nodes.Find(n => n.Id == num);
                        if (node == null)
                        {
                            error = true;
                        }
                        else
                        {
                            excludedNodes.Add(node);
                        }
                    }
                    if (error)
                    {
                        MessageBox.Show("Неверно заданы узлы!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                }
            }
            bool excludeFirstNode = false, excludeLastNode = false;

            foreach (MyNode node in excludedNodes)
            {
                if (nodes.IndexOf(node) == 0)
                {
                    excludeFirstNode = true;
                }
                else if (nodes.IndexOf(node) == nodes.Count - 1)
                {
                    excludeLastNode = true;
                }
                else
                {
                    nodes.Remove(node);
                }
            }

            if (type != LineType.IsArc)
            {
                // далее расчитываем значение нагрузки в узле по методу трапеции
                double x1 = 0;
                double y1 = 0;
                double x2 = 0;
                double y2 = 0;
                double x3 = 0;
                double y3 = 0;
                double d21 = 0;
                double d13 = 0;
                double S = 0;
                double d0 = 0.0;
                double Sum, A, B;
                double CH = (this.parent.currentFullModel.geometryModel.Points.Max(point => point.Y) - this.parent.currentFullModel.geometryModel.Points.Min(point => point.Y)) / 2.0;
                CH = CH + this.parent.currentFullModel.geometryModel.Points.Min(point => point.Y);
                double CW = (this.parent.currentFullModel.geometryModel.Points.Max(point => point.X) - this.parent.currentFullModel.geometryModel.Points.Min(point => point.X)) / 2.0;
                CW = CW + this.parent.currentFullModel.geometryModel.Points.Min(point => point.X);
                double k = (nodes[1].Y - nodes[0].Y) / (nodes[1].X - nodes[0].X);
                //double test = 2 * 3.14 - k;
                //test = test + 1;
                for (int i = 0; i < nodes.Count; i++)
                {
                    if ((i == 0 && excludeFirstNode) || (i == nodes.Count - 1 && excludeLastNode))
                    {
                        continue;
                    }
                    //Координата текущей точки
                    x1 = nodes[i].X;
                    y1 = nodes[i].Y;
                    //Координата предыдущей точки
                    if (i != 0)
                    {
                        x3 = nodes[i - 1].X;
                        y3 = nodes[i - 1].Y;
                        if (i == 1 && excludeFirstNode)
                        {
                            x3 -= (x1 - x3);
                            y3 -= (y1 - y3);
                        }
                    }
                    else
                    {
                        x3 = x1;
                        y3 = y1;
                    }
                    //Координата следующей точки
                    if (i != nodes.Count - 1)
                    {
                        x2 = nodes[i + 1].X;
                        y2 = nodes[i + 1].Y;
                        if (i == nodes.Count - 2 && excludeLastNode)
                        {
                            x2 += (x2 - x1);
                            y2 += (y2 - y1);
                        }
                    }
                    else
                    {
                        x2 = x1;
                        y2 = y1;
                    }

                    // Сила приложенная к текущему узлу (вычисляется через площадь трапеции)
                    // S-размер участка поверхности между силами

                    d21 = Mathematics.FindDist(x1, y1, x2, y2);
                    d13 = Mathematics.FindDist(x1, y1, x3, y3);

                    S = (d21 + d13) / 2.0;

                    Sum = CalculateIntegral(d0, d0 + S, splitCount);

                    d0 += S;
                    if (type == LineType.ParallelOX)
                    {
                        if (radioButton1.Checked == true && nodes[0].Y < CH)
                        {
                            nodes[i].ForceY -= Sum;
                        }
                        else if (radioButton1.Checked == true)
                        {
                            nodes[i].ForceY += Sum;
                        }
                        if (radioButton2.Checked == true && nodes[0].Y < CH)
                        {
                            nodes[i].ForceY += Sum;
                        }
                        else if (radioButton2.Checked == true)
                        {
                            nodes[i].ForceY -= Sum;
                        }
                    }
                    if (type == LineType.ParallelOY)
                    {
                        if (radioButton1.Checked == true && nodes[0].X < CW)
                        {
                            nodes[i].ForceX -= Sum;
                        }
                        else if (radioButton1.Checked == true)
                        {
                            nodes[i].ForceX += Sum;
                        }
                        if (radioButton2.Checked == true && nodes[0].X < CW)
                        {
                            nodes[i].ForceX += Sum;
                        }
                        else if (radioButton2.Checked == true)
                        {
                            nodes[i].ForceX -= Sum;
                        }
                    }
                    if (type == LineType.NotParallel)
                    {
                        if (radioButton1.Checked == true)
                        {
                            if ((nodes[0].Y < nodes[1].Y && nodes[0].X < nodes[1].X) ||
                                (nodes[0].Y > nodes[1].Y && nodes[0].X > nodes[1].X))
                            {
                                if (getFEnumber(nodes, LineAngleType.right_up, FESearchSpace.up, currentModel)
                                    > getFEnumber(nodes, LineAngleType.right_up, FESearchSpace.down, currentModel))
                                {
                                    nodes[i].ForceX += Sum * Math.Sin(Math.Atan(Math.Abs(k)));
                                    nodes[i].ForceY -= Sum * Math.Cos(Math.Atan(Math.Abs(k)));
                                }
                                else
                                {
                                    nodes[i].ForceX -= Sum * Math.Sin(Math.Atan(Math.Abs(k)));
                                    nodes[i].ForceY += Sum * Math.Cos(Math.Atan(Math.Abs(k)));
                                }
                            }
                            else if ((nodes[0].Y <nodes[1].Y && nodes[0].X> nodes[1].X) ||
                                     (nodes[0].Y > nodes[1].Y && nodes[0].X < nodes[1].X))
                            {
                                if (getFEnumber(nodes, LineAngleType.left_up, FESearchSpace.up, currentModel)
                                    > getFEnumber(nodes, LineAngleType.left_up, FESearchSpace.down, currentModel))
                                {
                                    nodes[i].ForceX -= Sum * Math.Sin(Math.Atan(Math.Abs(k)));
                                    nodes[i].ForceY -= Sum * Math.Cos(Math.Atan(Math.Abs(k)));
                                }
                                else
                                {
                                    nodes[i].ForceX += Sum * Math.Sin(Math.Atan(Math.Abs(k)));
                                    nodes[i].ForceY += Sum * Math.Cos(Math.Atan(Math.Abs(k)));
                                }
                            }
                        }
                        else if (radioButton2.Checked == true)
                        {
                            if ((nodes[0].Y < nodes[1].Y && nodes[0].X < nodes[1].X) ||
                                (nodes[0].Y > nodes[1].Y && nodes[0].X > nodes[1].X))
                            {
                                if (getFEnumber(nodes, LineAngleType.right_up, FESearchSpace.up, currentModel)
                                    > getFEnumber(nodes, LineAngleType.right_up, FESearchSpace.down, currentModel))
                                {
                                    nodes[i].ForceX -= Sum * Math.Sin(Math.Atan(Math.Abs(k)));
                                    nodes[i].ForceY += Sum * Math.Cos(Math.Atan(Math.Abs(k)));
                                }
                                else
                                {
                                    nodes[i].ForceX += Sum * Math.Sin(Math.Atan(Math.Abs(k)));
                                    nodes[i].ForceY -= Sum * Math.Cos(Math.Atan(Math.Abs(k)));
                                }
                            }
                            else if ((nodes[0].Y <nodes[1].Y && nodes[0].X> nodes[1].X) ||
                                     (nodes[0].Y > nodes[1].Y && nodes[0].X < nodes[1].X))
                            {
                                if (getFEnumber(nodes, LineAngleType.left_up, FESearchSpace.up, currentModel)
                                    > getFEnumber(nodes, LineAngleType.left_up, FESearchSpace.down, currentModel))
                                {
                                    nodes[i].ForceX += Sum * Math.Sin(Math.Atan(Math.Abs(k)));
                                    nodes[i].ForceY += Sum * Math.Cos(Math.Atan(Math.Abs(k)));
                                }
                                else
                                {
                                    nodes[i].ForceX -= Sum * Math.Sin(Math.Atan(Math.Abs(k)));
                                    nodes[i].ForceY -= Sum * Math.Cos(Math.Atan(Math.Abs(k)));
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                //расчет нагрузки на дуге
                double x1  = 0;
                double y1  = 0;
                double x2  = 0;
                double y2  = 0;
                double x3  = 0;
                double y3  = 0;
                double L31 = 0;
                double L12 = 0;
                double S;
                double d0 = 0;

                for (int i = 0; i < nodes.Count; i++)
                {
                    if ((i == 0 && excludeFirstNode) || (i == nodes.Count - 1 && excludeLastNode))
                    {
                        continue;
                    }
                    //Координата текущей точк
                    x1 = nodes[i].X;
                    y1 = nodes[i].Y;
                    //Координата предыдущей точки
                    if (i != 0)
                    {
                        x3 = nodes[i - 1].X;
                        y3 = nodes[i - 1].Y;
                        if (i == 1 && excludeFirstNode)
                        {
                            x3 -= (x1 - x3);
                            y3 -= (y1 - y3);
                        }
                    }
                    else
                    {
                        x3 = x1;
                        y3 = y1;
                    }

                    //Координата следующей точки
                    if (i != nodes.Count - 1)
                    {
                        x2 = nodes[i + 1].X;
                        y2 = nodes[i + 1].Y;
                        if (i == nodes.Count - 2 && excludeLastNode)
                        {
                            x2 += (x2 - x1);
                            y2 += (y2 - y1);
                        }
                    }
                    else
                    {
                        x2 = x1;
                        y2 = y1;
                    }

                    // R1 - сила приложенная к текущему узлу
                    double r = Mathematics.FindDist(arc.CenterPoint, arc.StartPoint);
                    L31 = Mathematics.ArcLength(x1, y1, x3, y3, arc.CenterPoint.X, arc.CenterPoint.Y);
                    L12 = Mathematics.ArcLength(x1, y1, x2, y2, arc.CenterPoint.X, arc.CenterPoint.Y);

                    double R1;

                    S   = (L12 + L31) / 2.0;
                    R1  = CalculateIntegral(d0, d0 + S, splitCount);
                    d0 += S;
                    if (radioButton1.Checked == true)
                    {
                        if (getFEnumber(nodes, arc.CenterPoint, FESearchSpace.inside, currentModel)
                            > getFEnumber(nodes, arc.CenterPoint, FESearchSpace.outside, currentModel))
                        {
                            nodes[i].ForceX += R1 * (x1 - arc.CenterPoint.X) / r;
                            nodes[i].ForceY += R1 * (y1 - arc.CenterPoint.Y) / r;
                        }
                        else
                        {
                            nodes[i].ForceX -= R1 * (x1 - arc.CenterPoint.X) / r;
                            nodes[i].ForceY -= R1 * (y1 - arc.CenterPoint.Y) / r;
                        }
                    }
                    if (radioButton2.Checked == true)
                    {
                        if (getFEnumber(nodes, arc.CenterPoint, FESearchSpace.inside, currentModel)
                            > getFEnumber(nodes, arc.CenterPoint, FESearchSpace.outside, currentModel))
                        {
                            nodes[i].ForceX -= R1 * (x1 - arc.CenterPoint.X) / r;
                            nodes[i].ForceY -= R1 * (y1 - arc.CenterPoint.Y) / r;
                        }
                        else
                        {
                            nodes[i].ForceX += R1 * (x1 - arc.CenterPoint.X) / r;
                            nodes[i].ForceY += R1 * (y1 - arc.CenterPoint.Y) / r;
                        }
                    }
                }
            }
        }
 public static bool checkValidPointOnArc(MyPoint point, MyArc arc)
 {
     if (arc.Clockwise)
     {
         if (point.X.LessOrEqual(arc.StartPoint.X) && point.X.MoreOrEqual(arc.EndPoint.X))
         {
             if (point.Y.LessOrEqual(arc.StartPoint.Y) || point.Y.LessOrEqual(arc.EndPoint.Y))
             {
                 return(true);
             }
         }
         else if (point.X.LessOrEqual(arc.EndPoint.X) && point.X.MoreOrEqual(arc.StartPoint.X))
         {
             if (point.Y.MoreOrEqual(arc.StartPoint.Y) || point.Y.MoreOrEqual(arc.EndPoint.Y))
             {
                 return(true);
             }
         }
         else if (point.Y.LessOrEqual(arc.EndPoint.Y) && point.Y.MoreOrEqual(arc.StartPoint.Y))
         {
             if (point.X.LessOrEqual(arc.EndPoint.X) || point.X.LessOrEqual(arc.StartPoint.X))
             {
                 return(true);
             }
         }
         else if (point.Y.LessOrEqual(arc.StartPoint.Y) && point.Y.MoreOrEqual(arc.EndPoint.Y))
         {
             if (point.X.MoreOrEqual(arc.EndPoint.X) || point.X.MoreOrEqual(arc.StartPoint.X))
             {
                 return(true);
             }
         }
     }
     else if (!arc.Clockwise)
     {
         if (point.X.LessOrEqual(arc.EndPoint.X) && point.X.MoreOrEqual(arc.StartPoint.X))
         {
             if (point.Y.LessOrEqual(arc.EndPoint.Y) || point.Y.LessOrEqual(arc.StartPoint.Y))
             {
                 return(true);
             }
         }
         else if (point.X.LessOrEqual(arc.StartPoint.X) && point.X.MoreOrEqual(arc.EndPoint.X))
         {
             if (point.Y.MoreOrEqual(arc.StartPoint.Y) || point.Y.MoreOrEqual(arc.EndPoint.Y))
             {
                 return(true);
             }
         }
         else if (point.Y.LessOrEqual(arc.EndPoint.Y) && point.Y.MoreOrEqual(arc.StartPoint.Y))
         {
             if (point.X.MoreOrEqual(arc.EndPoint.X) || point.X.MoreOrEqual(arc.StartPoint.X))
             {
                 return(true);
             }
         }
         else if (point.Y.LessOrEqual(arc.StartPoint.Y) && point.Y.MoreOrEqual(arc.EndPoint.Y))
         {
             if (point.X.LessOrEqual(arc.EndPoint.X) || point.X.LessOrEqual(arc.StartPoint.X))
             {
                 return(true);
             }
         }
     }
     return(false);
 }
Beispiel #21
0
        public static string make_data_from_line(string line, out string name, out object val, Dictionary <string, object> dic)
        {
            name = "";
            val  = null;
            string strPatten = @"^\s*(?<name>\S+)\s+(?<type>\S+)\s+(?<rawtxt>.+)";
            Regex  rex       = new Regex(strPatten);
            //MatchCollection matches = rex.Matches(cur_line);
            Match m = rex.Match(line);

            if (m == null)
            {
                throw new Exception("错误的行");
            }

            //根据type写入值 进入dic
            if ("float" == m.Groups["type"].Value)
            {
                //dic.Add(m.Groups["name"].Value, Convert.ToDouble(m.Groups["rawtxt"].Value));
                name = m.Groups["name"].Value;
                val  = Convert.ToDouble(m.Groups["rawtxt"].Value);
                return("s");
            }
            else if ("string" == m.Groups["type"].Value)
            {
                //dic.Add(m.Groups["name"].Value, Convert.ToString(m.Groups["rawtxt"].Value));
                name = m.Groups["name"].Value;
                val  = Convert.ToString(m.Groups["rawtxt"].Value);
                return("s");
            }
            else if ("vector" == m.Groups["type"].Value)
            {
                string[] strs = m.Groups["rawtxt"].Value.Split(',');
                if (3 != strs.Length)
                {
                    throw new Exception("vector应该有三个数");
                }
                name = m.Groups["name"].Value;
                val  = new Vector3D(Convert.ToDouble(strs[0]),
                                    Convert.ToDouble(strs[1]),
                                    Convert.ToDouble(strs[2]));
                return("s");
                //dic.Add(m.Groups["name"].Value, new Vector3D(Convert.ToDouble(strs[0]),
                //                                            Convert.ToDouble(strs[1]),
                //                                            Convert.ToDouble(strs[2])));
            }
            else if ("rect" == m.Groups["type"].Value)
            {
                string[] strs = m.Groups["rawtxt"].Value.Split(',');
                if (4 == strs.Length)
                {
                    if (!dic.ContainsKey(strs[0]))
                    {
                        throw new Exception("未找到向量名");
                    }
                    double   w = Convert.ToDouble(strs[1]);
                    double   h = Convert.ToDouble(strs[2]);
                    double   r = Convert.ToDouble(strs[3]);
                    Vector3D v = (Vector3D)dic[strs[0]] + new Vector3D(w, h);
                    name = m.Groups["name"].Value;
                    val  = new MyRect((Vector3D)dic[strs[0]], v);
                    return("s");
                }
                else if (6 == strs.Length)//指定两个角点
                {
                    Vector3D v1 = new Vector3D(Convert.ToDouble(strs[0]), Convert.ToDouble(strs[1]), Convert.ToDouble(strs[2]));
                    Vector3D v2 = new Vector3D(Convert.ToDouble(strs[3]), Convert.ToDouble(strs[4]), Convert.ToDouble(strs[5]));
                    name = m.Groups["name"].Value;
                    val  = new MyRect(v1, v2);
                    return("s");
                }
                else
                {
                    throw new Exception("错误的rect格式");
                }


                //dic.Add(m.Groups["name"].Value, new MyRect((Vector3D)dic[strs[0]], v));
            }
            else if ("bool" == m.Groups["type"].Value)
            {
                bool f = true;
                if ("0" == m.Groups["rawtxt"].Value)
                {
                    f = false;
                }
                name = m.Groups["name"].Value;
                val  = f;
                return("s");
                //dic.Add(m.Groups["name"].Value, f);
            }
            else if ("arc" == m.Groups["type"].Value)
            {
                string[] strs = m.Groups["rawtxt"].Value.Split(',');
                if (strs.Length != 6)
                {
                    throw new Exception("错误的arc格式");
                }
                Vector3D center  = new Vector3D(Convert.ToDouble(strs[0]), Convert.ToDouble(strs[1]), Convert.ToDouble(strs[2]));
                double   radius  = Convert.ToDouble(strs[3]);
                double   angle1  = Convert.ToDouble(strs[4]);
                double   da      = Convert.ToDouble(strs[5]);
                double   normalz = 1.0;
                if (da < 0)
                {
                    normalz = -1.0;
                }
                name = m.Groups["name"].Value;
                val  = new MyArc(center, radius, angle1, angle1 + da, normalz);
                return("s");
            }
            else if ("polyline" == m.Groups["type"].Value)
            {
                int hang = Convert.ToInt32(m.Groups["rawtxt"].Value);//得到下面的接续行个数 行数放在val中返回
                name = m.Groups["name"].Value;
                val  = hang;
                return("m");
            }
            else if ("lineseg" == m.Groups["type"].Value)
            {
                string[] strs = m.Groups["rawtxt"].Value.Split(',');
                if (strs.Length != 6)
                {
                    throw new Exception("错误的lineseg格式");
                }
                Vector3D    v1  = new Vector3D(Convert.ToDouble(strs[0]), Convert.ToDouble(strs[1]), Convert.ToDouble(strs[2]));
                Vector3D    v2  = new Vector3D(Convert.ToDouble(strs[3]), Convert.ToDouble(strs[4]), Convert.ToDouble(strs[5]));
                LineSegment elo = new LineSegment(v1, v2);
                name = m.Groups["name"].Value;
                val  = elo;
                return("s");
            }
            else if ("cadop" == m.Groups["type"].Value)
            {
                name = m.Groups["name"].Value;
                val  = Convert.ToString(m.Groups["rawtxt"].Value);
                return("s");
            }
            else
            {
                throw new Exception("错误的类型");
            }
        }
        public void TestOnLineCircleAndArc(ref MyPoint newPoint)
        {
            double x = newPoint.X;
            double y = newPoint.Y;

            // случай, если точка оказалась на линии - надо линию разбить этой точкой на две линии
            foreach (MyStraightLine sline in this.currentFullModel.geometryModel.StraightLines)
            {
                if (pointNearLine(x, y, sline))
                {
                    bool removeControl = false;
                    if (addStraightLineControl == null)
                    {
                        addStraightLineControl = new AddStraightLinesControl(this);
                        removeControl          = true;
                    }
                    MyPoint xPoint = crossPoint(newPoint, sline);
                    newPoint.X = xPoint.X;
                    newPoint.Y = xPoint.Y;
                    sline.StartPoint.LineNumbers.Remove(sline.Id);
                    sline.EndPoint.LineNumbers.Remove(sline.Id);
                    this.addStraightLineControl.CreateStraightLine(this.currentFullModel.geometryModel.NumOfLines + 1, sline.StartPoint, newPoint);
                    this.addStraightLineControl.CreateStraightLine(this.currentFullModel.geometryModel.NumOfLines + 1, newPoint, sline.EndPoint);
                    this.currentFullModel.geometryModel.StraightLines.Remove(sline);
                    if (removeControl)
                    {
                        disposeControl(addStraightLineControl);
                    }
                    break;
                }
            }

            // случай, если точка оказалась на окружности, то надо этой точкой разбить окружность на две дуги, + создать вторую точку автоматом
            foreach (MyCircle circle in this.currentFullModel.geometryModel.Circles)
            {
                // уравнение окружности
                if (Math.Abs(Mathematics.FindDist(circle.CenterPoint, newPoint) - circle.Radius) < visualizer.pointLocality)
                {
                    splitCircleByPoint(circle, newPoint);
                    return;
                }
            }

            // случай, если точка оказалась на дуге - надо дугу разбить на две дуги...
            foreach (MyArc arc in this.currentFullModel.geometryModel.Arcs)
            {
                // Потенциально опасный участок :)
                if (pointFitsArc(newPoint, arc, checkType.clickPrecision))
                {
                    double k = Mathematics.FindDist(arc.EndPoint, arc.CenterPoint) / Mathematics.FindDist(newPoint, arc.CenterPoint);
                    newPoint.X = arc.CenterPoint.X + (newPoint.X - arc.CenterPoint.X) * k;
                    newPoint.Y = arc.CenterPoint.Y + (newPoint.Y - arc.CenterPoint.Y) * k;
                    // созаем и рисуем первую дугу
                    MyArc newArc = new MyArc(this.currentFullModel.geometryModel.NumOfLines + 1, arc.Clockwise, arc.StartPoint, newPoint, arc.CenterPoint);
                    this.currentFullModel.geometryModel.Arcs.Add(newArc);
                    this.currentFullModel.geometryModel.NumOfLines++;
                    // создаем и рисуем вторую дугу

                    newArc = new MyArc(this.currentFullModel.geometryModel.NumOfLines + 1, arc.Clockwise, newPoint, arc.EndPoint, arc.CenterPoint);
                    this.currentFullModel.geometryModel.Arcs.Add(newArc);
                    this.currentFullModel.geometryModel.NumOfLines++;
                    // удаляем дугу
                    arc.StartPoint.LineNumbers.Remove(arc.Id);
                    arc.EndPoint.LineNumbers.Remove(arc.Id);
                    arc.CenterPoint.LineNumbers.Remove(arc.Id);
                    this.currentFullModel.geometryModel.Arcs.Remove(arc);
                    break;
                }
            }
            ReDrawAll();
        }
        public bool OK(List <MyPoint> formerNodes = null)
        {
            MyPoint point   = null;
            bool    success = false;

            int[]  lineID     = new int[4];
            bool[] lineExists = { false, false, false, false };

            int numOfArcs = 0;

            parent.clearSelection();

            if (number.TextLength == 0 || line1.TextLength == 0 || line2.TextLength == 0 || line3.TextLength == 0 || line4.TextLength == 0)
            {
                errorMessage1.Visible = true;
                return(success);
            }
            if (errorMessage2.Visible)
            {
                return(success);
            }
            lineID[0] = Convert.ToInt32(line1.Text);
            lineID[1] = Convert.ToInt32(line2.Text);
            lineID[2] = Convert.ToInt32(line3.Text);
            lineID[3] = Convert.ToInt32(line4.Text);
            if (lineID.Distinct().ToArray().Length != 4)
            {
                MessageBox.Show("Зона не может содержать повторяющиеся линии!");
                return(success);
            }

            List <MyPoint>        points = new List <MyPoint>();
            List <MyStraightLine> slines = new List <MyStraightLine>();
            List <MyArc>          arcs   = new List <MyArc>();
            List <MyLine>         lines  = new List <MyLine>();

            // ищем линии
            for (int i = 0; i < 4; i++)
            {
                MyLine         currentLine;
                MyStraightLine line = parent.currentFullModel.geometryModel.StraightLines.Find(ln => ln.Id == lineID[i]);
                MyArc          arc  = parent.currentFullModel.geometryModel.Arcs.Find(a => a.Id == lineID[i]);
                if (line == null)
                {
                    currentLine = arc;
                }
                else
                {
                    currentLine = line;
                }
                if (currentLine != null)
                {
                    lineExists[i] = true;
                    bool neighborLineExists = false;
                    // цикл по всем зонам
                    MyArea area;
                    if (line == null)
                    {
                        area = parent.currentFullModel.geometryModel.Areas.Find(a => a.Arcs.IndexOf(arc) != -1);
                    }
                    else
                    {
                        area = parent.currentFullModel.geometryModel.Areas.Find(a => a.StraightLines.IndexOf(line) != -1);
                    }
                    if (area != null)
                    {
                        if (points.IndexOf(currentLine.EndPoint) == -1)
                        {
                            points.Add(currentLine.EndPoint);
                        }
                        if (points.IndexOf(currentLine.StartPoint) == -1)
                        {
                            points.Add(currentLine.StartPoint);
                        }
                        neighborLineExists = true;
                    }

                    if (!neighborLineExists)
                    {
                        if (points.IndexOf(currentLine.StartPoint) == -1)
                        {
                            points.Add(currentLine.StartPoint);
                        }
                        if (points.IndexOf(currentLine.EndPoint) == -1)
                        {
                            points.Add(currentLine.EndPoint);
                        }
                    }
                    lineExists[i] = true;
                    if (line == null)
                    {
                        arcs.Add(arc);
                        numOfArcs++;
                    }
                    else
                    {
                        slines.Add(line);
                    }
                    lines.Add(currentLine);
                }
            }

            // закончили поиск линий

            if (!lineExists.Contains(false))
            {
                // указанные линии существуют, но надо еще проверить, образуют ли они замкнутую зону
                errorMessage4.Visible   = false;
                errorAreaExists.Visible = false;
                if (points.Count == 4) // условие, определяющее то, что линии образуют замкнутую область
                {
                    errorMessage3.Visible = false;
                    // проверяем число зон, в которым принадлежать линии
                    foreach (MyLine l in lines)
                    {
                        if (l.Areas.Count == 2)
                        {
                            clearLines();
                            errorTwoAreas.Visible = true;
                            return(success);
                        }
                    }

                    // проверяем, нет ли такой зоны уже
                    if (lines.Find(l => l.Areas.Count != 1) == null) //lines[0].Areas.Count == 1 && lines[1].Areas.Count == 1 && lines[2].Areas.Count == 1 && lines[3].Areas.Count == 1)
                    {
                        if (lines.ConvertAll(l => parent.currentFullModel.geometryModel.Areas.Find(ar => ar.Id == l.Areas.First()).Id).Distinct().Count() == 1)
                        {
                            errorAreaExists.Visible = true;
                            clearLines();
                            return(success);
                        }
                    }

                    // определяем первую линию в списке линий
                    int firstLine = 0;
                    for (int i = 0; i < 4; i++)
                    {
                        if (lines[i].Areas.Count == 1)
                        {
                            firstLine = i;
                            break;
                        }
                    }
                    if (firstLine != 0)
                    {
                        MyLine tempLine = lines[0];
                        lines[0]         = lines[firstLine];
                        lines[firstLine] = tempLine;
                    }

                    // определяем вторую линию в списке линий
                    int secondLine = 1;
                    point = lines[0].EndPoint;
                    for (int i = 1; i < 4; i++)
                    {
                        if (point == lines[i].EndPoint || point == lines[i].StartPoint)
                        {
                            secondLine = i;
                            break;
                        }
                    }

                    if (secondLine != 1)
                    {
                        MyLine tempLine = lines[1];
                        lines[1]          = lines[secondLine];
                        lines[secondLine] = tempLine;
                    }

                    // определяем четвертую (последниюю) линию в списке линий. определения третий линии нет, и это не ошибка. она определится автоматом
                    int lastLine = 3;
                    point = lines[0].StartPoint;
                    for (int i = 2; i < 4; i++)
                    {
                        if (point == lines[i].EndPoint || point == lines[i].StartPoint)
                        {
                            lastLine = i;
                            break;
                        }
                    }
                    if (lastLine != 3)
                    {
                        MyLine tempLine = lines[3];
                        lines[3]        = lines[lastLine];
                        lines[lastLine] = tempLine;
                    }

                    points.Clear();
                    int newAreaId;
                    if (!int.TryParse(number.Text, out newAreaId))
                    {
                        errorMessage2.Visible = true;
                        number.Focus();
                        return(success);
                    }

                    if (parent.currentFullModel.geometryModel.Areas.Count > 0)
                    {
                        if (lines.All(l => l.Areas.Count == 0))
                        {
                            MessageBox.Show("Невозможно образовать зону: не прилегает ни к одной из существующих зон");
                            return(success);
                        }
                    }

                    points.Add(lines[0].StartPoint);
                    points.Add(lines[0].EndPoint);
                    if (lines[1].StartPoint != points[1])
                    {
                        points.Add(lines[1].StartPoint);
                    }
                    else
                    {
                        points.Add(lines[1].EndPoint);
                    }

                    if (lines[3].StartPoint != points[0])
                    {
                        points.Add(lines[3].StartPoint);
                    }
                    else
                    {
                        points.Add(lines[3].EndPoint);
                    }

                    double S = Square(points[0], points[1]) + Square(points[1], points[2]) + Square(points[2], points[3]) + Square(points[3], points[0]);

                    if (S > 0.0)
                    {
                        MyPoint tempPoint = points[2];
                        points[2] = points[3];
                        points[3] = tempPoint;

                        tempPoint = points[0];
                        points[0] = points[1];
                        points[1] = tempPoint;

                        MyLine tempLine = lines[1];
                        lines[1] = lines[3];
                        lines[3] = tempLine;
                    }

                    MyPoint[] middlePoints = new MyPoint[4];
                    for (int i = 0; i < 4; i++)
                    {
                        middlePoints[i] = new MyPoint(0, 0, 0);
                    }
                    // если импортируем геометрию, возможно узлы уже двигали
                    // считываем инфу оттуда
                    if (formerNodes != null)
                    {
                        for (int j = 0; j < 4; j++)
                        {
                            MyPoint p1 = points[j];
                            MyPoint p2 = points[j == 3 ? 0 : j + 1];
                            for (int i = 1; i < 8; i += 2)
                            {
                                MyPoint f1 = formerNodes[i - 1];
                                MyPoint f2 = formerNodes[i];
                                MyPoint f3 = formerNodes[i == 7 ? 0 : i + 1];
                                if (Mathematics.sameNode(f1, p1) && Mathematics.sameNode(f3, p2) ||
                                    Mathematics.sameNode(f1, p2) && Mathematics.sameNode(f3, p1))
                                {
                                    middlePoints[j].X = f2.X;
                                    middlePoints[j].Y = f2.Y;
                                }
                            }
                        }
                    }
                    // иначе тыкаем узлы на середины линий. Ручками, конечно, ручками :(
                    else
                    {
                        if (numOfArcs == 0)
                        {
                            middlePoints[0].X = points[0].X + (points[1].X - points[0].X) / 2;
                            middlePoints[0].Y = points[0].Y + (points[1].Y - points[0].Y) / 2;

                            middlePoints[1].X = points[1].X + (points[2].X - points[1].X) / 2;
                            middlePoints[1].Y = points[1].Y + (points[2].Y - points[1].Y) / 2;

                            middlePoints[2].X = points[2].X + (points[3].X - points[2].X) / 2;
                            middlePoints[2].Y = points[2].Y + (points[3].Y - points[2].Y) / 2;

                            middlePoints[3].X = points[3].X + (points[0].X - points[3].X) / 2;
                            middlePoints[3].Y = points[3].Y + (points[0].Y - points[3].Y) / 2;
                        }

                        else
                        {
                            for (int i = 0; i < 4; i++)
                            {
                                int m = i + 1;
                                if (m == 4)
                                {
                                    m = 0;
                                }
                                MyArc tempArc = formAnArc(points[i], points[m]);
                                if (tempArc != null)
                                {
                                    double startAngle  = (180.0 / Math.PI) * ProjectForm.ArcAngle(tempArc, tempArc.StartPoint); // вычисляем углы начальной и конечной точек дуги - меряются они от оси Х против часовой стрелки (в градусах)
                                    double endAngle    = (180.0 / Math.PI) * ProjectForm.ArcAngle(tempArc, tempArc.EndPoint);
                                    double centerAngle = 0;                                                                     // угол от оси Х до точки, делящей дугу по полам

                                    double sweepAngle = 0;                                                                      // угол дуги
                                    if (tempArc.Clockwise && startAngle > endAngle)
                                    {
                                        sweepAngle = (startAngle - endAngle);
                                    }
                                    if (tempArc.Clockwise && startAngle < endAngle)
                                    {
                                        sweepAngle = 360.0 - (endAngle - startAngle);
                                    }
                                    if (!tempArc.Clockwise && startAngle > endAngle)
                                    {
                                        sweepAngle = 360.0 - (startAngle - endAngle);
                                    }
                                    if (!tempArc.Clockwise && startAngle < endAngle)
                                    {
                                        sweepAngle = (endAngle - startAngle);
                                    }

                                    if (sweepAngle > 0.0 && sweepAngle <= 180.0)
                                    {
                                        if (tempArc.Clockwise)
                                        {
                                            centerAngle = startAngle - sweepAngle / 2.0;
                                            double X, Y, R;
                                            R  = Mathematics.FindDist(tempArc.CenterPoint, tempArc.StartPoint);
                                            X  = R * Math.Cos(centerAngle * (Math.PI / 180.0));
                                            Y  = R * Math.Sin(centerAngle * (Math.PI / 180.0));
                                            X += tempArc.CenterPoint.X;
                                            Y += tempArc.CenterPoint.Y;
                                            middlePoints[i].X = X;
                                            middlePoints[i].Y = Y;
                                        }
                                        else
                                        {
                                            centerAngle = startAngle + sweepAngle / 2.0;
                                            double X, Y, R;
                                            R  = Mathematics.FindDist(tempArc.CenterPoint, tempArc.StartPoint);
                                            X  = R * Math.Cos(centerAngle * (Math.PI / 180.0));
                                            Y  = R * Math.Sin(centerAngle * (Math.PI / 180.0));
                                            X += tempArc.CenterPoint.X;
                                            Y += tempArc.CenterPoint.Y;
                                            middlePoints[i].X = X;
                                            middlePoints[i].Y = Y;
                                        }
                                    }
                                    if (sweepAngle < 0.0 && sweepAngle >= -180.0)
                                    {
                                        if (tempArc.Clockwise)
                                        {
                                            centerAngle = startAngle + sweepAngle / 2.0;
                                            double X, Y, R;
                                            R  = Mathematics.FindDist(tempArc.CenterPoint, tempArc.StartPoint);
                                            X  = R * Math.Cos(centerAngle * (Math.PI / 180.0));
                                            Y  = R * Math.Sin(centerAngle * (Math.PI / 180.0));
                                            X += tempArc.CenterPoint.X;
                                            Y += tempArc.CenterPoint.Y;
                                            middlePoints[i].X = X;
                                            middlePoints[i].Y = Y;
                                        }
                                        else
                                        {
                                            centerAngle = startAngle - sweepAngle / 2.0;
                                            double X, Y, R;
                                            R  = Mathematics.FindDist(tempArc.CenterPoint, tempArc.StartPoint);
                                            X  = R * Math.Cos(centerAngle * (Math.PI / 180.0));
                                            Y  = R * Math.Sin(centerAngle * (Math.PI / 180.0));
                                            X += tempArc.CenterPoint.X;
                                            Y += tempArc.CenterPoint.Y;
                                            middlePoints[i].X = X;
                                            middlePoints[i].Y = Y;
                                        }
                                    }
                                }
                                else
                                {
                                    middlePoints[i].X = points[i].X + (points[m].X - points[i].X) / 2;
                                    middlePoints[i].Y = points[i].Y + (points[m].Y - points[i].Y) / 2;
                                }
                            }
                        }
                    }

                    List <MyPoint> Nodes = new List <MyPoint>();

                    for (int i = 0; i < 4; i++) // этим мы обеспечиваем чередование угловых узлов зоны с промежуточными узлами, а также следим за сковозной нумерацией узлов для всех зон пластины
                    {
                        bool pointExists      = false;
                        bool middlePointExits = false;
                        // Находим все зоны, содержащие текущую точку
                        List <MyArea> areas = parent.currentFullModel.geometryModel.Areas.FindAll(a => a.Nodes.Any(n => Mathematics.sameNode(n, points[i]) || Mathematics.sameNode(n, middlePoints[i])));
                        areas.Sort((a, b) => a.Id.CompareTo(b.Id));
                        foreach (MyArea area in areas)    // просматриваем все зоны
                        {
                            int     borderSideNumber = 0; // номер стороны существующей зоны, которая соприкасается с другой зоной. номер человеческий и начинается с 1 а не с 0
                            MyPoint node             = area.Nodes.Find(n => Mathematics.sameNode(n, points[i]) && !Nodes.Contains(n));
                            if (node != null)
                            {
                                Nodes.Add(node); // добавляем в список узлов зоны узел, который уже есть в списке узлов другой зоны
                                pointExists = true;
                            }
                            node = area.Nodes.Find(n => Mathematics.sameNode(n, middlePoints[i]) && !Nodes.Contains(n));
                            if (node != null)
                            {
                                Nodes.Add(node); // добавляем в список узлов зоны узел, который уже есть в списке узлов другой зоны
                                middlePointExits = true;
                                borderSideNumber = (area.Nodes.IndexOf(node) + 1) / 2;

                                parent.currentFullModel.geometryModel.joinTable[area.Id - 1, borderSideNumber - 1] = newAreaId; // т.к. area.Id и borderSideNumber - это индексы, а нумерация индексов с 0, то отнимаем 1
                                parent.currentFullModel.geometryModel.joinTable[newAreaId - 1, i] = area.Id;
                            }
                        }

                        if (!pointExists) // если пройдя по всем зонам, мы не нашли там таких узлов, то создаем новый объект и добавляем его в список зоны
                        {
                            parent.currentFullModel.geometryModel.NumOfAreaNodes++;
                            Nodes.Add(new MyPoint(parent.currentFullModel.geometryModel.NumOfAreaNodes, points[i].X, points[i].Y, MyPoint.PointType.IsAreaNode));
                            foreach (MyPoint p in parent.currentFullModel.geometryModel.Points) // задаем узлу зоны в соответствие точку геометрии и наоборот
                            {
                                if (p.X == points[i].X && p.Y == points[i].Y)
                                {
                                    Nodes[Nodes.Count - 1].PointReference = p;
                                    p.NodeReference = Nodes[Nodes.Count - 1];
                                    break;
                                }
                            }
                        }

                        if (!middlePointExits) // если пройдя по всем зонам, мы не нашли там таких узлов, то создаем новый объект и добавляем его в список зоны
                        {
                            parent.currentFullModel.geometryModel.NumOfAreaNodes++;
                            Nodes.Add(new MyPoint(parent.currentFullModel.geometryModel.NumOfAreaNodes, middlePoints[i].X, middlePoints[i].Y, MyPoint.PointType.IsAreaNode));
                            foreach (MyPoint p in parent.currentFullModel.geometryModel.Points) // задаем узлу зоны в соответствие точку геометрии и наоборот
                            {
                                if (p.X == middlePoints[i].X && p.Y == middlePoints[i].Y)
                                {
                                    Nodes[Nodes.Count - 1].PointReference = p;
                                    p.NodeReference = Nodes[Nodes.Count - 1];
                                    break;
                                }
                            }
                        }
                    }

                    List <MyStraightLine> Segments = new List <MyStraightLine>();
                    for (int i = 0; i < 8; i++) // этим мы создаем отрезки и соединяем ими узлы зоны
                    {
                        int k = i + 1;
                        if (k == 8)
                        {
                            k = 0;
                        }
                        Segments.Add(new MyStraightLine(0, Nodes[i], Nodes[k]));
                    }

                    MyArea newArea = new MyArea(newAreaId, lines, slines, Segments, points, arcs, Nodes);

                    parent.currentFullModel.geometryModel.Areas.Add(newArea);
                    success = true;
                    parent.currentFullModel.geometryModel.NumOfAreas++;

                    foreach (MyLine l in lines)
                    {
                        l.Areas.Add(newAreaId);
                    }

                    number.Text = (parent.currentFullModel.geometryModel.NumOfAreas + 1).ToString();


                    parent.showOnlyAreas.Checked = true;
                }
                else
                {
                    errorMessage3.Visible = true;
                }
            }
            else
            {
                errorMessage4.Visible = true;
            }
            return(success);
        }
Beispiel #24
0
        public void ReadSFMFile(string FileName)
        {
            int i;

            // откроем бинарный файл *.sfm
            FileStream F1 = null;

            try
            {
                F1 = new FileStream(FileName, FileMode.Open, FileAccess.Read);
            }
            catch (IOException e)
            {
                MessageBox.Show(e.Message);
                return;
            }
            BinaryReader reader1 = new BinaryReader(F1);

            byte[] array1 = reader1.ReadBytes(10); // читаем префикс
            string prefix = "";

            for (i = 0; i < 10; i++)
            {
                prefix += Convert.ToChar(array1[i]).ToString();
            }
            if (prefix != "Sigma Form")
            {
                MessageBox.Show("Данный файл не является файлом формы!");
                return;
            }

            int version = reader1.ReadInt32();                 // читаем версию

            int bytes = reader1.ReadInt16();                   // читаем количество байт отведенных под хранение числа с плавающей точкой - 2 байта

            byte taskType = reader1.ReadByte();                // тип задачи - 1 байт

            this.variant.Text = reader1.ReadByte().ToString(); // вариант - 1 байт

            int NRC = reader1.ReadInt16();                     // NRC - 2 байта (не имеет никакого значения - параметр все равно задает пользователь при создании сетки)

            // читаем магические 4 байта - не понятно что это... в спецификации нет, в исходниках тоже, откуда взялись - не понятно. если не прочитать, то не заработает...
            int magic = reader1.ReadInt32();

            //24 байта до DB

            double DB = reader1.ReadDouble();        // ширина - 8 байт (не имеет никакого значения - определяется автоматически, если надо)
            double DH = reader1.ReadDouble();        // выстока - 8 байт (не имеет никакого значения - определяется автоматически, если надо)

            double radius = reader1.ReadDouble();    // радиус отверстия - 8 байт (не имеет никакого значения - определяется автоматически, если надо)

            double thickness = reader1.ReadDouble(); // толщина - 8 байт. Такие параметры, как толщина и свойства материала мы не можем применить ко всей пластине из-за устаревшей версии sfm файла, поэтому мы просто сохраним их в библиотеку материалов

            double RsumX = reader1.ReadDouble();
            double RsumY = reader1.ReadDouble();

            Int32 NLD = reader1.ReadInt32();                    // число случаев нагружения - 4 байта

            Int32 NDF = reader1.ReadInt32();                    // число степеней свободы - 4 байта

            Int32 NCN = reader1.ReadInt32();                    // число узлов в элементе - 4 байта

            Int32 NMAT = reader1.ReadInt32();                   // число материалов - 4 байта

            double E = reader1.ReadDouble();                    // свойства материалов - модуль упругости
            double p = reader1.ReadDouble();                    // коэффициент Пуассона
            double T = reader1.ReadDouble();                    // допускаемое напряжение
            double L = reader1.ReadDouble();                    //

            Int32 numOfAreas = reader1.ReadInt32();             // число зон - 4 байта

            Int32 numOfPoints = reader1.ReadInt32();            // число узлов зон - 4 байта

            List <MyPoint> allAreaNodes = new List <MyPoint>(); // список всех узлов, но они тут никак не объединены в зоны

            //reader1.ReadInt32();
            for (i = 0; i < numOfPoints; i++)
            {
                int id = reader1.ReadInt16();
                reader1.ReadBytes(6); // магические 6 байт. таже фигня что и выше.. и теперь я кажется знаю что это за ересь. в делфях тип record занимет больше памяти чем сумма памяти под ее члены. и для этого случая аж на 6 байт больше. и располагаются они между integer и real......

                double x = reader1.ReadDouble();
                double y = reader1.ReadDouble();
                allAreaNodes.Add(new MyPoint(id, x, y, MyPoint.PointType.IsAreaNode));
            }
            allAreaNodes.Sort((n1, n2) => n1.Id.CompareTo(n2.Id));

            AddAreasControl control = new AddAreasControl(this);

            for (i = 0; i < numOfAreas; i++)
            {
                List <MyPoint> areaNodes = new List <MyPoint>();  // список из 8 узлов, составляющих зону.
                for (int j = 0; j < 8; j++)
                {
                    int     nodeId = reader1.ReadInt16(); // номер узла
                    MyPoint node   = allAreaNodes.Find(n => n.Id == nodeId);
                    if (node != null)
                    {
                        areaNodes.Add(node);
                    }
                }

                // после того, как мы знаем из каких узлов состоит зона, то мы можем создать точки, линии и дуги - т.е. создать гемоетрию по зоне.



                // создаем сначала точки
                List <MyPoint> points = new List <MyPoint>(); // угловые точки зоны
                for (int j = 0; j < 8; j += 2)
                {
                    MyPoint existing = currentFullModel.geometryModel.Points.Find(pt => Mathematics.sameNode(pt, areaNodes[j]));
                    if (existing != null)
                    {
                        points.Add(existing);
                    }

                    else
                    {
                        MyPoint newPoint = new MyPoint(this.currentFullModel.geometryModel.NumOfPoints + 1, areaNodes[j].X, areaNodes[j].Y, MyPoint.PointType.IsGeometryPoint);
                        this.currentFullModel.geometryModel.Points.Add(newPoint);
                        points.Add(newPoint);
                        //this.DrawPoint(newPoint, System.Drawing.Color.Blue);
                        this.currentFullModel.geometryModel.NumOfPoints++;
                    }
                }

                List <MyStraightLine> slines = new List <MyStraightLine>();
                List <MyArc>          arcs   = new List <MyArc>();
                List <MyLine>         lines  = new List <MyLine>();

                // цикл по четырем с сторонам зоны - каждый раз берем три точки с одной стороны - 1,2,3; 3,4,5; 5,6,7 и 7,8,1
                for (int j = 0; j <= 6; j = j + 2)
                {
                    MyPoint p1 = areaNodes[j], p2 = areaNodes[j + 1], p3 = areaNodes[j == 6 ? 0 : j + 2];

                    double xc, yc;

                    double k1 = Math.Cos(Math.Atan2(p2.Y - p1.Y, p2.X - p1.X));
                    double k2 = Math.Cos(Math.Atan2(p3.Y - p2.Y, p3.X - p2.X));
                    if (Math.Abs(k1 - k2) < 0.01) // если коэффициенты наклона совпадают, значит точки лежат на прямой (условие непрерывности выполняется, т.к. известно что все точки принадлежат одной стороне зоны)
                    {
                        // создаем прямую линию
                        MyPoint start = null;
                        MyPoint end   = null;

                        foreach (MyPoint point in this.currentFullModel.geometryModel.Points)
                        {
                            if (Mathematics.sameNode(point, p1))
                            {
                                start = point;
                            }
                            else if (Mathematics.sameNode(point, p3))
                            {
                                end = point;
                            }
                        }

                        MyStraightLine line = currentFullModel.geometryModel.StraightLines.Find(
                            sline => (sline.StartPoint == start && sline.EndPoint == end) || (sline.StartPoint == end && sline.EndPoint == start)
                            );

                        if (line != null)
                        {
                            slines.Add(line);
                            lines.Add(line);
                        }

                        else
                        {
                            MyStraightLine newLine = new MyStraightLine(this.currentFullModel.geometryModel.NumOfLines + 1, start, end);
                            this.currentFullModel.geometryModel.StraightLines.Add(newLine);
                            slines.Add(newLine);
                            lines.Add(newLine);
                            this.currentFullModel.geometryModel.NumOfLines++;
                        }
                    }
                    else
                    {
                        double x1 = p1.X, x2 = p2.X, x3 = p3.X;
                        double y1 = p1.Y, y2 = p2.Y, y3 = p3.Y;
                        // затем проверяем каждую сторону зоны - может ли она быть дугой или нет. для этого пытаемся расчитать центр окружности по трем точкам, и если получается, то создаем дугу.
                        if (Math.Abs(x1 * y2 + y1 * x3 - y2 * x3 - x1 * y3 - x2 * y1 + x2 * y3) > 0.1) // если знаменатель не равен нулю
                        {
                            // адские формулы центра окржуности - расчитал Великий Maple
                            // yc = -1.0 / 2.0 * (-x2 * x2 * x1 - y2 * y2 * x1 - x2 * x3 * x3 - x1 * x1 * x3 - y1 * y1 * x3 + x1 * x3 * x3 + x2 * x2 * x3 + y2 * y2 * x3 + x2 * x1 * x1 + x2 * y1 * y1 + x1 * y3 * y3 - x2 * y3 * y3) / (x1 * y2 + y1 * x3 - y2 * x3 - x1 * y3 - x2 * y1 + x2 * y3);
                            // xc = 1.0 / 2.0 * (-x1 * x1 * y3 + x1 * x1 * y2 - x3 * x3 * y2 + y1 * y1 * y2 + y1 * y3 * y3 + y3 * x2 * x2 - y1 * x2 * x2 - y1 * y2 * y2 + y1 * x3 * x3 - y3 * y3 * y2 - y1 * y1 * y3 + y3 * y2 * y2) / (x1 * y2 + y1 * x3 - y2 * x3 - x1 * y3 - x2 * y1 + x2 * y3);

                            // есть формулы попроще:

                            double R1Sqr = x1 * x1 + y1 * y1;
                            double R2Sqr = x2 * x2 + y2 * y2;
                            double R3Sqr = x3 * x3 + y3 * y3;
                            xc = ((R3Sqr - R1Sqr) * (y2 - y1) - (R2Sqr - R1Sqr) * (y3 - y1)) / ((x3 - x1) * (y2 - y1) - (x2 - x1) * (y3 - y1)) / 2.0;
                            yc = ((R2Sqr - R1Sqr) * (x3 - x1) - (R3Sqr - R1Sqr) * (x2 - x1)) / ((x3 - x1) * (y2 - y1) - (x2 - x1) * (y3 - y1)) / 2.0;


                            // ищем в точках точку с такими координатами, если не найдем, то созадим новую
                            MyPoint definedCenter = new MyPoint(xc, yc);

                            MyPoint centerPoint = currentFullModel.geometryModel.Points.Find(pt => Mathematics.sameNode(pt, definedCenter));
                            // если нет, тогда создаем новую точку - центр дуги
                            if (centerPoint == null)
                            {
                                centerPoint = new MyPoint(this.currentFullModel.geometryModel.NumOfPoints + 1, xc, yc, MyPoint.PointType.IsGeometryPoint);
                                this.currentFullModel.geometryModel.Points.Add(centerPoint);
                                //this.DrawPoint(centerPoint, System.Drawing.Color.Blue);
                                this.currentFullModel.geometryModel.NumOfPoints++;
                            }

                            // и проводим дугу...
                            MyPoint start = null;
                            //MyPoint p2 = null;
                            MyPoint end = null;
                            foreach (MyPoint point in this.currentFullModel.geometryModel.Points)
                            {
                                if (Mathematics.sameNode(point, p1))
                                {
                                    start = point;
                                }
                                else if (Mathematics.sameNode(point, p3))
                                {
                                    end = point;
                                }
                            }

                            bool lineExists = false;
                            foreach (MyArc arc in this.currentFullModel.geometryModel.Arcs)
                            {
                                if ((arc.StartPoint == start && arc.EndPoint == end) || (arc.StartPoint == end && arc.EndPoint == start))
                                {
                                    lineExists = true;
                                    arcs.Add(arc);
                                    lines.Add(arc);
                                    break;
                                }
                            }

                            if (!lineExists)
                            {
                                // пробуем создать дугу с поворотом по часовой стрелке. если это невозоможно, то создадим с поворотом против)
                                //MyArc newArc = new MyArc(this.currentFullModel.geometryModel.NumOfLines + 1, true, start, p2, centerPoint);
                                MyArc newArc = new MyArc(this.currentFullModel.geometryModel.NumOfLines + 1, true, start, end, centerPoint);
                                if (this.TestArc(newArc))
                                {
                                    this.currentFullModel.geometryModel.Arcs.Add(newArc);
                                    arcs.Add(newArc);
                                    lines.Add(newArc);
                                    //this.DrawArc(newArc, Color.Blue);
                                    this.currentFullModel.geometryModel.NumOfLines++;
                                }
                                else
                                {
                                    //newArc = new MyArc(this.currentFullModel.geometryModel.NumOfLines + 1, false, start, p2, centerPoint);
                                    newArc = new MyArc(this.currentFullModel.geometryModel.NumOfLines + 1, false, start, end, centerPoint);
                                    if (this.TestArc(newArc))
                                    {
                                        this.currentFullModel.geometryModel.Arcs.Add(newArc);
                                        arcs.Add(newArc);
                                        lines.Add(newArc);
                                        //this.DrawArc(newArc, Color.Blue);
                                        this.currentFullModel.geometryModel.NumOfLines++;
                                    }
                                }
                            }
                        }
                    }
                }

                List <MyStraightLine> Segments = new List <MyStraightLine>();
                for (int l = 0; l < 8; l++) // этим мы создаем отрезки и соединяем ими узлы зоны
                {
                    int k = l + 1;
                    if (k == 8)
                    {
                        k = 0;
                    }
                    Segments.Add(new MyStraightLine(0, areaNodes[l], areaNodes[k]));
                }

                // эмулируем создание зоны так, как если бы мы создавали ее вручную
                control.number.Text = (this.currentFullModel.geometryModel.NumOfAreas + 1).ToString();
                control.line1.Text  = lines[0].Id.ToString();
                control.line2.Text  = lines[1].Id.ToString();
                control.line3.Text  = lines[2].Id.ToString();
                control.line4.Text  = lines[3].Id.ToString();
                control.OK(areaNodes);
            }
        }
Beispiel #25
0
        public MyArc CreateArc(int number, bool cw, MyPoint p1, MyPoint p2, MyPoint p3)
        {
            MyArc newArc = new MyArc(number, cw, p1, p2, p3);

            if (this.parent.TestArc(newArc))
            {
                this.parent.currentFullModel.geometryModel.Arcs.Add(newArc);
                this.parent.currentFullModel.geometryModel.NumOfLines++;

                this.number.Text = (parent.currentFullModel.geometryModel.NumOfLines + 1).ToString();

                this.start2Point.TextChanged  -= new System.EventHandler(this.start2Point_TextChanged);
                this.end2Point.TextChanged    -= new System.EventHandler(this.end2Point_TextChanged);
                this.center2Point.TextChanged -= new System.EventHandler(this.center2Point_TextChanged);

                this.start2Point.Text  = "";
                this.end2Point.Text    = "";
                this.center2Point.Text = "";

                this.start2Point.TextChanged  += new System.EventHandler(this.start2Point_TextChanged);
                this.end2Point.TextChanged    += new System.EventHandler(this.end2Point_TextChanged);
                this.center2Point.TextChanged += new System.EventHandler(this.center2Point_TextChanged);

                this.start2Point.Select();

                return(newArc);
            }
            else
            {
                if (parent.currentFullModel.geometryModel.Arcs.FindAll(p => p.StartPoint == p1).Count == 0)
                {
                    p1.IsStartOfArc = false;
                }
                if (parent.currentFullModel.geometryModel.Arcs.FindAll(p => p.EndPoint == p1).Count == 0)
                {
                    p1.IsEndOfArc = false;
                }
                if (parent.currentFullModel.geometryModel.Arcs.FindAll(p => p.CenterPoint == p1).Count == 0)
                {
                    p1.IsCenterOfArc = false;
                }
                if (parent.currentFullModel.geometryModel.Arcs.FindAll(p => p.StartPoint == p2).Count == 0)
                {
                    p2.IsStartOfArc = false;
                }
                if (parent.currentFullModel.geometryModel.Arcs.FindAll(p => p.EndPoint == p2).Count == 0)
                {
                    p2.IsEndOfArc = false;
                }
                if (parent.currentFullModel.geometryModel.Arcs.FindAll(p => p.CenterPoint == p2).Count == 0)
                {
                    p2.IsCenterOfArc = false;
                }
                if (parent.currentFullModel.geometryModel.Arcs.FindAll(p => p.StartPoint == p3).Count == 0)
                {
                    p3.IsStartOfArc = false;
                }
                if (parent.currentFullModel.geometryModel.Arcs.FindAll(p => p.EndPoint == p3).Count == 0)
                {
                    p3.IsEndOfArc = false;
                }
                if (parent.currentFullModel.geometryModel.Arcs.FindAll(p => p.CenterPoint == p3).Count == 0)
                {
                    p3.IsCenterOfArc = false;
                }
                MessageBox.Show("Невозможно создать дугу!");
                return(null);
            }
        }
        private void constructionArea_MouseClick(object sender, MouseEventArgs e)
        {
            MyPoint clickPoint = visualizer.getClickPoint(e.X, e.Y);

            mouseAboveArea = true;
            if (this.mouseMoved)
            {
                this.mouseMoved = false;
                return; // смысл данного действа в том, что если область отображения перемещали мышкой, то ничего рисовать не нужно (перемещение происходит при одновременно нажатой левой клавише мыши и при ее движнии, и комп воспринимает это как событие MouseClick)
            }
            constructionArea.Focus();

            // создаем точку
            if (addPointControl != null && addPointControl.IsHandleCreated)
            {
                MyPoint newPoint = this.addPointControl.CreatePoint(Convert.ToInt32(this.addPointControl.number.Text), clickPoint.X, clickPoint.Y);
                this.TestOnLineCircleAndArc(ref newPoint); // проверяем, не попала ли точка на линию, окружность или дугу
            }

            // запоминаем выбранную точку, и если их две, то рисуем линию между ними
            if (addStraightLineControl != null && addStraightLineControl.IsHandleCreated)
            {
                MyPoint point = currentFullModel.geometryModel.Points.Find(p => Math.Abs(p.X - clickPoint.X) < visualizer.pointLocality && Math.Abs(p.Y - clickPoint.Y) < visualizer.pointLocality);
                if (point != null)
                {
                    if (e.Button == MouseButtons.Left)
                    {
                        this.currentFullModel.geometryModel.pairOfPoints.Add(point);
                        if (this.currentFullModel.geometryModel.pairOfPoints.Count == 1)
                        {
                            this.addStraightLineControl.startPoint.Text = point.Id.ToString();
                        }
                        if (this.currentFullModel.geometryModel.pairOfPoints.Count == 2)
                        {
                            this.addStraightLineControl.endPoint.Text = point.Id.ToString();
                            this.addStraightLineControl.CreateStraightLine(Convert.ToInt32(this.addStraightLineControl.number.Text), this.currentFullModel.geometryModel.pairOfPoints[0], this.currentFullModel.geometryModel.pairOfPoints[1]);
                            clearSelection();
                        }
                    }
                    else if (e.Button == MouseButtons.Right)
                    {
                        if (currentFullModel.geometryModel.pairOfPoints.Count > 0)
                        {
                            addStraightLineControl.startPoint.Text = "";
                            clearSelection();
                        }
                    }
                    ReDrawAll();
                }
            }

            // запоминаем выбранную точку, и если их три то рисуем дугу - режим создания дуги
            if (addArcsControl != null && addArcsControl.IsHandleCreated)
            {
                MyPoint point = currentFullModel.geometryModel.Points.Find(p => Math.Abs(p.X - clickPoint.X) < visualizer.pointLocality && Math.Abs(p.Y - clickPoint.Y) < visualizer.pointLocality);
                if (point != null)
                {
                    if (e.Button == MouseButtons.Left)
                    {
                        this.currentFullModel.geometryModel.tripleOfPoints.Add(point);
                        if (this.currentFullModel.geometryModel.tripleOfPoints.Count == 1)
                        {
                            this.addArcsControl.start2Point.Text = point.Id.ToString();
                        }
                        if (this.currentFullModel.geometryModel.tripleOfPoints.Count == 2)
                        {
                            this.addArcsControl.end2Point.Text = point.Id.ToString();
                        }
                        if (this.currentFullModel.geometryModel.tripleOfPoints.Count == 3)
                        {
                            this.addArcsControl.center2Point.Text = point.Id.ToString();
                        }
                        if (this.currentFullModel.geometryModel.tripleOfPoints.Count == 3)
                        {
                            this.addArcsControl.CreateArc(Convert.ToInt32(this.addArcsControl.number.Text), this.addArcsControl.сlockwise.Checked, currentFullModel.geometryModel.tripleOfPoints[0], currentFullModel.geometryModel.tripleOfPoints[1], currentFullModel.geometryModel.tripleOfPoints[2]);
                            this.currentFullModel.geometryModel.tripleOfPoints.Clear();
                        }
                    }
                    else if (e.Button == MouseButtons.Right)
                    {
                        if (currentFullModel.geometryModel.tripleOfPoints.Count == 1)
                        {
                            currentFullModel.geometryModel.tripleOfPoints.Remove(point);
                            addArcsControl.start2Point.Text = "";
                        }
                        else
                        {
                            currentFullModel.geometryModel.tripleOfPoints.Remove(point);
                            if (addArcsControl.start2Point.Text == point.Id.ToString())
                            {
                                addArcsControl.start2Point.Text = addArcsControl.end2Point.Text;
                                addArcsControl.end2Point.Text   = "";
                            }
                            else
                            {
                                addArcsControl.end2Point.Text = "";
                            }
                        }
                    }
                }
            }

            // выделяем или снимаем выделение с точки
            if (this.editPointsControl != null && this.editPointsControl.IsHandleCreated)
            {
                if (currentFullModel.geometryModel.Points.Find(p => Math.Abs(p.X - clickPoint.X) < visualizer.pointLocality &&
                                                               Math.Abs(p.Y - clickPoint.Y) < visualizer.pointLocality) == null)
                {
                    currentFullModel.geometryModel.editedPoint = null;
                    editPointsControl.number.Text = editPointsControl.x.Text = editPointsControl.y.Text = "";
                    ReDrawAll();
                }

                MyPoint point = currentFullModel.geometryModel.Points.Find(p => Math.Abs(p.X - clickPoint.X) < visualizer.pointLocality &&
                                                                           Math.Abs(p.Y - clickPoint.Y) < visualizer.pointLocality);
                if (point != null)
                {
                    if (e.Button == MouseButtons.Right) // если нажали правую кнопку мыши, то снять выделение с точки
                    {
                        if (this.currentFullModel.geometryModel.editedPoint != null && this.currentFullModel.geometryModel.editedPoint == point)
                        {
                            this.currentFullModel.geometryModel.editedPoint = null;

                            // сбрасываем id, x и y
                            this.editPointsControl.number.Text = "";
                            this.editPointsControl.x.Text      = "";
                            this.editPointsControl.y.Text      = "";
                            ReDrawAll();
                        }
                    }

                    if (e.Button == MouseButtons.Left) // если нажали левую кнопку мыши, то выделить точку
                    {
                        this.currentFullModel.geometryModel.editedPoint = point;

                        // отображаем id, x и y точки
                        this.editPointsControl.number.Text = this.currentFullModel.geometryModel.editedPoint.Id.ToString();
                        this.editPointsControl.x.Text      = Mathematics.floor(this.currentFullModel.geometryModel.editedPoint.X, Mathematics.accuracy_medium).ToString();
                        this.editPointsControl.y.Text      = Mathematics.floor(this.currentFullModel.geometryModel.editedPoint.Y, Mathematics.accuracy_medium).ToString();
                        ReDrawAll();
                    }
                }
            }

            if (this.editNodesControl != null && editNodesControl.IsHandleCreated)
            {
                foreach (MyArea area in this.currentFullModel.geometryModel.Areas)
                {
                    MyPoint node = area.Nodes.Find(p => Math.Abs(p.X - clickPoint.X) < visualizer.pointLocality &&
                                                   Math.Abs(p.Y - clickPoint.Y) < visualizer.pointLocality);
                    if (node != null)
                    {
                        if (e.Button == MouseButtons.Right) // если нажали правую кнопку мыши, то снять выделение с точки
                        {
                            if (this.currentFullModel.geometryModel.editedNode != null && this.currentFullModel.geometryModel.editedNode == node)
                            {
                                this.currentFullModel.geometryModel.editedNode = null;

                                // сбрасываем id, x и y
                                this.editNodesControl.number.Text = "";
                                this.editNodesControl.x.Text      = "";
                                this.editNodesControl.y.Text      = "";
                                ReDrawAll();
                            }
                        }

                        if (e.Button == MouseButtons.Left) // если нажали левую кнопку мыши, то выделить точку
                        {
                            this.currentFullModel.geometryModel.editedNode = node;

                            // отображаем id, x и y точки
                            this.editNodesControl.number.Text = this.currentFullModel.geometryModel.editedNode.Id.ToString();
                            this.editNodesControl.x.Text      = Mathematics.floor(this.currentFullModel.geometryModel.editedNode.X, Mathematics.accuracy_medium).ToString();
                            this.editNodesControl.y.Text      = Mathematics.floor(this.currentFullModel.geometryModel.editedNode.Y, Mathematics.accuracy_medium).ToString();
                            ReDrawAll();
                        }
                        break;
                    }
                }
            }

            //  удаляем точку
            if (this.deletePointsControl != null && this.deletePointsControl.IsHandleCreated)
            {
                MyPoint point = currentFullModel.geometryModel.Points.Find(p => Math.Abs(p.X - clickPoint.X) < visualizer.pointLocality &&
                                                                           Math.Abs(p.Y - clickPoint.Y) < visualizer.pointLocality);
                if (point != null)
                {
                    this.deletePointsControl.DeletePoint(point.Id);
                }
            }

            //  удаляем линию
            if (this.deleteLinesControl != null && this.deleteLinesControl.IsHandleCreated)
            {
                foreach (MyStraightLine sline in this.currentFullModel.geometryModel.StraightLines)
                {
                    if (pointNearLine(clickPoint, sline))
                    {
                        this.currentFullModel.geometryModel.StraightLines.Remove(sline);
                        ReDrawAll();
                        break;
                    }
                }

                foreach (MyArc arc in this.currentFullModel.geometryModel.Arcs)
                {
                    double radius = Mathematics.FindDist(arc.CenterPoint, arc.StartPoint);

                    if (pointFitsArc(clickPoint, arc, checkType.clickPrecision))
                    {
                        this.currentFullModel.geometryModel.Arcs.Remove(arc);
                        this.ReDrawAll();
                        break;
                    }
                }
            }

            //  закрепляем линию
            if (this.addBoundsControl != null && this.addBoundsControl.IsHandleCreated)
            {
                if (!this.addBoundsControl.xBound.Checked && !this.addBoundsControl.yBound.Checked)
                {
                    this.addBoundsControl.errorBoundType.Visible = true; return;
                }
                this.addBoundsControl.errorBoundType.Visible = false;

                foreach (MyStraightLine sline in this.currentFullModel.geometryModel.StraightLines)
                {
                    if (pointNearLine(clickPoint, sline))
                    {
                        this.addBoundsControl.BoundLine(sline);
                        ReDrawAll();
                        break;
                    }
                }

                foreach (MyArc arc in this.currentFullModel.geometryModel.Arcs)
                {
                    double radius = Mathematics.FindDist(arc.CenterPoint, arc.StartPoint);

                    if (pointFitsArc(clickPoint, arc, checkType.clickPrecision))
                    {
                        this.addBoundsControl.BoundLine(arc);
                        ReDrawAll();
                        break;
                    }
                }
            }
            // удаляем закрепление линии
            if (this.deleteBoundsControl != null && this.deleteBoundsControl.IsHandleCreated)
            {
                foreach (MyStraightLine sline in this.currentFullModel.geometryModel.StraightLines)
                {
                    if (pointNearLine(clickPoint, sline))
                    {
                        this.deleteBoundsControl.UnboundLine(sline);
                        ReDrawAll();
                        break;
                    }
                }

                foreach (MyArc arc in this.currentFullModel.geometryModel.Arcs)
                {
                    double radius = Mathematics.FindDist(arc.CenterPoint, arc.StartPoint);

                    if (pointFitsArc(clickPoint, arc, checkType.clickPrecision))
                    {
                        this.deleteBoundsControl.UnboundLine(arc);
                        ReDrawAll();
                        break;
                    }
                }
            }

            // добавляем плотность для Делоне
            if (delauneyTriangulateForm != null && this.delauneyTriangulateForm.IsHandleCreated)
            {
                delauneyTriangulateForm.AddDensity(Mathematics.floor(mouseXcord, 0.01), Mathematics.floor(mouseYcord, 0.01));
            }


            if (activeForm != null)
            {
                MyLine         line  = null;
                bool           add   = false;
                MyStraightLine sline = currentFullModel.geometryModel.StraightLines.Find(l => pointNearLine(clickPoint, l));
                if (sline != null)
                {
                    line = sline;
                    if (currentFullModel.geometryModel.highlightStraightLines.IndexOf(sline) < 0)
                    {
                        add = true;
                        currentFullModel.geometryModel.highlightStraightLines.Add(sline);
                    }
                    else
                    {
                        add = false;
                        currentFullModel.geometryModel.highlightStraightLines.Remove(sline);
                    }
                    ReDrawAll();
                }
                else
                {
                    MyArc arc = currentFullModel.geometryModel.Arcs.Find(a => pointFitsArc(clickPoint, a, checkType.clickPrecision));
                    if (arc != null)
                    {
                        line = arc;
                        if (currentFullModel.geometryModel.highlightArcs.IndexOf(arc) < 0)
                        {
                            add = true;
                            currentFullModel.geometryModel.highlightArcs.Add(arc);
                        }
                        else
                        {
                            add = false;
                            currentFullModel.geometryModel.highlightArcs.Remove(arc);
                        }
                        ReDrawAll();
                    }
                }
                if (line != null)
                {
                    TextBox targetTxt;
                    if (activeForm is StdOptimisation)
                    {
                        targetTxt = StdOptForm.notMoveLines;
                    }
                    else if (activeForm is RuppertForm)
                    {
                        targetTxt = ruppertForm.notMoveLines;
                    }
                    else if (activeForm is Regularization)
                    {
                        targetTxt = RegulizeForm.notMoveLines;
                    }
                    else
                    {
                        targetTxt = forcesForm.number;
                    }
                    if (add)
                    {
                        if (targetTxt.Text == "")
                        {
                            targetTxt.Text = line.Id.ToString();
                        }
                        else
                        {
                            targetTxt.Text += "," + line.Id.ToString();
                        }
                    }
                    else
                    {
                        string[] fixNumbers = targetTxt.Text.Split(',');
                        if (fixNumbers.Length == 1)
                        {
                            targetTxt.Text = "";
                        }
                        else
                        {
                            if (fixNumbers.Last() == line.Id.ToString())
                            {
                                targetTxt.Text = targetTxt.Text.Replace("," + line.Id.ToString(), "");
                            }
                            else
                            {
                                targetTxt.Text = targetTxt.Text.Replace(line.Id.ToString() + ",", "");
                            }
                        }
                    }
                    ReDrawAll();
                }
            }

            // создаем окружность
            if (addCirclesControl != null && addCirclesControl.IsHandleCreated)
            {
                if (this.creatingCircle) // если мы рисовали окружность, а потом кликнули мышкой, то значит надо завершить рисование
                {
                    this.addCirclesControl.CreateCircle(this.currentFullModel.geometryModel.NumOfCircles + 1, this.currentFullModel.geometryModel.tempCircle.CenterPoint, this.currentFullModel.geometryModel.tempCircle.Radius);
                    this.creatingCircle = false;
                    this.currentFullModel.geometryModel.centerOfCircle = null;

                    this.addCirclesControl.number.Text             = "";
                    this.addCirclesControl.centerPoint.Text        = "";
                    this.addCirclesControl.radius.Text             = "";
                    this.currentFullModel.geometryModel.tempCircle = null;
                    if (hoveredPoint != null)
                    {
                        MyCircle addedCircle = currentFullModel.geometryModel.Circles.Find(c => c.Id == currentFullModel.geometryModel.NumOfCircles);
                        splitCircleByPoint(addedCircle, hoveredPoint);
                    }
                }

                else
                {
                    MyPoint point = currentFullModel.geometryModel.Points.Find(p => Math.Abs(p.X - clickPoint.X) < visualizer.pointLocality &&
                                                                               Math.Abs(p.Y - clickPoint.Y) < visualizer.pointLocality);
                    if (point != null)
                    {
                        this.currentFullModel.geometryModel.centerOfCircle = point;
                        if (this.addCirclesControl != null)
                        {
                            this.addCirclesControl.number.Text      = (this.currentFullModel.geometryModel.NumOfCircles + 1).ToString();
                            this.addCirclesControl.centerPoint.Text = point.Id.ToString();
                        }
                        this.creatingCircle = true;
                    }
                }
                ReDrawAll();
            }

            // удаляем окружнсть
            if (this.deleteCirclesControl != null && this.deleteCirclesControl.IsHandleCreated)
            {
                foreach (MyCircle circle in this.currentFullModel.geometryModel.Circles)
                {
                    // уравнение окружности
                    if (Math.Abs(Mathematics.FindDist(clickPoint, circle.CenterPoint) - circle.Radius) < visualizer.pointLocality)
                    {
                        // удаляем окружность
                        this.deleteCirclesControl.DeleteCircle(circle.Id);
                        break;
                    }
                }
            }

            if (this.deleteAreasControl != null && this.deleteAreasControl.IsHandleCreated)
            {
                foreach (MyArea area in currentFullModel.geometryModel.Areas)
                {
                    if (Mathematics.ContainsPoint(area.Nodes.ConvertAll(n => (MyNode)n).ToArray(), clickPoint))
                    {
                        deleteAreasControl.number.Text = area.Id.ToString();
                        deleteAreasControl.OK();
                        ReDrawAll();
                        return;
                    }
                }
            }
            // создаем зону
            if (this.addAreasControl != null && this.addAreasControl.IsHandleCreated)
            {
                if (addAreasControl.autoSearch.Checked == true)
                {
                    List <MyStraightLine> checkLines = new List <MyStraightLine>();
                    foreach (MyPoint point in currentFullModel.geometryModel.Points)
                    {
                        checkLines.Add(new MyStraightLine(0, clickPoint, point));
                    }

                    MyArc          suspiciousArc = null;
                    List <MyPoint> zonePoints    = new List <MyPoint>();
                    foreach (MyStraightLine line in checkLines)
                    {
                        List <MyArc> sarcs;
                        if (currentFullModel.geometryModel.StraightLines.Find(l => LinesCrossing(line, l)) == null)
                        {
                            sarcs = currentFullModel.geometryModel.Arcs.FindAll(a => LineCrossingArc(line, a));
                            if (sarcs.Count == 0)
                            {
                                zonePoints.Add(line.EndPoint);
                            }
                            else
                            {
                                suspiciousArc = sarcs[0];
                            }
                        }
                    }
                    if (zonePoints.Count != 4)
                    {
                        if (suspiciousArc != null)
                        {
                            if (zonePoints.IndexOf(suspiciousArc.EndPoint) == -1)
                            {
                                zonePoints.Add(suspiciousArc.EndPoint);
                            }
                            if (zonePoints.IndexOf(suspiciousArc.StartPoint) == -1)
                            {
                                zonePoints.Add(suspiciousArc.StartPoint);
                            }
                        }
                    }
                    List <MyStraightLine> lines = currentFullModel.geometryModel.StraightLines.FindAll(l => zonePoints.IndexOf(l.StartPoint) != -1 && zonePoints.IndexOf(l.EndPoint) != -1);
                    List <MyArc>          arcs  = currentFullModel.geometryModel.Arcs.FindAll(a => zonePoints.IndexOf(a.StartPoint) != -1 && zonePoints.IndexOf(a.EndPoint) != -1);
                    List <string>         ids   = new List <string>();
                    foreach (MyStraightLine line in lines)
                    {
                        ids.Add(line.Id.ToString());
                    }

                    foreach (MyArc arc in arcs)
                    {
                        ids.Add(arc.Id.ToString());
                    }

                    if (ids.Count < 4)
                    {
                        MessageBox.Show("Ошибка поиска зоны!");
                        return;
                    }
                    addAreasControl.line1.Text = ids[0];
                    addAreasControl.line2.Text = ids[1];
                    addAreasControl.line3.Text = ids[2];
                    addAreasControl.line4.Text = ids[3];
                    if (addAreasControl.OK())
                    {
                        ReDrawAll();
                    }
                }
                else
                {
                    foreach (MyStraightLine sline in this.currentFullModel.geometryModel.StraightLines)
                    {
                        // уравнение прямой, проходящей через две точки
                        if (pointNearLine(clickPoint, sline))
                        {
                            if (this.currentFullModel.geometryModel.numOfSelectedLines == 0)
                            {
                                this.addAreasControl.line1.Text = sline.Id.ToString(); currentFullModel.geometryModel.numOfSelectedLines++; this.currentFullModel.geometryModel.highlightStraightLines.Add(sline); ReDrawAll(); break;
                            }
                            if (this.currentFullModel.geometryModel.numOfSelectedLines == 1)
                            {
                                this.addAreasControl.line2.Text = sline.Id.ToString(); currentFullModel.geometryModel.numOfSelectedLines++; this.currentFullModel.geometryModel.highlightStraightLines.Add(sline); ReDrawAll(); break;
                            }
                            if (this.currentFullModel.geometryModel.numOfSelectedLines == 2)
                            {
                                this.addAreasControl.line3.Text = sline.Id.ToString(); currentFullModel.geometryModel.numOfSelectedLines++; this.currentFullModel.geometryModel.highlightStraightLines.Add(sline); ReDrawAll(); break;
                            }
                            if (this.currentFullModel.geometryModel.numOfSelectedLines == 3)
                            {
                                this.addAreasControl.line4.Text = sline.Id.ToString(); currentFullModel.geometryModel.numOfSelectedLines++; this.currentFullModel.geometryModel.highlightStraightLines.Add(sline); ReDrawAll();
                            }

                            if (this.currentFullModel.geometryModel.numOfSelectedLines == 4)
                            {
                                this.addAreasControl.OK(); // вызываем функцию, как будто была нажата кнопка ОК. эта функция обрабатывает значения линий в текстовых полях контрола.
                                ReDrawAll();
                            }
                            break;
                        }
                    }

                    foreach (MyArc arc in this.currentFullModel.geometryModel.Arcs)
                    {
                        double radius = Mathematics.FindDist(arc.CenterPoint, arc.StartPoint);

                        if (pointFitsArc(clickPoint, arc, checkType.clickPrecision))
                        {
                            if (this.currentFullModel.geometryModel.numOfSelectedLines == 0)
                            {
                                this.addAreasControl.line1.Text = arc.Id.ToString(); currentFullModel.geometryModel.numOfSelectedLines++; this.currentFullModel.geometryModel.highlightArcs.Add(arc); ReDrawAll(); break;
                            }
                            if (this.currentFullModel.geometryModel.numOfSelectedLines == 1)
                            {
                                this.addAreasControl.line2.Text = arc.Id.ToString(); currentFullModel.geometryModel.numOfSelectedLines++; this.currentFullModel.geometryModel.highlightArcs.Add(arc); ReDrawAll(); break;
                            }
                            if (this.currentFullModel.geometryModel.numOfSelectedLines == 2)
                            {
                                this.addAreasControl.line3.Text = arc.Id.ToString(); currentFullModel.geometryModel.numOfSelectedLines++; this.currentFullModel.geometryModel.highlightArcs.Add(arc); ReDrawAll(); break;
                            }
                            if (this.currentFullModel.geometryModel.numOfSelectedLines == 3)
                            {
                                this.addAreasControl.line4.Text = arc.Id.ToString(); currentFullModel.geometryModel.numOfSelectedLines++; this.currentFullModel.geometryModel.highlightArcs.Add(arc); ReDrawAll();
                            }

                            if (this.currentFullModel.geometryModel.numOfSelectedLines == 4)
                            {
                                this.addAreasControl.OK(); // вызываем функцию, как будто была нажата кнопка ОК. эта функция обрабатывает значения линий в текстовых полях контрола.
                                ReDrawAll();
                            }
                            break;
                        }
                    }
                }
            }
        }