JScience:创建一个定义为多个变量组合的单位

问题描述 投票:2回答:1

几个月前,我发现了JScience,尽管我正为一件事情而苦苦挣扎,但这对我的项目有很大帮助。

[我正在尝试创建一个PressureHead(又称水柱)单位,该单位可以直接用Length转换,也可以用给定Pressure值的VolumetricDensity间接转换。

寻找压力:Density × Gravity × Head = Pressure

这里是Wikipedia的转换示例:

1 cmH 2 O(4°C)= 999.9720千克/米3×9.80665m / s 2 1厘米= 98.063754138 Pa

1 cmH 2 O可以直接转换为1 cm。

假设我知道Pa的压力,并且想要找到mH 2] O的压力头,这是我在项目中最经常进行的转换。我还需要知道流体的密度。压力和密度是可变输入。公式也必须知道重力,但出于我的目的,可以将其固定为标准重力。

查找压力头:Pressure / (Density × Gravity) = Head

[为简单起见,我只是重新调整了上面示例中的值,将压力乘以100得到1 mH 2

O,而不是1 cmH 2 O。

9806.3754138 Pa /(999.9720 kg / m 3

×9.80665 m / s 2)= 1 mH 2] O

看起来JScience可能足够灵活以允许这样的单元,但是我还没有看到任何示例可以帮助我创建它。最坏的情况是,我可能只想通过util方法在它们之间进行转换。

编辑

一些我想看到的理想用法的例子:

// Pressure to PressureHead
Amount<Pressure> pressure = Amount.valueOf(9806.3754138, PASCAL);
Amount<VolumetricDensity> density = Amount.valueOf(999.9720, KG_M3);
Amount<PressureHead> head = pressure.to(M_H2O, density);
System.out.println(pressure.doubleValue(M_H2O, density)); // 1.0

// PressureHead <-> Length
Amount<Length> length = head.to(METER);
System.out.println(head.doubleValue(METER)); // 1.0
head = length.to(M_H2O);
System.out.println(length.doubleValue(M_H2O)); // 1.0

// PressureHead to Pressure
pressure = head.to(PASCAL, density);
System.out.println(head.doubleValue(PASCAL, density)); // 9806.3754138

PressureHead单位之间的转换很容易。我可以这样定义其他单位:

Unit<PressureHead> FT_H2O = M_H2O.transform(FOOT.getConverterTo(METER));

对于上面的理想用法,我需要子类Amount并重载to()doubleValue()。我怀疑是否存在一种更正确的转换方法(尽管用法不是很不错),它涉及子类化UnitConverter和/或基于DerivedUnit的类之一。

[我的一部分想放弃,只走快速,简便(且丑陋)的util方法之路,这样我就可以继续从事更重要的事情,而我的另一部分则想找到一种使我爱上JScience的解决方案更多。

几个月前,我发现了JScience,尽管我正为一件事而苦苦挣扎,但这对我的项目有很大帮助。我正在尝试创建一个PressureHead(又名水柱)单元,该单元可以是...

java units-of-measurement fluid-dynamics jscience
1个回答
0
投票

尽管此刻我不再需要进行这种转换,但在将大部分项目(除UI代码之外的所有项目)转换为Kotlin并找到了喜欢Kotlin的原因之后,我正在重新讨论此问题。我之所以做出切换,是因为我认为这是一个很好的机会,可以在项目仍处于初期阶段时学习该语言。因此,这不能完全回答我过去想要Java答案的自我,但是我现在的自我很乐意接受此答案。

此解决方案利用Kotlin的extension functions

© www.soinside.com 2019 - 2024. All rights reserved.