/// <summary> /// Move focused (this object) to others. /// </summary> /// <param name="move">Which direction</param> /// <param name="status">Status of eye or kinect..etc..</param> /// <returns>New focused object</returns> public BuildingObjectLib3DS Move(DrawingEnumTypes.Movement move, DrawingStatus status) { switch (move) { case DrawingEnumTypes.Movement.MenuIn: if (this.Type == BuildingObjectType.Outside) { if (Father.Childs == null || Father.Childs.Count == 0) return this; foreach (BuildingObjectLib3DS value in Father.Childs.Values) { if (value.GetBuildingType() == BuildingObjectType.Outside) continue; return value; } } else if (this.Type == BuildingObjectType.Building) { if(this.Childs.Contains("0")) return (this.Childs["0"] as BuildingObjectLib3DS); return this; } else if (this.Type == BuildingObjectType.Object) { return this; } else { foreach (BuildingObjectLib3DS value in this.Childs.Values) { if (value != null) return value; } return this; } break; case DrawingEnumTypes.Movement.MenuOut: if (this.Type == BuildingObjectType.Floor) { return Father.Childs["0"] as BuildingObjectLib3DS; } else if (this.Type == BuildingObjectType.Building) { return this; } else { return this.Father; } case DrawingEnumTypes.Movement.MoveDown: if (this.Type == BuildingObjectType.Floor) { if (Father.Childs.Contains((Id - 1).ToString())) { return Father.Childs[(Id - 1).ToString()] as BuildingObjectLib3DS; } } return this; case DrawingEnumTypes.Movement.MoveUp: if (this.Type == BuildingObjectType.Floor) { if (Father.Childs.Contains((Id + 1).ToString())) { return Father.Childs[(Id + 1).ToString()] as BuildingObjectLib3DS; } } return this; case DrawingEnumTypes.Movement.MoveIn: case DrawingEnumTypes.Movement.MoveOut: case DrawingEnumTypes.Movement.MoveRight: case DrawingEnumTypes.Movement.MoveLeft: if (this.Type == BuildingObjectType.Room || this.Type == BuildingObjectType.Object) { return GetObjectByParallelMovement(move, status); } return this; default: break; } return this; }
/// <summary> /// Parallel move from focused object to others. /// </summary> /// <param name="move">Which direction</param> /// <param name="status">Status of eye or kinect..etc..</param> /// <returns>New focused object</returns> private BuildingObjectLib3DS GetObjectByParallelMovement(DrawingEnumTypes.Movement move, DrawingStatus status) { XmlTextWriter writer = null; writer = new XmlTextWriter (Console.Out); if (this.Father.Childs.Count <= 1) return this; int count = Father.Childs.Count - 1; BuildingObjectLib3DS rnt = null; double shita = Math.Atan((status.eye.x - this.Coordinate.x) / (status.eye.z + this.Coordinate.y)); Matrix<double> matrix = new Matrix<double>(1, 2); matrix.SetValue(0); matrix.Data[0, 0] = this.Coordinate.x; matrix.Data[0, 1] = -this.Coordinate.y; Matrix<double> _matrix = new Matrix<double>(2, 2); _matrix.SetValue(0); _matrix.Data[0, 0] = Math.Cos(shita); _matrix.Data[0, 1] = -Math.Sin(shita); _matrix.Data[1, 0] = Math.Sin(shita); _matrix.Data[1, 1] = Math.Cos(shita); Matrix<double> otherChilds = new Matrix<double>(1, 2); otherChilds.SetValue(0); double MinIn = 99999.0f; double MinOut = 99999.0f; double MinLeft = 99999.0f; double MinRight = 99999.0f; foreach(BuildingObjectLib3DS ThisObj in Father.Childs.Values) { if(ThisObj.Equals(this)) continue; otherChilds.Data[0, 0] = ThisObj.Coordinate.x; otherChilds.Data[0, 1] = -ThisObj.Coordinate.y; otherChilds = (otherChilds - matrix) * _matrix; switch (move) { case DrawingEnumTypes.Movement.MoveIn: if(otherChilds.Data[0, 1] < 0 && Math.Abs(otherChilds.Data[0, 1]) < MinIn) { rnt = ThisObj; MinIn = Math.Abs(otherChilds.Data[0, 1]); } break; case DrawingEnumTypes.Movement.MoveOut: if (otherChilds.Data[0, 1] > 0 && Math.Abs(otherChilds.Data[0, 1]) < MinOut) { rnt = ThisObj; MinOut = Math.Abs(otherChilds.Data[0, 1]); } break; case DrawingEnumTypes.Movement.MoveLeft: if (otherChilds.Data[0, 0] < 0 && Math.Abs(otherChilds.Data[0, 0]) < MinLeft) { rnt = ThisObj; MinLeft = Math.Abs(otherChilds.Data[0, 0]); } break; case DrawingEnumTypes.Movement.MoveRight: if (otherChilds.Data[0, 0] > 0 && Math.Abs(otherChilds.Data[0, 0]) < MinRight) { rnt = ThisObj; MinRight = Math.Abs(otherChilds.Data[0, 0]); } break; default: return this; } } // If we find the object if (rnt != null) { return rnt; } // Do not find.... return this; }
public void SendSingle(DrawingEnumTypes.Movement cmd) { projectorWin.buildingModelCursor = projectorWin.buildingModelCursor.Move(cmd, projectorWin.status); }