public void Rotate_90() { var testInput = new Vector2(12.345f, -67.89f); var expected = new Vector2(67.89f, 12.345f); var result = S2VXUtils.Rotate(testInput, 90); Assert.AreEqual(expected.X, result.X, FloatingPointTolerance); Assert.AreEqual(expected.Y, result.Y, FloatingPointTolerance); }
private static Vector2 CalculateCameraOffset(Vector2 position, float rotation, float scale) { var closestCoordinate = new Vector2( (float)Math.Round(position.X), (float)Math.Round(position.Y) ); var offset = S2VXUtils.Rotate(closestCoordinate - position, rotation) * scale; return(offset); }
protected override void Update() { if (IsHidden()) { if (InternalChildren.Count != 0) { ClearInternal(); } return; } var camera = Story.Camera; var position = camera.Position; var rotation = camera.Rotation; var scale = camera.Scale.X; var cameraOffset = CalculateCameraOffset(position, rotation, scale); var unitX = S2VXUtils.Rotate(new Vector2(1, 0), rotation); var unitY = S2VXUtils.Rotate(new Vector2(0, 1), rotation); var startDistance = scale / 2; var endDistance = LineLength / 2; var distanceIncrement = scale; var lineIndex = 0; for (var distance = startDistance; distance <= endDistance; distance += distanceIncrement) { var up = unitY * distance + cameraOffset; var down = -unitY * distance + cameraOffset; var right = unitX * distance + cameraOffset; var left = -unitX * distance + cameraOffset; UpdateLineProperties(lineIndex++, up, LineLength, Thickness, rotation); UpdateLineProperties(lineIndex++, down, LineLength, Thickness, rotation); UpdateLineProperties(lineIndex++, right, Thickness, LineLength, rotation); UpdateLineProperties(lineIndex++, left, Thickness, LineLength, rotation); } CheckAndRemoveLines(lineIndex); }
private bool IsMouseOnNote(Vector2 mousePos, S2VXNote note) { mousePos = ToSpaceOfOtherDrawable(ToLocalSpace(mousePos), Editor); // DrawPosition is centered at (0,0). I convert it so (0,0) starts top left var convertedCenterPoint = new Vector2(note.DrawPosition.X + Editor.DrawWidth / 2, note.DrawPosition.Y + Editor.DrawHeight / 2); var topLeft = new Vector2(convertedCenterPoint.X - note.DrawWidth / 2, convertedCenterPoint.Y - note.DrawHeight / 2); var topRight = new Vector2(convertedCenterPoint.X + note.DrawWidth / 2, convertedCenterPoint.Y - note.DrawHeight / 2); var bottomLeft = new Vector2(convertedCenterPoint.X - note.DrawWidth / 2, convertedCenterPoint.Y + note.DrawHeight / 2); // https://gamedev.stackexchange.com/a/110233 var pointA = S2VXUtils.Rotate(new Vector2(topLeft.X - convertedCenterPoint.X, topLeft.Y - convertedCenterPoint.Y), note.Rotation); var pointB = S2VXUtils.Rotate(new Vector2(topRight.X - convertedCenterPoint.X, topRight.Y - convertedCenterPoint.Y), note.Rotation); var pointC = S2VXUtils.Rotate(new Vector2(bottomLeft.X - convertedCenterPoint.X, bottomLeft.Y - convertedCenterPoint.Y), note.Rotation); // Shift origin back after rotating pointA = new Vector2(pointA.X + convertedCenterPoint.X, pointA.Y + convertedCenterPoint.Y); pointB = new Vector2(pointB.X + convertedCenterPoint.X, pointB.Y + convertedCenterPoint.Y); pointC = new Vector2(pointC.X + convertedCenterPoint.X, pointC.Y + convertedCenterPoint.Y); var v0 = pointC - pointA; var v1 = pointB - pointA; var v2 = mousePos - pointA; var dot00 = Vector2.Dot(v0, v0); var dot01 = Vector2.Dot(v0, v1); var dot02 = Vector2.Dot(v0, v2); var dot11 = Vector2.Dot(v1, v1); var dot12 = Vector2.Dot(v1, v2); var invDenom = 1 / (dot00 * dot11 - dot01 * dot01); var u = (dot11 * dot02 - dot01 * dot12) * invDenom; var v = (dot00 * dot12 - dot01 * dot02) * invDenom; return(u >= 0 && v >= 0 && u <= 1 && v <= 1); }