Freigeben über


Dieser Artikel wurde maschinell übersetzt.

Touch and Go

Virtuelle Welten mit Windows Phone entdecken

Charles Petzold

Charles PetzoldBis zur Zeit von Kopernikus — und für viele Jahre nach — Menschen glaubten das Universum entstand aus einer Reihe von konzentrischen himmlischen Sphären der Erde.Obwohl dieses Modell des Universums aufgegeben wurde, ist es immer noch praktisch, das Konzept einer Himmelskugel für zur Ortung von Objekten im dreidimensionalen Raum im Verhältnis zu uns selbst als Zuschauer zu beschäftigen.

Eine Himmelskugel ist besonders nützlich für Programme, die erweiterte Realität oder lassen Sie ein Smartphone nutzen für die Anzeige von einer Welt der virtuellen Realität.Mit Programmen halten Sie das Telefon, als ob du ein Foto nimmst oder Video über das Kameraobjektiv, aber was Sie auf dem Bildschirm sehen möglicherweise nicht mit der realen Welt zu tun.

Ein solches Programm muss die Orientierung im dreidimensionalen Raum zu bestimmen, so dass durch Ziehen des Telefons in Bögen der Benutzer durch diese virtuelle Welt schwenken kann.Mit dem Motion-Sensor, die, den ich in der letzten Ausgabe dieser Kolumne beschrieben, kann Windows Phone die notwendige Ausrichtung Informationen bereitstellen.

Wie übersetzen wir aus den Angaben der Bewegungsmelder an der Himmelskugel?Es ist alles über das Koordinatensystem.

Wir sind alle vertraut mit geographische Koordinaten, die uns erlauben beschreiben einen Standort auf der Oberfläche unseres Planeten.Jeder Punkt auf der Oberfläche der Erde kann durch zwei Zahlen gekennzeichnet werden: breiten- und Längengrad, beide Winkel mit einem Eckpunkt in der Erde Mitte sind.Latitude ist ein Winkel in Bezug auf dem Äquator: Es ist positiv für Orte nördlich des Äquators und negativ für Standorte South.Die Breite des Nordpols ist 90 ° und der Breitengrad des Südpols-90 °.Länge umfasst die Winkel zwischen den großen Kreise, die durch die beiden Pole gemessen vom Nullmeridian, übergeben, die Länge ist, die durch Greenwich in England verläuft.

Wir leben nicht nur auf der Oberfläche einer Kugel, aber auch in der Mitte des einen konzeptionellen Himmelskugel.Mehrere Koordinatensysteme kann verwendet werden, um Standorte dieser Himmelskugel zu bezeichnen, aber, den werde ich mich konzentrieren auf wird das horizontale Koordinatensystem genannt, weil es am Horizont basiert.

Horizontalen Koordinaten

Mit Ihrem ausgestreckten Arm, zeigen Sie auf alle Objekte, die Sie um dich herum zu sehen.Dieses Objekt hat eine Lage an der Himmelskugel.Was ist die Lage?Ihr geraden Arm oben oder unten verschieben, so wird es horizontale — d. h. parallel zur Oberfläche der Erde.Der Winkel, die, den Ihren Arm während dieser Bewegung durch Schaukeln, wird die Höhe genannt.

Positive Werte Höhenmeter sind über dem Horizont; negative Werte sind unterhalb des Horizonts.Ein Objekt befindet sich gerade nach oben von Ihnen hat eine Höhe von 90°, auch genannt den Zenit, und ein Objekt direkt nach unten hat eine Höhe von-90 °, genannt der Tiefpunkt.

Jetzt Schaukel Ihre horizontalen ausgestreckten Arm, so dass es Norden verweist.Der Winkel, die, den Ihren Arm während dieser Bewegung schwingt, wird das Azimut genannt.Die Höhe und Azimut bilden zusammen eine horizontale Koordinate.

Beachten Sie, dass die horizontale Koordinate Ihnen keine Informationen gibt darüber, wie weit etwas ist.Während einer Sonnenfinsternis haben Sonne und Mond die gleiche horizontale Koordinate.Mit jeder Art von celestial Koordinatensystem wird alles angenommen auf der Innenfläche der Himmelskugel.

Das Azimut muss relativ zu einem bestimmten Punkt auf dem Kompass sein.In den meisten Fällen wird das Azimut bei 0° für Norden, mit zunehmendem Winkel nach Osten verschieben festgelegt.Allerdings neigen Astronomen im Süden mit zunehmendem Winkel nach Westen verschieben 0 ° festzusetzen; zumindest das ist, wie Jean Meeus es in seinem klassischen Buch, "Astronomischen Algorithmen" (Willmann-Bell, 1998) fasst.

