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