Exemple #1
0
        public static Point GetCoord(TransformationMatrix tM, CoordinatesMatrix cM)
        {
            var res = new Point
            {
                X = tM.TransMatrix[0, 0] * cM.Vector[0] + tM.TransMatrix[0, 1] * cM.Vector[1] +
                    tM.TransMatrix[0, 2] * cM.Vector[2],
                Y = tM.TransMatrix[1, 0] * cM.Vector[0] + tM.TransMatrix[1, 1] * cM.Vector[1] +
                    tM.TransMatrix[1, 2] * cM.Vector[2]
            };

            tM.X = res.X;
            tM.Y = res.Y;
            return(res);
        }
Exemple #2
0
        public void OnObjectChanged(Object obj)
        {
            var cJ = _listManager.ChainList[0].Visual as VisualJoint;

            _centerPoint = Calculations.MinusPoint(cJ.Coordinate, _centerPoint);
            Calculations.ChangeMas(_centerPoint);
            _centerPoint = cJ.Coordinate;
            if (obj.Id != _listManager.ChainList.Count - 1)
            {
                switch (obj)
                {
                case Joint modifiedJoint:
                {
                    var currentAngle = modifiedJoint.CurrentAngle;
                    for (var i = modifiedJoint.Id + 1; i < _listManager.ChainList.Count; i += 2)
                    {
                        if (!(_listManager.ChainList[i] is Segment currentSegment))
                        {
                            continue;
                        }

                        if (!(_listManager.ChainList[i - 1] is Joint prevJoint))
                        {
                            throw new ArgumentNullException(nameof(prevJoint));
                        }

                        var tM            = new TransformationMatrix(currentAngle, _listManager.ChainList, i);
                        var cM            = new CoordinatesMatrix(currentSegment, prevJoint);
                        var visualSegment = (VisualSegment)_listManager.ChainList[i].Visual;

                        var coordinates = Calculations.GetCoord(tM, cM);
                        if (i + 1 < _listManager.ChainList.Count)
                        {
                            if (_listManager.ChainList[i + 1].Visual is VisualJoint vj)
                            {
                                vj.Coordinate = coordinates;
                            }
                        }

                        visualSegment.End        = coordinates;
                        Calculations.CoordMas[i] = coordinates;
                        if (i + 1 < Calculations.CoordMas.Count)
                        {
                            Calculations.CoordMas[i + 1] = coordinates;
                        }
                    }

                    break;
                }

                case Segment modifiedSegment:
                {
                    Calculations.LengthMas[obj.Id / 2] = modifiedSegment.Length * Calculations.CoefficientOfScale;
                    if (!(_listManager.ChainList[obj.Id - 1] is Joint prevJoint))
                    {
                        throw new ArgumentNullException(nameof(prevJoint));
                    }

                    var visualSegment = (VisualSegment)modifiedSegment.Visual;
                    var tM            = new TransformationMatrix(prevJoint.CurrentAngle, _listManager.ChainList, obj.Id);
                    var cM            = new CoordinatesMatrix(modifiedSegment, prevJoint);
                    var coordinates   = Calculations.GetCoord(tM, cM);
                    Calculations.CoordMas[obj.Id]     = Calculations.GetCoord(tM, cM);
                    Calculations.CoordMas[obj.Id + 1] = Calculations.GetCoord(tM, cM);

                    var dX = coordinates.X - visualSegment.End.X;
                    var dY = coordinates.Y - visualSegment.End.Y;
                    visualSegment.End = coordinates;
                    for (var i = obj.Id + 2; i < _listManager.ChainList.Count; i += 2)
                    {
                        if (!(_listManager.ChainList[i].Visual is VisualSegment currentVisualSegment))
                        {
                            continue;
                        }

                        var x = currentVisualSegment.End.X + dX;
                        var y = currentVisualSegment.End.Y + dY;
                        var newCoordinates = new Point(x, y);
                        currentVisualSegment.End = newCoordinates;
                        Calculations.CoordMas[i] = newCoordinates;
                        if (i + 1 < Calculations.CoordMas.Count)
                        {
                            Calculations.CoordMas[i + 1] = newCoordinates;
                        }
                    }

                    break;
                }
                }
            }
            else
            {
                if (obj.Id == 0)
                {
                    if (!Calculations.CoordMas.Any())
                    {
                        var j = (VisualJoint)_listManager.ChainList[0].Visual;
                        Calculations.CoordMas.Add(j.Coordinate);
                    }
                }
                else
                {
                    switch (obj)
                    {
                    case Joint _:
                    {
                        var newSegmentCoordinatesEnd = Calculations.CoordMas[obj.Id - 1];
                        if (obj.Id < Calculations.CoordMas.Count)
                        {
                            Calculations.CoordMas[obj.Id] = newSegmentCoordinatesEnd;
                        }
                        else
                        {
                            Calculations.CoordMas.Add(newSegmentCoordinatesEnd);
                        }
                        break;
                    }

                    case Segment lastSegment:
                    {
                        if (!(_listManager.ChainList[obj.Id - 1] is Joint prevJoint))
                        {
                            throw new ArgumentNullException(nameof(prevJoint));
                        }

                        var lastVisualSegment = (VisualSegment)lastSegment.Visual;

                        var tM = new TransformationMatrix(prevJoint.CurrentAngle, _listManager.ChainList, obj.Id);
                        if (obj.Id / 2 == Calculations.LengthMas.Count)
                        {
                            Calculations.LengthMas.Add(Calculations.CoefficientOfScale * lastSegment.Length);
                        }
                        var cM          = new CoordinatesMatrix(lastSegment, prevJoint);
                        var coordinates = Calculations.GetCoord(tM, cM);
                        lastVisualSegment.End = coordinates;
                        if (obj.Id < Calculations.CoordMas.Count)
                        {
                            Calculations.CoordMas[obj.Id] = coordinates;
                        }
                        else
                        {
                            Calculations.CoordMas.Add(coordinates);
                        }
                        break;
                    }
                    }
                }
            }
            if (_listManager.ChainList.Count > 1)
            {
                RescaleIfNeeded();
            }
            ConnectObjects(obj.Id);
            SetInterseced();
        }