Horizontale Koordinaten sind analog zu geographischen Koordinaten, außer die Perspektive unterschiedlich ist.Anstatt auf der Oberfläche einer Kugel, sind Sie in der Mitte schauen.Das Azimut ist vergleichbar mit der Länge und die Höhe ist vergleichbar mit dem Breitengrad.Wie Kreise der Länge sind Kreise der Azimut immer große Kreise durch die Polen.Wie Kreisen Breitengrad sind Kreise Höhe immer parallel zueinander.Horizont spielt die gleiche Rolle in horizontalen Koordinaten als Äquator in geographischen Koordinaten.

Jetzt Ihre Windows Phone Holen Sie ab und halten Sie es, so dass Sie auf dem Bildschirm, während die Kamera-Objektiv-Punkte Weg von Ihnen suchen.Die Richtung, die das Objektiv das Kamera zeigt hat eine bestimmte Höhe und Azimut.Die horizontale Koordinate im Prinzip eine Lage auf der Innenseite der Himmelskugel ist es zwar auch eine Richtung aus der Sicht der Kameralinse — mathematisch, einem dreidimensionalen Vektor.

Wie ich in früheren Artikeln besprochen haben, hat das Telefon eine implizite Koordinatensystem, wo erstreckt sich die positive Z-Achse heraus vom Bildschirm.Das heißt, die Kamera-Linse auf der anderen Seite weist in die Richtung des 3D Vector (0, 0,-1).Wie ich in der letzten Ausgabe dieser Spalte gezeigt (msdn.microsoft.com/magazine/jj190811), der Bewegungsmelder in Windows Phone können Sie eine 3D Drehmatrix zu erhalten, die beschreibt, wie die Erde relativ das Handy gedreht wird.Um eine Matrix zu erhalten, die beschreibt, wie das Telefon relativ zur Erde gedreht wird, muss die Matrix aus dem Weg-und/oder Geschwindigkeitsgeber gewonnen invertiert werden:

matrix = Matrix.Invert(matrix);

Verwenden diese invertierte Matrix drehen die (0, 0,-1) Vektor:

Vector3 vector = Vector3.Transform(new Vector3(0, 0, -1), matrix);

Jetzt haben Sie ein 3D Vector, der die Richtung beschreibt, die das Objektiv das Kamera zeigt. Dieser Vektor muss in Höhe und Azimut Winkel konvertiert werden.

Wenn das Telefon aufrecht gehalten wird – d. h. mit der transformierten Vektor horizontal an die Oberfläche der Erde — die Z-Komponente ist 0, und das Problem reduziert sich auf die bekannten Konvertierung von zweidimensionalen kartesischen Koordinaten in Polarkoordinaten. In c# ist es einfach:

double azimuth = Math.Atan2(vector.X, vector.Y);

Das ist ein Winkel im Bogenmaß. Mit 180 multiplizieren und Dividieren durch π, in Grad umrechnen.

Diese Formel bedeutet, dass die Norden ein Azimut von 0 (null) und Erhöhung der Werte in ein nach Osten Richtung hat.

Wenn Sie lieber Süden NULL sein mit steigenden Werten in einem nach Westen Richtung, Schiebe das Ergebnis um 180 ° durch Ändern der Zeichens für die X- und Y-Komponenten.

Die Formel für die Azimut ist unabhängig von der Z-Komponente des Vektors Transformation tatsächlich gültig.

Die Z-Komponente ist der Sinus von der Höhenlage. Da die Höhe nur zwischen positiven und negativen 90 ° reicht, kann es mit der umgekehrten Sinus-Funktion berechnet werden:

double altitude = Math.Asin(vector.Z);

Wieder um 180° multiplizieren und Dividieren durch π Bogenmaß in Grad zu konvertieren.

Allerdings sind wir etwas fehlt noch die Sie erkennen könnte, wenn Sie merken, dass wir eine dreidimensionale Rotationsmatrix in eine Koordinate übersetzt habe, die nur zwei Dimensionen hat, weil es auf der Innenfläche der Himmelskugel beschränkt ist.

