2017-08-08 1 views
1

Ich möchte historische Luftbilder auf einer Karte mit der in IIIF verfügbaren Bilddrehung überlagern. Das Problem, mit dem ich konfrontiert bin, ist, dass Code wie in http://jsfiddle.net/jamesinealing/tr7obasm/ ich die NW- und SE-Punkte, die basierend auf der Rotation ändern, manuell vor dem Platzieren des Bildes auf der Karte berechnen müssen.So berechnen Sie die Höhe und Breite eines gedrehten IIIF-Bildes

Was ich zu tun versuche ist, die Pixelmaße des neuen gedrehten Bildes zu berechnen (die Bounding Box, wenn Sie möchten) und dann diese zu verwenden, um zumindest etwas Näherungswert für die Koordinaten zu erhalten zwicken.

Mein Testcode für die Berechnung ist bei http://jsfiddle.net/jamesinealing/ehp65gy1/ (basierend auf https://stackoverflow.com/a/17453766)

var rotation=30; 
var angle=rotation; 
// var angle=((360-rotation) % 180); 
var imgWidth=300; 
var imgHeight=224; 
w = Math.sin(angle * Math.PI/180) * imgHeight + Math.cos(angle * Math.PI/180) * imgWidth; 
h = Math.sin(angle * Math.PI/180) * imgWidth + Math.cos(angle * Math.PI/180) * imgHeight; 

Das Problem ist, dass es nur bis zu einem Winkel von 90 Grad arbeitet nach oben, während die IIIF Rotation 0-359 jeder beliebigen Wert ist. Ich schätze, dass jeder Wert von 180 oder höher zu den gleichen Ergebnissen führt, also ist sowieso eine Art von Modul erforderlich, aber ich kann nicht verstehen, warum es nicht über 90 Grad arbeitet!

Antwort

1

Die Abmessungen der neuen Box unterscheiden sich nur nach angle % 90, dh zwischen 300 * 224 und 224 * 300 auf einer Ellipse, so dass Sie nur Math.abs mit dem eingestellten Winkel und einige if Aussagen, die drum herum zu arbeiten, nutzen könnten sollte sein.

+0

Großartig, danke für die klare Erklärung. Ich bin mir sicher, dass es bessere Möglichkeiten gibt, dies zu tun, aber das ist mein Arbeitscode - http://jsfiddle.net/jamesinealing/ehp65gy1/5/ – jamesinealing

+0

Und in Aktion auf einem Live-Karten-Overlay - http://jsfiddle.net/Jamesinealing/p0qft0hs – jamesinealing

Verwandte Themen