<?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> |
<?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> |
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 |
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 |
activeProfiles= | |||||
eclipse.preferences.version=1 | |||||
resolveWorkspaceProjects=true | |||||
version=1 |
public interface BodyFatAlgorithmAicare extends Library { | public interface BodyFatAlgorithmAicare extends Library { | ||||
String osName = System.getProperty("os.name"); // 获取当前操作系统的类型 | 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 rootResource = BodyFatAlgorithmAicare.class.getResource("/").getPath(); | ||||
String libWindows = "/libalgorithm-aicare.dll"; | |||||
String libMacOS = rootResource+ "libMacAlgorithm-aicare.so"; | 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 liblinux = "algorithm-aicare"; | ||||
//根据不同的操作系统,使用不同的库 | //根据不同的操作系统,使用不同的库 | ||||
String libPath = (osName != null && osName.startsWith("Windows")) ? libWindows : ((osName != null && osName.startsWith("Mac")) ? libMacOS : liblinux); | String libPath = (osName != null && osName.startsWith("Windows")) ? libWindows : ((osName != null && osName.startsWith("Mac")) ? libMacOS : liblinux); |
package com.elink.aicare; | package com.elink.aicare; | ||||
import com.alibaba.fastjson.JSON; | |||||
import java.math.BigDecimal; | |||||
import com.alibaba.fastjson.JSON; | |||||
/** | /** | ||||
* | * | ||||
*/ | */ | ||||
public class BodyFatAlgorithmUtils { | public class BodyFatAlgorithmUtils { | ||||
public static void main(String args[]){ | |||||
public static void main(String args[]) throws Exception{ | |||||
int sex=1; | int sex=1; | ||||
int age=24; | int age=24; | ||||
double weight = 60.5; | double weight = 60.5; | ||||
* @param height 身高;单位:cm,取值范围:0< height <=270 | * @param height 身高;单位:cm,取值范围:0< height <=270 | ||||
* @param adc 阻抗;取值范围:0 < adc <= 1000 | * @param adc 阻抗;取值范围:0 < adc <= 1000 | ||||
* @return | * @return | ||||
* @throws Exception | |||||
*/ | */ | ||||
public static BodyFatData getBodyFatData(int algorithmType,int sex, int age, double weight,int height, int adc){ | 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){ | 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 height = bodyFatAlgorithmAicare.getHeight(heightCM); | ||||
double bmi = bodyFatAlgorithmAicare.getBMI(weight,height); | double bmi = bodyFatAlgorithmAicare.getBMI(weight,height); | ||||
double bm = bodyFatAlgorithmAicare.getBM(sex,bmi, height, age, adc, weight); | double bm = bodyFatAlgorithmAicare.getBM(sex,bmi, height, age, adc, weight); | ||||
int uvi = bodyFatAlgorithmAicare.getUVI( sex, weight, height, age, adc); | int uvi = bodyFatAlgorithmAicare.getUVI( sex, weight, height, age, adc); | ||||
int bmr = bodyFatAlgorithmAicare.getBMR( sex, weight, height, age, adc); | int bmr = bodyFatAlgorithmAicare.getBMR( sex, weight, height, age, adc); | ||||
int bodyAge = bodyFatAlgorithmAicare.getBodyAge( age, bmi, sex); | int bodyAge = bodyFatAlgorithmAicare.getBodyAge( age, bmi, sex); | ||||
//处理返回数据 | |||||
//处理基础数据 | |||||
BodyFatData fatData = new BodyFatData(); | BodyFatData fatData = new BodyFatData(); | ||||
fatData.setBmi(bmi); | fatData.setBmi(bmi); | ||||
fatData.setBfr(Math.round(bfr * 10) / 10.0); | fatData.setBfr(Math.round(bfr * 10) / 10.0); | ||||
fatData.setVwc(Math.floor(vwc * 10) / 10); | fatData.setVwc(Math.floor(vwc * 10) / 10); | ||||
fatData.setBodyAge(bodyAge); | fatData.setBodyAge(bodyAge); | ||||
fatData.setPp(Math.floor(pp * 10) / 10); | 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; | 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(); | |||||
} | |||||
} |
* 蛋白率 | * 蛋白率 | ||||
*/ | */ | ||||
private double pp; | 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() { | public double getBmi() { | ||||
return bmi; | return bmi; | ||||
public void setPp(double pp) { | public void setPp(double pp) { | ||||
this.pp = 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; | |||||
} | |||||
} | } |
package com.elink.aicare; | package com.elink.aicare; | ||||
import com.alibaba.fastjson.JSON; | import com.alibaba.fastjson.JSON; | ||||
import org.springframework.validation.BindingResult; | import org.springframework.validation.BindingResult; | ||||
import org.springframework.web.bind.annotation.RequestBody; | import org.springframework.web.bind.annotation.RequestBody; | ||||
import org.springframework.web.bind.annotation.RequestMapping; | import org.springframework.web.bind.annotation.RequestMapping; | ||||
/** | /** | ||||
* 获取体脂数据 | * 获取体脂数据 | ||||
* @throws Exception | |||||
* | * | ||||
*/ | */ | ||||
@RequestMapping(value = "getBodyFat") | @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 sex=1; | ||||
int age=24; | int age=24; | ||||
double weight = 60.5; | double weight = 60.5; |