Was passiert, wenn Sie das Telefon in eine bestimmte Richtung, die durch einen 3D Vektor beschriebene Ziel und dann drehen Sie das Telefon um den Vektor wie eine Achse? Vektors ändert sich nicht, auch nicht die Höhe und Azimut-Werte, sondern die virtuelle Realität Szene auf dem Bildschirm des Telefons sollte relativ das Telefon drehen.

Diese zusätzliche Bewegung wird auch als Neigung bezeichnet. Es ist auch ein Winkel, aber die Berechnung ist ein wenig schwieriger als Höhe und Azimuth.

Sie sehen, daß die Berechnung in einer HorizontalCoordinate-Struktur, die ich erstellt, die eine Bewegung in die Höhe, Azimut und Neigung, alles in Grad Lesen konvertiert. Diese Struktur ist im AltitudeAndAzimuth-Projekt enthalten, unter den herunterladbaren Code für diesen Artikel ist. Dieses Programm einfach Weg-und/oder Geschwindigkeitsgebers verwendet, um die Ausrichtung des Telefons zu erhalten, und anschließend die Informationen in horizontalen Koordinaten konvertiert. Dieses Projekt erfordert Verweise auf die Microsoft.Devices.Sensors-Assembly (für Motion-Klasse) und die Microsoft.Xna.Framework-Assembly (für die 3D Vektor und Matrix). Der Bildschirm zeigt den transformierten Vektor und die Werte aus der HorizontalCoordinates-Struktur. Abbildung 1 zeigt das Telefon mit dem Objektiv etwa aufrecht gehalten erinnert etwa Ost und ein wenig im Uhrzeigersinn gekippt.

The AltitudeAndAzimuth Display
Abbildung 1 die AltitudeAndAzimuth-Anzeige

Immer das große Bild

Angenommen, Sie möchten ein Bild anzeigen, die viel größer als der Bildschirm Ihres Computers ist — oder, in diesem Fall Ihr Telefon.

Traditionell sind Scrollbars beteiligt. Auf einen Touchscreen der Scrollbars beseitigt werden können und der Benutzer kann einen ähnlichen Scrollen Vorgang mit Fingern ausführen.

Aber ein anderer Ansatz ist konzeptionell Bilder-das Innere der Himmelskugel mit diesem großen Bild und dann anzeigen lassen, indem das Handy selbst bewegen. (Denken Sie daran, dass wenn Sie das Telefon, um das Bild anzuzeigen, bewegen, Sie nicht das Telefon nach links und rechts oder oben und unten in einer Ebene verschieben möchten. Die Bewegung hat entlang der Bögen zu sein, so dass die Höhe und Azimut verändern.)

Wie groß kann ein solches Bild sein, damit es auf natürliche Weise über den Bildschirm Pfannen, während das Telefon bewegt?

Ein durchschnittlicher Windows Phone-Bildschirm ist wahrscheinlich ungefähr 2 cm breit und 3,33 cm groß. Wenn Sie das Telefon 6 Zoll von Ihrem Gesicht halten, zeigen einige einfache Trigonometrie enthüllt, die das Telefon belegt ein Feld von 19° Grad breit und hoch 31 °. Halten Sie das Telefon im Querformat, sind diese beiden Gesichtsfelder Scheiben aus der gesamten Azimut 360 ° Grad und Höhe von 180°. Sehr grob, statt dann die Handy-Displays, 6 Zentimeter von Ihrem Gesicht im Landscape-Modus nimmt etwa 10 Prozent der das gesamte Blickfeld horizontal und vertikal.

Oder denken Sie an es auf diese Weise: Wenn Sie Ihr Telefon im Portrait-Modus verwenden, um über die Oberfläche einer Bitmap schwenken möchten, kann diese Bitmap irgendwo in der Region von 8000 Pixel breit und 4800 Pixel hoch sein.

Das ist die Idee des Projektes BigPicture, die Links zum downloaden (eine Mischung von Gemälden, Fotografien, Dokumente und Zeichnungen, überwiegend aus Wikipedia), acht Bilder enthält, von denen der, die größte 5649 Pixel breit und 4000 Pixel hoch ist. Sie können problemlos andere Bilder durch eine XML-Datei bearbeiten, aber aufgrund meiner Erfahrungen mit der PictureDecoder.DecodeJpeg-Methode, Sie wahrscheinlich Speichermangel Ausnahmen auftreten, wenn Sie viel größer gehen.

Hintergrund-Dateiübertragungen

