00001 /* 00002 * This file is part of Micole Architecture 00003 * 00004 * Copyright (C) 2007 Micole partners 00005 * 00006 * Micole Architecture is free software: you can redistribute it 00007 * and/or modify it under the terms of the GNU Lesser General 00008 * Public License as published by the Free Software Foundation, 00009 * either version 3 of the License, or (at your option) any 00010 * later version. 00011 * 00012 * Micole Architecture is distributed in the hope that it will be 00013 * useful, * but WITHOUT ANY WARRANTY; without even the implied 00014 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00015 * PURPOSE. See the GNU Lesser General Public License for more 00016 * details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public 00019 * License along with Micole Architecture. If not, see 00020 * <http://www.gnu.org/licenses/>. 00021 */ 00022 00023 #ifndef FF3DAttractivePointForceModel_H 00024 #define FF3DAttractivePointForceModel_H 00025 #include "micolelib.h" 00026 00027 #include "FF3DForceModel.h" 00028 #include "math.h" 00029 using namespace Reachin; 00030 00034 struct MICOLELIB_API FF3DAttractivePointForceModel : FF3DForceModel 00035 { 00036 mgFloat _stiffness, _d; 00037 00038 Vec3f _stick_point; 00039 00040 00041 FF3DAttractivePointForceModel(const Vec3f &); 00042 FF3DAttractivePointForceModel(const FF3DAttractivePointForceModel &fm); 00043 00044 virtual FF3DForceModel * clone() { return new FF3DAttractivePointForceModel(*this); } 00045 00046 virtual Vec3f evaluate( const Vec3f &pos, const mgFloat &) 00047 { 00048 Vec3f diff = _stick_point - pos; 00049 Vec3f x = diff; 00050 x.normalizeSafe(); 00051 00052 mgFloat dist = diff.length(); 00053 00054 //Vec3f res = _stiffness * diff; 00055 if (diff.length() > _d) 00056 return (x *_stiffness); 00057 00058 return (_stiffness * sqrt(dist / _d) * x); 00059 } 00060 }; 00061 00062 #endif