| @@ -0,0 +1,31 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <classpath> | |||
| <classpathentry kind="src" output="target/classes" path="src/main/java"> | |||
| <attributes> | |||
| <attribute name="optional" value="true"/> | |||
| <attribute name="maven.pomderived" value="true"/> | |||
| </attributes> | |||
| </classpathentry> | |||
| <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"> | |||
| <attributes> | |||
| <attribute name="maven.pomderived" value="true"/> | |||
| </attributes> | |||
| </classpathentry> | |||
| <classpathentry kind="src" output="target/test-classes" path="src/test/java"> | |||
| <attributes> | |||
| <attribute name="optional" value="true"/> | |||
| <attribute name="maven.pomderived" value="true"/> | |||
| </attributes> | |||
| </classpathentry> | |||
| <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"> | |||
| <attributes> | |||
| <attribute name="maven.pomderived" value="true"/> | |||
| </attributes> | |||
| </classpathentry> | |||
| <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> | |||
| <attributes> | |||
| <attribute name="maven.pomderived" value="true"/> | |||
| </attributes> | |||
| </classpathentry> | |||
| <classpathentry kind="output" path="target/classes"/> | |||
| </classpath> | |||
| @@ -0,0 +1,29 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <projectDescription> | |||
| <name>algorithm-lib</name> | |||
| <comment></comment> | |||
| <projects> | |||
| </projects> | |||
| <buildSpec> | |||
| <buildCommand> | |||
| <name>org.eclipse.jdt.core.javabuilder</name> | |||
| <arguments> | |||
| </arguments> | |||
| </buildCommand> | |||
| <buildCommand> | |||
| <name>org.springframework.ide.eclipse.core.springbuilder</name> | |||
| <arguments> | |||
| </arguments> | |||
| </buildCommand> | |||
| <buildCommand> | |||
| <name>org.eclipse.m2e.core.maven2Builder</name> | |||
| <arguments> | |||
| </arguments> | |||
| </buildCommand> | |||
| </buildSpec> | |||
| <natures> | |||
| <nature>org.springframework.ide.eclipse.core.springnature</nature> | |||
| <nature>org.eclipse.jdt.core.javanature</nature> | |||
| <nature>org.eclipse.m2e.core.maven2Nature</nature> | |||
| </natures> | |||
| </projectDescription> | |||
| @@ -0,0 +1,5 @@ | |||
| eclipse.preferences.version=1 | |||
| encoding//src/main/java=UTF-8 | |||
| encoding//src/main/resources=UTF-8 | |||
| encoding//src/test/java=UTF-8 | |||
| encoding/<project>=UTF-8 | |||
| @@ -0,0 +1,5 @@ | |||
| eclipse.preferences.version=1 | |||
| org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 | |||
| org.eclipse.jdt.core.compiler.compliance=1.8 | |||
| org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning | |||
| org.eclipse.jdt.core.compiler.source=1.8 | |||
| @@ -0,0 +1,4 @@ | |||
| activeProfiles= | |||
| eclipse.preferences.version=1 | |||
| resolveWorkspaceProjects=true | |||
| version=1 | |||
| @@ -8,11 +8,13 @@ import com.sun.jna.Native; | |||
| public interface BodyFatAlgorithmAicare extends Library { | |||
| String osName = System.getProperty("os.name"); // 获取当前操作系统的类型 | |||
| //window系统默认会从jdk的-jre/bin目录下寻找,该demo使用默认位置,将dll文件放在jdk->jre->bin目录中 | |||
| String libWindows = "libalgorithm-aicare_x64"; | |||
| //MacOS,需要手动在IDE中添加对SO库的引用,类似添加普通jar包文件 | |||
| String rootResource = BodyFatAlgorithmAicare.class.getResource("/").getPath(); | |||
| String libWindows = "/libalgorithm-aicare.dll"; | |||
| String libMacOS = rootResource+ "libMacAlgorithm-aicare.so"; | |||
| //System调用so时,调用了:java.lang.System.mapLibraryName()方法。这个方法会在咱们的给定的名字前拼接上”lib” | |||
| //此种调用方式,linux系统对应的so库,需要放在usr/lib下 | |||
| //linux->System调用so时,调用了:java.lang.System.mapLibraryName()方法。这个方法会在给定的名字前拼接上”lib” | |||
| //默认调用方式,linux系统对应的so库,需要放在usr/lib下 | |||
| String liblinux = "algorithm-aicare"; | |||
| //根据不同的操作系统,使用不同的库 | |||
| String libPath = (osName != null && osName.startsWith("Windows")) ? libWindows : ((osName != null && osName.startsWith("Mac")) ? libMacOS : liblinux); | |||
| @@ -1,13 +1,14 @@ | |||
| package com.elink.aicare; | |||
| import com.alibaba.fastjson.JSON; | |||
| import java.math.BigDecimal; | |||
| import com.alibaba.fastjson.JSON; | |||
| /** | |||
| * | |||
| */ | |||
| public class BodyFatAlgorithmUtils { | |||
| public static void main(String args[]){ | |||
| public static void main(String args[]) throws Exception{ | |||
| int sex=1; | |||
| int age=24; | |||
| double weight = 60.5; | |||
| @@ -27,31 +28,41 @@ public class BodyFatAlgorithmUtils { | |||
| * @param height 身高;单位:cm,取值范围:0< height <=270 | |||
| * @param adc 阻抗;取值范围:0 < adc <= 1000 | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| public static BodyFatData getBodyFatData(int algorithmType,int sex, int age, double weight,int height, int adc){ | |||
| if (age < 0 || age > 120){ | |||
| System.out.println("年龄age取值不正确,取值范围:0<=age<=120 ;单位:年"); | |||
| return null; | |||
| } | |||
| if (weight <= 0.0 && weight > 220.0){ | |||
| System.out.println("体重weight取值不正确,取值范围:0.0< weight < 220 ;单位:kg"); | |||
| return null; | |||
| } | |||
| if (height <= 0 && height > 270){ | |||
| System.out.println("身高height取值不正确,取值范围:0< height <=270 ;单位:cm"); | |||
| return null; | |||
| } | |||
| if (adc < 0 && adc > 1000){ | |||
| System.out.println("阻抗adc取值不正确,取值范围:0 < adc <= 1000"); | |||
| return null; | |||
| } | |||
| return getDataByAicare(sex, age, weight,height, adc); | |||
| try { | |||
| if (age < 0 || age > 120){ | |||
| throw new Exception("年龄age取值不正确,取值范围:0<=age<=120 ;单位:年"); | |||
| } | |||
| if (weight <= 0.0 && weight > 220.0){ | |||
| throw new Exception("体重weight取值不正确,取值范围:0.0< weight < 220 ;单位:kg"); | |||
| } | |||
| if (height <= 0 && height > 270){ | |||
| throw new Exception("身高height取值不正确,取值范围:0< height <=270 ;单位:cm"); | |||
| } | |||
| if (adc < 0 && adc > 1000){ | |||
| throw new Exception("阻抗adc取值不正确,取值范围:0 < adc <= 1000"); | |||
| } | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| return null; | |||
| } | |||
| return getDataByAicare(sex, age, weight,height, adc); | |||
| } | |||
| /** | |||
| * 调用体脂算法库文件,计算对应的数据 | |||
| * @param sex | |||
| * @param age | |||
| * @param weight | |||
| * @param heightCM | |||
| * @param adc | |||
| * @return | |||
| */ | |||
| private static BodyFatData getDataByAicare(int sex, int age, double weight,int heightCM, int adc){ | |||
| BodyFatAlgorithmAicare bodyFatAlgorithmAicare = BodyFatAlgorithmAicare.INSTANTCE; | |||
| //调用体脂算法库,计算基础数据 | |||
| BodyFatAlgorithmAicare bodyFatAlgorithmAicare = BodyFatAlgorithmAicare.INSTANTCE; | |||
| double height = bodyFatAlgorithmAicare.getHeight(heightCM); | |||
| double bmi = bodyFatAlgorithmAicare.getBMI(weight,height); | |||
| double bm = bodyFatAlgorithmAicare.getBM(sex,bmi, height, age, adc, weight); | |||
| @@ -64,7 +75,7 @@ public class BodyFatAlgorithmUtils { | |||
| int uvi = bodyFatAlgorithmAicare.getUVI( sex, weight, height, age, adc); | |||
| int bmr = bodyFatAlgorithmAicare.getBMR( sex, weight, height, age, adc); | |||
| int bodyAge = bodyFatAlgorithmAicare.getBodyAge( age, bmi, sex); | |||
| //处理返回数据 | |||
| //处理基础数据 | |||
| BodyFatData fatData = new BodyFatData(); | |||
| fatData.setBmi(bmi); | |||
| fatData.setBfr(Math.round(bfr * 10) / 10.0); | |||
| @@ -76,6 +87,121 @@ public class BodyFatAlgorithmUtils { | |||
| fatData.setVwc(Math.floor(vwc * 10) / 10); | |||
| fatData.setBodyAge(bodyAge); | |||
| fatData.setPp(Math.floor(pp * 10) / 10); | |||
| //依据基础数据,计算其他体脂数据 | |||
| double standardWeight = returnStandardWeight(sex, heightCM); | |||
| double controlWeight = returnControlWeight(weight, standardWeight); | |||
| double fat = returnFat(weight, bfr); | |||
| double removeFatWeight = returnRemoveFatWeight(weight, fat); | |||
| double muscleMass = returnMuscleMass(weight, rom); | |||
| double protein = returnProtein(weight, pp); | |||
| fatData.setStandardWeight(keepDecimal(standardWeight, 1)); | |||
| fatData.setControlWeight(keepDecimal(controlWeight, 1)); | |||
| fatData.setFat(keepDecimal(fat, 1)); | |||
| fatData.setRemoveFatWeight(keepDecimal(removeFatWeight, 1)); | |||
| fatData.setMuscleMass(keepDecimal(muscleMass, 1)); | |||
| fatData.setProtein(keepDecimal(protein, 1)); | |||
| BodyFatData.FatLevel fatLevel = returnFatLevel(weight, standardWeight); | |||
| fatData.setFatLevel(fatLevel); | |||
| return fatData; | |||
| } | |||
| } | |||
| /** | |||
| * 标准体重(kg) | |||
| * @param sex 性别 | |||
| * @param height 身高 | |||
| * @return | |||
| */ | |||
| private static double returnStandardWeight(int sex, int height) { | |||
| double standardWeight = 0.0D; | |||
| switch(sex) { | |||
| case 1: | |||
| standardWeight = (double)(height - 80) * 0.7D; | |||
| break; | |||
| case 2: | |||
| standardWeight = (double)(height - 70) * 0.6D; | |||
| } | |||
| return standardWeight; | |||
| } | |||
| /** | |||
| * 体重控制量(kg) | |||
| * @param curWeight 体重 | |||
| * @param standardWeight 标准体重 | |||
| * @return | |||
| */ | |||
| private static double returnControlWeight(double curWeight, double standardWeight) { | |||
| return curWeight - standardWeight; | |||
| } | |||
| /** | |||
| * 脂肪量 | |||
| * @param curWeight 体重 | |||
| * @param bfr 脂肪 | |||
| * @return | |||
| */ | |||
| private static double returnFat(double curWeight, double bfr) { | |||
| return curWeight * bfr / 100.0D; | |||
| } | |||
| /** | |||
| * 去脂体重 | |||
| * @param curWeight 体重 | |||
| * @param fat 脂肪量 | |||
| * @return | |||
| */ | |||
| private static double returnRemoveFatWeight(double curWeight, double fat) { | |||
| return curWeight - fat; | |||
| } | |||
| /** | |||
| * 肌肉量 | |||
| * @param curWeight 体重 | |||
| * @param rom 肌肉率 | |||
| * @return | |||
| */ | |||
| private static double returnMuscleMass(double curWeight, double rom) { | |||
| return curWeight * rom / 100.0D; | |||
| } | |||
| /** | |||
| * 蛋白量 | |||
| * @param curWeight 体重 | |||
| * @param pp 蛋白率 | |||
| * @return | |||
| */ | |||
| private static double returnProtein(double curWeight, double pp) { | |||
| return curWeight * pp / 100.0D; | |||
| } | |||
| /** | |||
| * 肥胖等级 | |||
| * @param curWeight 体重 | |||
| * @param standardWeight 标准体重 | |||
| * @return | |||
| */ | |||
| private static BodyFatData.FatLevel returnFatLevel(double curWeight, double standardWeight) { | |||
| double level = (curWeight - standardWeight) / standardWeight * 100.0D; | |||
| if (level < -20.0D) { | |||
| return BodyFatData.FatLevel.UNDER; | |||
| } else if (level >= -20.0D && level < -10.0D) { | |||
| return BodyFatData.FatLevel.THIN; | |||
| } else if (level >= -10.0D && level <= 10.0D) { | |||
| return BodyFatData.FatLevel.NORMAL; | |||
| } else { | |||
| return level > 10.0D && level <= 20.0D ? BodyFatData.FatLevel.OVER : BodyFatData.FatLevel.FAT; | |||
| } | |||
| } | |||
| /** | |||
| * 四舍五入 | |||
| * @param d 值 | |||
| * @param count 保留小数位 | |||
| * @return double | |||
| */ | |||
| private static double keepDecimal(double d, int count) { | |||
| BigDecimal decimal = new BigDecimal(d); | |||
| return decimal.setScale(count, BigDecimal.ROUND_HALF_UP).doubleValue(); | |||
| } | |||
| } | |||
| @@ -41,6 +41,61 @@ public class BodyFatData { | |||
| * 蛋白率 | |||
| */ | |||
| private double pp; | |||
| /** | |||
| * 标准体重(kg) | |||
| */ | |||
| private double standardWeight; | |||
| /** | |||
| * 体重控制量(kg) | |||
| */ | |||
| private double controlWeight; | |||
| /** | |||
| * 脂肪量 | |||
| */ | |||
| private double fat; | |||
| /** | |||
| * 去脂体重 | |||
| */ | |||
| private double removeFatWeight; | |||
| /** | |||
| * 肌肉量 | |||
| */ | |||
| private double muscleMass; | |||
| /** | |||
| * 蛋白量 | |||
| */ | |||
| private double protein; | |||
| /** | |||
| * 肥胖等级 | |||
| */ | |||
| private FatLevel fatLevel; | |||
| public static enum FatLevel { | |||
| /** | |||
| * 体重不足 | |||
| */ | |||
| UNDER, | |||
| /** | |||
| * 偏瘦 | |||
| */ | |||
| THIN, | |||
| /** | |||
| * 标准 | |||
| */ | |||
| NORMAL, | |||
| /** | |||
| * 偏重 | |||
| */ | |||
| OVER, | |||
| /** | |||
| * 超重 | |||
| */ | |||
| FAT; | |||
| private FatLevel() { | |||
| } | |||
| } | |||
| public double getBmi() { | |||
| return bmi; | |||
| @@ -122,4 +177,61 @@ public class BodyFatData { | |||
| public void setPp(double pp) { | |||
| this.pp = pp; | |||
| } | |||
| public double getStandardWeight() { | |||
| return this.standardWeight; | |||
| } | |||
| public void setStandardWeight(double standardWeight) { | |||
| this.standardWeight = standardWeight; | |||
| } | |||
| public double getControlWeight() { | |||
| return this.controlWeight; | |||
| } | |||
| public void setControlWeight(double controlWeight) { | |||
| this.controlWeight = controlWeight; | |||
| } | |||
| public double getFat() { | |||
| return this.fat; | |||
| } | |||
| public void setFat(double fat) { | |||
| this.fat = fat; | |||
| } | |||
| public double getRemoveFatWeight() { | |||
| return this.removeFatWeight; | |||
| } | |||
| public void setRemoveFatWeight(double removeFatWeight) { | |||
| this.removeFatWeight = removeFatWeight; | |||
| } | |||
| public double getMuscleMass() { | |||
| return this.muscleMass; | |||
| } | |||
| public void setMuscleMass(double muscleMass) { | |||
| this.muscleMass = muscleMass; | |||
| } | |||
| public double getProtein() { | |||
| return this.protein; | |||
| } | |||
| public void setProtein(double protein) { | |||
| this.protein = protein; | |||
| } | |||
| public FatLevel getFatLevel() { | |||
| return this.fatLevel; | |||
| } | |||
| public void setFatLevel(FatLevel fatLevel) { | |||
| this.fatLevel = fatLevel; | |||
| } | |||
| } | |||
| @@ -1,6 +1,7 @@ | |||
| package com.elink.aicare; | |||
| import com.alibaba.fastjson.JSON; | |||
| import org.springframework.validation.BindingResult; | |||
| import org.springframework.web.bind.annotation.RequestBody; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| @@ -15,10 +16,11 @@ public class DemoController { | |||
| /** | |||
| * 获取体脂数据 | |||
| * @throws Exception | |||
| * | |||
| */ | |||
| @RequestMapping(value = "getBodyFat") | |||
| public Object sendCode(@RequestBody BodyFatData bodyFatData, HttpServletRequest request, BindingResult result) { | |||
| public Object sendCode(@RequestBody BodyFatData bodyFatData, HttpServletRequest request, BindingResult result) throws Exception { | |||
| int sex=1; | |||
| int age=24; | |||
| double weight = 60.5; | |||