Wenn man bedenkt, dass das Bild, das von BigPicture vermerkte Dateien sind mehr als 2 MB groß und einer von ihnen ist 19 MB, dies schien eine ideale Gelegenheit, machen die meisten Nutzung der Anlage zur Windows Phone herunterladen von Dateien im Hintergrund hinzugefügt.

Im BigPicture-Programm ist die meisten der MainPage pflegen eine ListBox, die verfügbaren Dateien auflistet und downloaden sie isolierten Speicher gewidmet. Abbildung 2 zeigt das Programm mit einigen Bilder bereits heruntergeladen (die als Miniaturansichten angezeigt werden), einem Download in Fortschritt und andere noch nicht heruntergeladen.

The BigPicture Main Page
Abbildung 2 die BigPicture-Hauptseite

Um die Hintergrund-Dateiübertragung verwenden, erstellen Sie ein Objekt vom Typ BackgroundTransferRequest, übergeben sie die URL der externen Datei und die URL eines Ortes in isolierter Speicher im /shared/transfers-Verzeichnis. Dann erhalten Sie Änderungen im Status und Fortschritt über Ereignisse, während das Programm ausgeführt wird, und Sie die aktiven Anforderungen auflisten können, wenn Ihr Programm wieder startet.

Wenn das BigPicture-Programm wird gestartet, sucht MainPage isolierten Speicher für alle Bilder, die zuvor heruntergeladen wurden. Ich entdeckte, dass Dateien heruntergeladen werden, direkt an der Dateiname, den Sie angeben, und nicht in eine temporäre Datei mit einigen anderen Dateinamen. Dies bedeutet, dass mein Programm Dateien Auftritt war, die hatten noch nicht vollständig heruntergeladen wurde, oder deren Downloads Woche möglicherweise abgebrochen wurde. Ich reparierte einige Fehler in meinem Programm mithilfe des /shared/transfers-Verzeichnisses nur zum Herunterladen von Dateien und nicht für die dauerhafte Datenspeicherung. Wenn ein Download abgeschlossen ist, wird das Programm verschiebt die Datei in ein anderes Verzeichnis und erstellt eine Miniaturansicht in noch einem anderen Verzeichnis. Der Einfachheit halber alle drei Dateien haben den gleichen Namen aber zeichnen sich durch das Verzeichnis, in dem sie enthalten sind.

Wenn eine Datei von BigPicture heruntergeladen wurde, können Sie das Element in der ListBox klopfen und das Programm navigiert zu ViewPage, die der eigentliche Kern des Programms ist.

Das große Bild

ViewPage verfügt über zwei Anzeigemodi, die Sie durch Tippen auf dem Bildschirm zwischen abwechseln können. Eine Animation führt Sie von einem Modus zum anderen.

Im normalen Modus angezeigt, Abbildung 3, das Bild wird in seiner Pixelgröße, konzeptionell auf das Innere einer Himmelskugel gestreckt angezeigt. Sie navigieren, um das Bild herum durch Ändern der Ausrichtung des Telefons, konzeptionell auf das Telefon Bereich der Himmelskugel, die Sie anzeigen möchten. (Es könnte helfen, wenn Sie aufstehen und Ihren ganzen Körper in verschiedene Richtungen drehen und zeigen Sie das Telefon nach oben und unten auch.)

BigPicture Showing One Small Part of a Large Painting
Abbildung 3 BigPicture anzeigen ein kleinen Teil eines großen Bildes

Wenn Sie das Telefon Tippen, schalten Sie den Zoom-Out-Modus. Das gesamte Bild angezeigt unrotated im Portrait-Modus, wie in Abbildung 4. Ein Rechteck zeigt den Teil des Bildes, das in den normalen Modus angezeigt werden kann. In diesem Beispiel ist das Rechteck in der Nähe der unteren rechten Ecke.

BigPicture Showing an Entire Large Painting
Abbildung 4 BigPicture Anzeigen einer gesamten großen Gemäldes

Was passiert an den Rändern? Da die Bitmap konzeptionell auf das Innere einer Himmelskugel, gedehnt wird wenn Sie das Telefon auf der rechten Seite den rechten Rand der Bitmap verschieben, sollten Sie dann am linken Rand auftreten. Jedoch umfließt nicht das Layoutsystem in Silverlight so. Wenn das Programm gegenüber Kanten einer großen Bitmap angezeigt werden, dann wäre zwei Bildelemente erforderlich. An der Stelle, wo alle vier Ecken treffen, wäre vier Bildelemente erforderlich.

