От 100 мм до двойки в LibreOffice - PullRequest
0 голосов
/ 03 мая 2018

Я читал часть кода LibreOffice, и есть код , который преобразуется из 100 мм в твипы .

Его основная формула:

twips = (n>=0) ? (n*72+63) / 127 : (n*72-63) / 127;

Теперь я знаю, что одно смещение составляет 1/20 от точки, а один дюйм - это 72 точки, а 1 дюйм - это 2,54 см, но я не могу понять, как приведенная выше формула относится к этим соотношениям!

Может кто-нибудь пролить свет на это?

1 Ответ

0 голосов
/ 03 мая 2018

Составляем то, что предоставил ОП:

n - размер в 100 мм.

1 дюйм, 2,54 см, 25,4 мм.

inchs = n * 100 / 25.4 или inchs = n / (100 * 25.4) или inchs = n / 2540

1 дюйм - 72 балла.

points = inchs * 72

1 twip составляет 1/20.

twips = points / 20

Теперь все вместе:

twips = n / 2540 * 72 / 20 или twips = n * 72 / 2540 / 20 или twips = n * 72 / 127

Если это сделано в int арифметике, вместо математического округления будет усечение. Это можно исправить, добавив половину 127 (127 / 2 = 63) к n * 72:

twips = (n * 72 + 63) / 127

Это не обрабатывает отрицательные числа правильно. Для этого вместо этого нужно вычесть 63:

twips = n >= 0 ? (n * 72 + 63) / 127) : (n * 72 - 63) / 127;

и вот мы здесь.

Как уже указывалось Ron , оператор ?: является троичным оператором if-then-else .

Более легкая для чтения (но может быть менее оптимизированная) замена будет:

if (n >= 0) twips = (n * 72 + 63) / 127);
else twips = (n * 72 - 63) / 127;
...