2017-04-21 2 views
7

Gibt es eine Möglichkeit xy einzustellen Koordinaten innerhalb eines Begrenzungsrahmens in Prawn PDF passen, wenn sie die Höhe der Box sind größer dann?Garnele PDF Linie fit zu Begrenzungsbox

Ich bin mit dem Juwel "Signatur-pad-Schienen Unterschriften zu erfassen, die dann speichert der folgende:

[{"lx":98,"ly":23,"mx":98,"my":22},{"lx":98,"ly":21,"mx":98,"my":23},{"lx":98,"ly":18,"mx":98,"my":21}, ... {"lx":405,"ly":68,"mx":403,"my":67},{"lx":406,"ly":69,"mx":405,"my":68}] 

Ich habe die folgen die Signatur in meinem pdf zeigen:

bounding_box([0, cursor], width: 540, height: 100) do 
     stroke_bounds 
     @witness_signature.each do |e| 
     stroke { line [e["lx"], 100 - e["ly"]], 
         [e["mx"], 100 - e["my"] ] } 
     end 
    end 

Aber die Signatur läuft in manchen Fällen von der Seite ab, ist nicht zentriert und läuft meist nur amupelnd.

+0

Können Sie ein Beispiel (Bild) der aktuellen Ausgabe und zum anderen mit dem gewünschten Ausgang? – Gerry

Antwort

1

Ihre Frage ist ziemlich vage, so vermute ich, was Sie meinen.

Um eine Sequenz von Koordinaten (x[i], y[i]), i = 1..n rescale in einer gegebenen Zeichen-Box der Größe (width, height) mit Ursprung (0,0) wie in Postscript zu passen, zunächst entscheiden, ob das Seitenverhältnis des Originalbildes zu erhalten. Das Anpassen an eine Box wird dies normalerweise nicht tun. Da Sie die Signatur wahrscheinlich nicht verzerren möchten, sagen Sie, die Antwort lautet "Ja".

Beim Skalieren eines Bildes in einem Kasten Seitenverhältnis beibehalten wird, entweder der X- oder Y-Achse bestimmt den Skalenfaktor, wenn der Kasten genau das Bild des Aspekts haben passiert. Als nächstes muss entschieden werden, was mit dem "Extra Space" auf der anderen Achse geschehen soll. Z.B. Wenn das Bild im Vergleich zur Begrenzungsbox groß und dünn ist, befindet sich der zusätzliche Platz auf der X-Achse. wenn es kurz und fett ist, ist es die Y-Achse.

Sagen wir Mitte das Bild innerhalb des zusätzlichen Platz; das scheint für eine Unterschrift angemessen.

Dann ist hier Pseudo-Code die Punkte-Skala wieder die Box passen:

x_min = y_min = +infty, x_max = y_max = -infty 
for i in 1 to n 
    if x[i] < x_min, x_min = x[i] 
    if x[i] > x_max, x_max = x[i] 
    if y[i] < y_min, y_min = y[i] 
    if y[i] > y_max, y_max = y[i] 
end for 
dx = x_max - x_min 
dy = y_max - y_min 
x_scale = width/dx 
y_scale = height/dy 
if x_scale < y_scale then 
    // extra space is on the y-dimension 
    scale = x_scale 
    x_org = 0 
    y_org = 0.5 * (height - dy * scale) // equal top and bottom extra space 
else 
    // extra space is on the x_dimension 
    scale = y_scale 
    x_org = 0.5 * (width - dx * scale) // equal left and right extra space 
    y_org = 0 
end 
for i in 1 to n 
    x[i] = x_org + scale * (x[i] - x_min) 
    y[i] = y_org + scale * (y[i] - y_min) 
end