Ich entspannen dieses Konzept. Den rechten Rand der Bitmap ist eine Lücke gleich die maximale Dimension das Display des Telefons, und dann der linke Rand angezeigt wird. Du wirst nie beide Kanten im Display sehen. Das löst auch das Problem, was an den Polen zu tun, wo theoretisch oben und unten der Malerei bis zu einem Punkt komprimiert werden sollen.

Abbildung 5 zeigt die meisten der XAML-Datei für ViewPage. Das Image-Element zeigt die Bitmap selbst, natürlich und keine Einstellung für die Stretch-Eigenschaft angibt, dass es in Pixelgröße angezeigt werden. Normalerweise würde ein großes Bild vom Layoutsystem auf die Größe des Displays zugeschnitten werden, und Sie wäre nicht in der Lage, um den Rest des Bildes zu schwenken. Aber setzen alles innerhalb eines Canvas verleitet das Layoutsystem zum Rendern des ganzen Objekts. Die Grenze mit dem eingebetteten Rechteck ist das Rechteck in der Zoom-Out-Modus sichtbar, aber es ist auch sichtbar umarmt die Innenseite des Bildschirms im normalen Modus. Die CompositeTransform benannt ImageTransform bezieht sich auf das Bild und der Grenze. Die anderen Composite-Transformation mit dem Namen BorderTransform gilt nur bis zur Grenze.

Abbildung 5 der XAML-Datei für das BigPicture Bild Ergebnisseite

<phone:PhoneApplicationPage ...>
  <Grid x:Name="LayoutRoot" Background="Transparent">
    <Canvas>
      <Grid>
        <Image Name="image" Stretch="None" />
        <Border Name="outlineBorder"
                BorderBrush="White"
                HorizontalAlignment="Left"
                VerticalAlignment="Top">
            <Rectangle Name="outlineRectangle"
                       Stroke="Black" />
            <Border.RenderTransform>
              <CompositeTransform x:Name="borderTransform" />
            </Border.RenderTransform>
        </Border>
        <Grid.RenderTransform>
          <CompositeTransform x:Name="imageTransform" />
        </Grid.RenderTransform>
      </Grid>
    </Canvas>
    <TextBlock Name="titleText"
               Style="{StaticResource PhoneTextNormalStyle}"
               Margin="12,17,0,28" />
    <TextBlock Name="statusText"
               Text="creating image..."
               HorizontalAlignment="Center"
               VerticalAlignment="Center" />
  </Grid>
</phone:PhoneApplicationPage>

Die Codebehind-Datei startet ein Motion Sensor gehen und wendet dann die Rotationsmatrix um ein HorizontalCoordinate-Objekt zu erstellen, die die Eigenschaften dieser beiden Transformationen festgelegt verwendet. Die ViewPage-Klasse definiert auch eine, die das Ziel einer Animation für den Übergang zwischen zwei Anzeigemodi ist, InterpolationFactor-Abhängigkeitseigenschaft. Als InterpolationFactor von 0 auf 1 animiert ist, wechselt die Ansicht zwischen dem normalen und dem Zoom-Out.

Abbildung 6 zeigt die meisten der Mathematik beteiligt. Einer der wichtigsten Berechnungen tritt auf, wenn der Bewegungsmelder aktualisiert wird. Dies ist die Berechnung der den CenterX und CenterY-Eigenschaften von den CompositeTransform für das Bild, und es ist hier die Höhe und Azimuth ins Spiel kommen. Obwohl diese Transformationsmittelpunkts geht um die Rotation und Skalierung erfolgt, weitere Berechnungen setzen diesen Punkt in der Mitte des Displays in den normalen Anzeigemodus. Der rechteckige Rahmen wird auch dieser Punkt ausgerichtet.

Abbildung 6 viel von Transform Mathe für BigPicture

