【问题标题】:100mm to twips in LibreOffice在 LibreOffice 中为 100 毫米至缇
【发布时间】:2018-05-03 11:28:11
【问题描述】:

我一直在阅读一些 LibreOffice 代码,其中有 code that converts from 100mm to twips

它的基本公式是:

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

现在我知道一缇是点的 1/20,一英寸是 72 点,一英寸是 2.54 厘米,但我无法计算出上述公式与这些比率的关系!

有人能解释一下吗?

【问题讨论】:

标签: c++ libreoffice


【解决方案1】:

汇总 OP 提供的内容:

n 是 100 毫米的尺寸。

1 英寸是 2.54 厘米是 25.4 毫米。

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

1 英寸是 72 磅。

points = inchs * 72

1 twip 是 1/20 点。

twips = points / 20

现在,一切都在一起:

twips = n / 2540 * 72 / 20twips = n * 72 / 2540 / 20twips = 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 已经指出的,?: 运算符是ternary if-then-else operator

一个更容易阅读(但可能不太优化)的替换是:

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

【讨论】:

  • 啊,我没看到的是2540 / 20。很好的崩溃!
猜你喜欢
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多