// File: StandardBodySegmentMassProperties.cpp // Portions copyright (c) 2007 Stanford University and Paul Mitiguy // Contributors: Paul Mitiguy and Jeff Reinbolt //-------------------------------------------------------------------------- // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject // to the following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. //-------------------------------------------------------------------------- #include "StandardBodySegmentMassProperties.h" //-------------------------------------------------------------------------- // Source: ADJUSTMENTS TO ZATSIORSKY-SELUYANOV'S SEGMENT INERTIA PARAMETERS // Paolo de Leva, Kinesiology Department, Indiana University, Bloomington, IN, 47405, USA // Journal of Biomechanics, Vol. 29, No. 9. pp. 1223 - 1230, 1996. // Note: The order of the columns on pg. 228 was changed to the following convention: // X-direction is what de Leva calls "Sagittal" // Y-direction is what de Leva calls "Longitudinal" // Z-direction is what de Leva calls "Traverse" // Note: The Foot's longitudinal and sagittal radii of gyration are // also transposed from the one's reported in the paper. // Note: The standard female body mass is 61.9 kg and her total height is 1735 mm // the standard male body mass is 73.0 kg and his total height is 1741 mm //-------------------------------------------------------------------------- // Original table with original labels (from paper) - //-------------------------------------------------------------------------- // Segment Mass Longitudinal Sagittal Transverse Longitudinal // Length Percentage CM Position Gyration Gyration Gyration // Segment F M F M F M F M F M F M // Head 200.2 203.3 6.68 6.94 58.94 59.76 33.0 36.2 35.9 37.6 31.8 31.2 // Trunk 529.3 531.9 42.57 43.46 41.51 44.86 35.7 37.2 33.9 34.7 17.1 19.1 // Upper arm 275.1 281.7 2.55 2.71 57.54 57.72 27.8 28.5 26.0 26.9 14.8 15.8 // Forearm 264.3 268.9 1.38 1.62 45.59 45.74 26.1 27.6 25.7 26.5 9.4 12.1 // Hand 78.0 86.2 0.56 0.61 74.74 79.00 53.1 62.8 45.4 51.3 33.5 40.1 // Thigh 368.5 422.2 14.78 14.16 36.12 40.95 36.9 32.9 36.4 32.9 16.2 14.9 // Shank 432.3 434.0 4.81 4.33 44.16 44.59 27.1 25.5 26.7 24.9 9.3 10.3 // Foot 228.3 258.1 1.29 1.37 40.14 44.15 29.9 25.7 27.9 24.5 13.9 12.4 //-------------------------------------------------------------------------- // Original table with new labels - //-------------------------------------------------------------------------- // Segment Mass Segment X-Radius Z-Radius Y-Radius // Length Percentage CM Position Gyration Gyration Gyration // Segment F M F M F M F M F M F M // Head 200.2 203.3 6.68 6.94 58.94 59.76 33.0 36.2 35.9 37.6 31.8 31.2 // Trunk 529.3 531.9 42.57 43.46 41.51 44.86 35.7 37.2 33.9 34.7 17.1 19.1 // Upper arm 275.1 281.7 2.55 2.71 57.54 57.72 27.8 28.5 26.0 26.9 14.8 15.8 // Forearm 264.3 268.9 1.38 1.62 45.59 45.74 26.1 27.6 25.7 26.5 9.4 12.1 // Hand 78.0 86.2 0.56 0.61 74.74 79.00 53.1 62.8 45.4 51.3 33.5 40.1 // Thigh 368.5 422.2 14.78 14.16 36.12 40.95 36.9 32.9 36.4 32.9 16.2 14.9 // Shank 432.3 434.0 4.81 4.33 44.16 44.59 27.1 25.5 26.7 24.9 9.3 10.3 // Foot 228.3 258.1 1.29 1.37 40.14 44.15 29.9 25.7 27.9 24.5 13.9 12.4 //-------------------------------------------------------------------------- // Transposed table with new labels and corrected Foot - //-------------------------------------------------------------------------- // Segment Mass Segment X-Radius Y-Radius Z-Radius // Length Percentage CM Position Gyration Gyration Gyration // Segment F M F M F M F M F M F M // Head 200.2 203.3 6.68 6.94 58.94 59.76 33.0 36.2 31.8 31.2 35.9 37.6 // Trunk 529.3 531.9 42.57 43.46 41.51 44.86 35.7 37.2 17.1 19.1 33.9 34.7 // Upper arm 275.1 281.7 2.55 2.71 57.54 57.72 27.8 28.5 14.8 15.8 26.0 26.9 // Forearm 264.3 268.9 1.38 1.62 45.59 45.74 26.1 27.6 9.4 12.1 25.7 26.5 // Hand 78.0 86.2 0.56 0.61 74.74 79.00 53.1 62.8 33.5 40.1 45.4 51.3 // Thigh 368.5 422.2 14.78 14.16 36.12 40.95 36.9 32.9 16.2 14.9 36.4 32.9 // Shank 432.3 434.0 4.81 4.33 44.16 44.59 27.1 25.5 9.3 10.3 26.7 24.9 // Foot 228.3 258.1 1.29 1.37 40.14 44.15 13.9 12.4 29.9 25.7 27.9 24.5 //-------------------------------------------------------------------------- const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanFemaleHead ( "Head", 200.2, 6.68, 58.94, 33.0, 31.8, 35.9, 1735 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanFemaleTrunk ( "Trunk", 529.3, 42.57, 41.51, 35.7, 17.1, 33.9, 1735 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanFemaleUpperArm( "UpperArm", 275.1, 2.55, 57.54, 27.8, 14.8, 26.0, 1735 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanFemaleForeArm ( "ForeArm", 264.3, 1.38, 45.59, 26.1, 9.4, 25.7, 1735 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanFemaleHand ( "Hand", 78.0, 0.56, 74.74, 53.1, 33.5, 45.4, 1735 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanFemaleThigh ( "Thigh", 368.5, 14.78, 36.12, 36.9, 16.2, 36.4, 1735 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanFemaleShank ( "Shank", 432.3, 4.81, 44.16, 27.1, 9.3, 26.7, 1735 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanFemaleFoot ( "Foot", 228.3, 1.29, 40.14, 13.9, 29.9, 27.9, 1735 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanMaleHead ( "Head", 203.3, 6.94, 59.76, 36.2, 31.2, 37.6, 1741 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanMaleTrunk ( "Trunk", 531.9, 43.46, 44.86, 37.2, 19.1, 34.7, 1741 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanMaleUpperArm ( "UpperArm", 281.7, 2.71, 57.72, 28.5, 15.8, 26.9, 1741 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanMaleForeArm ( "ForeArm", 268.9, 1.62, 45.74, 27.6, 12.1, 26.5, 1741 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanMaleHand ( "Hand", 86.2, 0.61, 79.00, 62.8, 40.1, 51.3, 1741 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanMaleThigh ( "Thigh", 422.2, 14.16, 40.95, 32.9, 14.9, 32.9, 1741 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanMaleShank ( "Shank", 434.0, 4.33, 44.59, 25.5, 10.3, 24.9, 1741 ); const StandardBodySegmentMassProperties StandardBodySegmentMassProperties::myStandardHumanMaleFoot ( "Foot", 258.1, 1.37, 44.15, 12.4, 25.7, 24.5, 1741 ); //-------------------------------------------------------------------------- const StandardBodySegmentMassProperties* getStandardBodySegmentMassProperties( const char *segmentName, const StandardBodySegmentMassProperties *bodySegments[] ) { // Look through the list for this symbol const StandardBodySegmentMassProperties *currentElement = NULL; for( unsigned int i=0; (currentElement = bodySegments[i]) != NULL; i++ ) { bool isSameName = currentElement->isSegmentName( segmentName ); if( isSameName ) break; } // This will return NULL if the symbol was not found return currentElement; } //-------------------------------------------------------------------------- const StandardBodySegmentMassProperties* StandardBodySegmentMassProperties::getStandardHumanFemaleBodySegmentMassProperties( const char *segmentName ) { static const StandardBodySegmentMassProperties* myHumanFemaleBodySegments[] = { &myStandardHumanFemaleHead, &myStandardHumanFemaleTrunk, &myStandardHumanFemaleUpperArm, &myStandardHumanFemaleForeArm, &myStandardHumanFemaleHand, &myStandardHumanFemaleThigh, &myStandardHumanFemaleShank, &myStandardHumanFemaleFoot, NULL }; // Look through the list for this segment name return getStandardBodySegmentMassProperties( segmentName, myHumanFemaleBodySegments ); } //-------------------------------------------------------------------------- const StandardBodySegmentMassProperties* StandardBodySegmentMassProperties::getStandardHumanMaleBodySegmentMassProperties( const char *segmentName ) { static const StandardBodySegmentMassProperties* myHumanMaleBodySegments[] = { &myStandardHumanMaleHead, &myStandardHumanMaleTrunk, &myStandardHumanMaleUpperArm, &myStandardHumanMaleForeArm, &myStandardHumanMaleHand, &myStandardHumanMaleThigh, &myStandardHumanMaleShank, &myStandardHumanMaleFoot, NULL }; // Look through the list for this segment name return getStandardBodySegmentMassProperties( segmentName, myHumanMaleBodySegments ); } //-------------------------------------------------------------------------- const StandardBodySegmentMassProperties* StandardBodySegmentMassProperties::getStandardHumanBodySegmentMassProperties( bool subjectIsFemale, const char *segmentName ) { return subjectIsFemale ? getStandardHumanFemaleBodySegmentMassProperties( segmentName ) : getStandardHumanMaleBodySegmentMassProperties( segmentName ); }