public partial class ViewPage : PhoneApplicationPage
{
  ...
void OnLoaded(object sender, RoutedEventArgs args)
  {
    // Save the screen dimensions
    screenWidth = this.ActualWidth;
    screenHeight = this.ActualHeight;
    maxDimension = Math.Max(screenWidth, screenHeight);
    // Initialize some values
    outlineBorder.Width = screenWidth;
    outlineBorder.Height = screenHeight;
    borderTransform.CenterX = screenWidth / 2;
    borderTransform.CenterY = screenHeight / 2;
    // Load the image from isolated storage
    ...
// Save image dimensions
    imageWidth = bitmap.PixelWidth;
    imageHeight = bitmap.PixelHeight;
    ...
zoomInScale = Math.Min(screenWidth / imageWidth, 
      screenHeight / imageHeight);
    UpdateImageTransforms();
    ...
}
  ...
void OnMotionCurrentValueChanged(object sender,
          SensorReadingEventArgs<MotionReading> args)
  {
    ...
// Get the rotation matrix & convert to horizontal coordinates
    Matrix matrix = args.SensorReading.Attitude.RotationMatrix;
    HorizontalCoordinate horzCoord = 
      HorizontalCoordinate.FromMotionMatrix(matrix);
    // Set the transform center on the Image element
    imageTransform.CenterX = (imageWidth + maxDimension) *
      (180 + horzCoord.Azimuth) / 360 - maxDimension / 2;
    imageTransform.CenterY = (imageHeight + maxDimension) *
      (90 - horzCoord.Altitude) / 180 - maxDimension / 2;
    // Set the translation on the Border element
    borderTransform.TranslateX = 
      imageTransform.CenterX - screenWidth / 2;
    borderTransform.TranslateY = 
      imageTransform.CenterY - screenHeight / 2;
    // Get rotation from Tilt
    rotation = -horzCoord.Tilt;
    UpdateImageTransforms();
  }
  static void OnInterpolationFactorChanged(DependencyObject obj,
              DependencyPropertyChangedEventArgs args)
  {
    (obj as ViewPage).UpdateImageTransforms();
  }
  void UpdateImageTransforms()
  {
    // If being zoomed out, set scaling
    double interpolatedScale = 1 + InterpolationFactor * 
      (zoomInScale - 1);
    imageTransform.ScaleX =
    imageTransform.ScaleY = interpolatedScale;
    // Move transform center to screen center
    imageTransform.TranslateX = 
      screenWidth / 2 - imageTransform.CenterX;
    imageTransform.TranslateY = 
      screenHeight / 2 - imageTransform.CenterY;
    // If being zoomed out, adjust for scaling
    imageTransform.TranslateX -= InterpolationFactor *
      (screenWidth / 2 - zoomInScale * imageTransform.CenterX);
    imageTransform.TranslateY -= InterpolationFactor *
      (screenHeight / 2 - zoomInScale * imageTransform.CenterY);
    // If being zoomed out, center image in screen
    imageTransform.TranslateX += InterpolationFactor *
      (screenWidth - zoomInScale * imageWidth) / 2;
    imageTransform.TranslateY += InterpolationFactor *
      (screenHeight - zoomInScale * imageHeight) / 2;
    // Set border thickness
    outlineBorder.BorderThickness = 
      new Thickness(2 / interpolatedScale);
    outlineRectangle.StrokeThickness = 2 / interpolatedScale;
    // Set rotation on image and border
    imageTransform.Rotation = (1 - InterpolationFactor) * rotation;
    borderTransform.Rotation = -rotation;
  }
}

Wenn der Azimut 0 (Telefon Nordlage) und die Höhe 0 (Hochformat), werden die Eigenschaften CenterX und CenterY zum Zentrum der Bitmap festgelegt. Beachten Sie die Einbeziehung der MaxDimension-Wert, so dass diese Eigenschaften CenterX und CenterY auf Werte außerhalb der Bitmap festgelegt werden können. Dies ermöglicht die Polsterung beim fegen Sie vorbei an den Rändern.

Die meisten des Restes der Berechnungen auftreten während der UpdateImageTransforms-Methode, die aufgerufen wird, wenn der Bewegungsmelder meldet einen neuen Wert, oder wenn die InterpolationFactor-Eigenschaft während der Übergänge ändert. Hier ist, wo die Skalierung und die Übersetzung der Bild-Transformation auftritt, sowie Drehung.

Wenn Sie für das Verständnis der Interaktion von diesen Transformationen interessiert sind, sollten Sie sie durch den Wegfall des Interpolation Codes bereinigen. Beim InterpolationFactor ist 0 und wenn es 1, ist die vereinfachten Formeln prüfen und Sie werden sehen, dass sie eigentlich ganz einfach sind.

Charles Petzold ist eine langjährige Mitarbeit beim MSDN Magazin und ist derzeit aktualisiert sein klassisches Buch "Programming Windows" (Microsoft Press, 1998) für Windows 8. Seiner Website lautet charlespetzold.com.

Unser Dank gilt dem folgenden technischen Experten für die Durchsicht dieses Artikels: Donn Morse