我已经构建了一个简单的模块化比例计算器,在这里我可以输入一个基数(比如字体大小或行高)和一个重要的数字(可能是列宽、页面宽或其他字体大小),并选择一个比例(例如黄金比例),计算器将显示一个双链比例,用于页面布局。参见下面的示例
我一直在考虑允许用户输入点和picas,然后以一种或另一种方式显示比例。
问题是pica是以12为基数的数字(pica有12个点),我想如果我能把输入(比如16p6)转换成以12为基数,我就可以从那里进行计算。
我就是不知道如何在另一种基础上做基本的计算。我真的只是随便玩玩,看看我能想出什么办法,如果你认为我找错人了,请告诉我。
所以我的问题是我如何在12进制中进行计算?
<?php
// basic modular scale calculation
$goldenRatio = 1.618;
$baseNumber = 16;
$i = 0;
while ($i <= 10) {
echo round($baseNumber,1). "<br>";
$baseNumber = $baseNumber * $goldenRatio;
$i++;
}
echo "<hr><br>";
// Attempt at base 12 calculation
$a=base_convert(16,10,12);
$b=base_convert(12,10,12);
$r = ($a*$b);
echo $a."*".$b."=";
echo $r;
我真的只是在瞎折腾,看看我能想出什么办法,如果你认为我找错人了,请告诉我。
为了解决将Picas从字符串(如'12p6'
)转换为基点的问题,我最终使用regex首先测试是否提供了Picas和points,然后分割Picas和points。
function isPica($data) {
if (preg_match('/^[0-9]+(?i)p([0-1]?[0-9])?$/i',$data)) {
return true;
}
return false;
}
function makePoints($data) {
$data = preg_replace('/^([0-9]+)((?i)p)(([0-1]?[0-9])?)$/i','$1.$3',$data);
$data = explode('.',$data);
$points = floor($data[0] * 12);
$points = $data[1] + $points;
return $points;
}
模块化比例计算器
Git Hub -模块化刻度计算器
base_convert只是转换字符串表示。在php中不能使用以12为基数的数字串进行计算。当处理英制单位时,你通常有多个"基地"要处理。所以必须手工完成。当你在做计算时,基数并不重要。
- 将所有不同的单位转换为最小的单位(点)。$a = 3*12 + 7;//3picas, 7分。
- 做计算。
-
转换回原单位
$points = (int)$val % 12;$picas = (int)($val/12);
或
$picas = floor($val / 12);
$points = $val - 12*$picas;