private static double CalculateAngleForAxisLieingInCanvas( Position3D bodyTouchPosition, double startX, double startY, Axis3D endMoveRay, Axis3D cylinderAxis, double canvasWidth, double canvasHeight, Camera camera ) { var angle = 0.0; var cameraDirection = camera.Frame.Ey; var direction = (cameraDirection & cylinderAxis.Direction).Normalize() * 10000.0; var offset = ViewProjection.ProjectCanvasToSceneSystem(startX, startY, canvasWidth, canvasHeight, camera.NearPlane, camera.Frame); var p1 = offset - direction; var p2 = offset + direction; var projectedAxis = new Axis3D(p1, p2 - p1); var(success, plump) = projectedAxis.CalculatePerpendicularPoint(endMoveRay); if (success) { // Ermitteln des Vorzeichens für Drehung var sign = (plump - p1).Length < (plump - p2).Length ? -1.0 : 1.0; // Ermitteln der Länge der Mausbewegung in Richtung senkrecht zur Rotationsachse var(endX, endY) = ViewProjection.ProjectSceneSystemToCanvas(plump, canvasWidth, canvasHeight, camera.NearPlane, camera.Frame); double delta = Vector2DMath.Length(startX, startY, endX, endY); // Projektion Berührungspunkt auf Rotationsachse. // Ermittel Scheitelpunkte der Rotation auf Achse senkrecht zur Kamera und Rotationsachse. // Projektion der Scheitelpunkte auf Canvas. // Abstand Scheitelpunkte auf Achse ist die Mausbewegung für 180°. // Winkel ist Verhältnis Länge Mausbewegung zur Länge für 180°. var plumpPoint = cylinderAxis.CalculatePerpendicularPoint(bodyTouchPosition); var distance = (bodyTouchPosition - plumpPoint).Length; direction = direction.Normalize() * distance; var startPosition = cylinderAxis.Offset - direction; var endPosition = cylinderAxis.Offset + direction; (startX, startY) = ViewProjection.ProjectSceneSystemToCanvas(startPosition, canvasWidth, canvasHeight, camera.NearPlane, camera.Frame); (endX, endY) = ViewProjection.ProjectSceneSystemToCanvas(endPosition, canvasWidth, canvasHeight, camera.NearPlane, camera.Frame); var lengthOfHalfRotation = Vector2DMath.Length(startX, startY, endX, endY); var angleInDegree = 180.0 * delta / lengthOfHalfRotation; angle = sign * angleInDegree.DegToRad(); } return(angle); }
private static double CalculateAngle( double startX, double startY, double endX, double endY, double canvasWidth, double canvasHeight) { var min = Math.Min(canvasWidth, canvasHeight); var delta = Vector2DMath.Length(startX, startY, endX, endY); var angle = (360.0 * delta / min).DegToRad(); return(angle); }
public void Test1() { Assert.Equal(10, Vector2DMath.Length(0, 0, 10, 0)); }
public void Test3() { Assert.Equal(2, Vector2DMath.Length(Math.Sqrt(2), Math.Sqrt(2), 2 * Math.Sqrt(2), 2 * Math.Sqrt(2)), 4); }