#include <string>
#include "example_common.h"
#include <iostream>
#include <math.h>
#include "example.hxx"
bool verifyResult(const std::string & objI, const std::string & objJ,
double distance, double penetration,
void Example::initializeUniverse()
{
super1-> setOrientation(-2.1,1.1,0.8);
super2-> setOrientation(2.1,1.1,-0.4);
super3-> setOrientation(2.1,1.1,-0.5);
box1-> setOrientation(-0.2,0.1,-0.4);
box2-> setOrientation(-2.1,-1.1,0.8);
box3-> setOrientation(-2.0,-1.0,1.2);
sObj.addObject(super1);
sObj.addObject(super2);
sObj.addObject(super3);
sObj.addObject(box1);
sObj.addObject(box2);
sObj.addObject(box3);
sObj.addObject(sphere1);
sObj.addObject(sphere2);
sObj.addObject(sphere3);
objName.push_back("super1");
objName.push_back("super2");
objName.push_back("super3");
objName.push_back("box1");
objName.push_back("box2");
objName.push_back("box3");
objName.push_back("sphere1");
objName.push_back("sphere2");
objName.push_back("sphere3");
}
bool Example::unittest()
{
int collisionNbr = sObj.sceneProximityQuery();
std::cout<<"The scene" << std::endl;
std::cout<<"Number of objects: " << sObj.size() << std::endl;
std::cout<<"Number of pairs: " << sObj.size()*(sObj.size()-1)/2<< std::endl;
for (unsigned i=0; i<sObj.size(); ++i)
{
std::cout <<
"Object "<<i<<
" type:"<< ptr->
getType() << std::endl;
}
std::cout<< std::endl<<"Number of collisions: "<< collisionNbr << std::endl;
bool comparison = true;
for (unsigned i=0; i<sObj.size(); ++i)
{
for (unsigned j=0; j<i; ++j)
{
std::cout << "The pair " << j <<" - "<< i <<std::endl;
double distance = sObj.getWitnessPoints(i,j,p1,p2);
std::cout << "Distance " << distance << " " << i <<std::endl;
std::cout <<"Witness points: " << std::endl;
std::cout <<" P1: "<< p1 << std::endl;
std::cout <<" P2: "<< p2 << std::endl;
std::cout <<"The distance without penetration "
comparison = verifyResult(objName[i], objName[j], distance,
&& comparison;
std::cout << std::endl;
}
}
return comparison;
}
void Example::displayScene()
{
int collisionNbr = sObj.sceneProximityQuery();
(void) collisionNbr;
for (unsigned i=0; i<sObj.size(); ++i)
{
for (unsigned j=0; j<i; ++j)
{
sObj.getWitnessPoints(i,j,p1,p2);
}
}
}
bool verifyResult(const std::string & objI, const std::string & objJ,
double distance, double penetration,
{
std::cerr.precision(14);
double dd(0);
double pd(0);
if(objJ == "super1" && objI == "super2")
{
dd = 5.4487471575136;
pd = 5.4487471575136;
dp1.Set(0.28175284289769, -0.14299067182235, 1.1716656444909);
dp2.Set(-1.7636106455221, -1.2250286690872, 1.4789588761567);
}
else if(objJ == "super1" && objI == "super3")
{
dd = 0.30421039852355;
pd = 0.30421039852355;
dp1.Set(0.96363716178523, 0.46511130288262, -0.52236418422971);
dp2.Set(0.98382992853513, 0.57131577169444, -1.0632183803851);
}
else if(objJ == "super2" && objI == "super3")
{
dd = 9.9181149823984;
pd = 9.9181149823984;
dp1.Set(-2.2982641001418, -0.53893477159955, 1.0585206046519);
dp2.Set(-0.63840167210456, -0.44938462670065, -1.6163536865882);
}
else if(objJ == "super1" && objI == "box1")
{
dd = 0.55758708510798;
pd = 0.55758708510798;
dp1.Set(0.61084807024591, 0.29440863418974, 0.069803781161034);
dp2.Set(-0.056687617849561, 0.13575086229484, -0.22483311680702);
}
else if(objJ == "super2" && objI == "box1")
{
dd = 5.9443143905268;
pd = 5.9443143905268;
dp1.Set(-2.1732498476818, -0.63004749575528, 1.1490992568704);
dp2.Set(-0.27631829569933, 0.12220296114932, -0.18509875231225);
}
else if(objJ == "super3" && objI == "box1")
{
dd = 0.51584655618165;
pd = 0.51584655618165;
dp1.Set(0.12785132793314, 0.015765330308717, -1.2847741886342);
dp2.Set(-0.12368170430067, 0.077797038850676, -0.61490124768775);
}
else if(objJ == "super1" && objI == "box2")
{
dd = 2.78972586142;
pd = 2.78972586142;
dp1.Set(0.27677566692662, -0.13314609360976, 1.1658328403376);
dp2.Set(-1.2995880118717, -0.57154615294118, 1.5014051895616);
}
else if(objJ == "super2" && objI == "box2")
{
pd = 0;
#ifdef SCH_BUILD_BSD
dd = 0;
dp1.Set(-2.4382016429023, -0.34453137974329, 1.0149926815109);
dp2.Set(-2.8034902987202, -1.9213950463338, 0.1711823973004);
#else
dd = -0.31718567003746;
dp1.Set(-1.787265308154, -1.1960497354292, 1.4450521781144);
dp2.Set(-2.2686354608106, -1.3706878827971, 1.6795089196526);
#endif
}
else if(objJ == "super3" && objI == "box2")
{
dd = 3.440763819841;
pd = 3.440763819841;
dp1.Set(-0.83748878593566, -0.54621539306324, -1.7742688055859);
dp2.Set(-2.060158969655, -0.96192382874358, -0.44271785342942);
}
else if(objJ == "box1" && objI == "box2")
{
dd = 3.1102603339576;
pd = 3.1102603339576;
dp1.Set(-0.27631829569933, 0.12220296114932, -0.18509875231225);
dp2.Set(-1.6979671687682, -0.58899718550305, 0.57868732183491);
}
else if(objJ == "super1" && objI == "box3")
{
dd = 0.14762346168417;
pd = 0.14762346168417;
dp1.Set(0.29961124339566, 0.014926401743127, 0.97819026233414);
dp2.Set(-0.067084392233482, 0.11181124267447, 0.91678097889576);
}
else if(objJ == "super2" && objI == "box3")
{
pd = 0;
#ifdef SCH_BUILD_BSD
dd = 0;
dp1.Set(-1.9129702551419, -1.8621316732081, 1.5487339817517);
dp2.Set(-3.6588197853564, -1.4067952284442, 2.6612783998353);
#else
dd = -0.88486848336054;
dp1.Set(-1.8258028062901, -1.2035457346373, 1.5672994449862);
dp2.Set(-2.0099706249296, -1.6772532880947, 0.77574916121672);
#endif
}
else if(objJ == "super3" && objI == "box3")
{
dd = 1.2943618702035;
pd = 1.2943618702035;
dp1.Set(-0.2536866871953, -0.23957739656524, -1.4216076267573);
dp2.Set(-0.65088388966599, -0.31132657081448, -0.35791203658708);
}
else if(objJ == "box1" && objI == "box3")
{
dd = 0.16648542041871;
pd = 0.16648542041871;
dp1.Set(-0.27631829569933, 0.12220296114932, -0.18509875231225);
dp2.Set(-0.54770561715496, -0.10725192694837, 0.015362706576795);
}
else if(objJ == "box2" && objI == "box3")
{
pd = 0;
#ifdef SCH_BUILD_BSD
dd = 0;
dp1.Set(-2.060158969655, -0.96192382874358, -0.44271785342942);
dp2.Set(-2.7940854586392, -2.1938370874621, 2.9310925142747);
#else
dd = -1.7306786763394;
dp1.Set(-1.1518981590561, -1.0179317129611, 1.6120145906702);
dp2.Set(-2.0999010779384, -0.15510256812534, 1.3162190380463);
#endif
}
else if(objJ == "super1" && objI == "sphere1")
{
dd = 5.3186326388713;
pd = 5.3186326388713;
dp1.Set(0.3354800425203, 0.22033997371372, 1.0949514789063);
dp2.Set(-1.8196178883092, 0.99878520299519, 0.83378376954228);
}
else if(objJ == "super2" && objI == "sphere1")
{
dd = 1.4183711535435;
pd = 1.4183711535435;
dp1.Set(-2.4779023328493, -0.32669997190278, 1.0113296028496);
dp2.Set(-2.1762353652203, 0.8129674455965, 0.84243208458626);
}
else if(objJ == "super3" && objI == "sphere1")
{
dd = 7.4743489107843;
pd = 7.4743489107843;
dp1.Set(-0.53702693775031, 0.31921777729824, -1.6803624586656);
dp2.Set(-1.9453484492689, 1.0228264075222, 0.55479174774896);
}
else if(objJ == "box1" && objI == "sphere1")
{
dd = 3.9663117059915;
pd = 3.9663117059915;
dp1.Set(-0.26442597555482, 0.15199775567757, -0.19156797444484);
dp2.Set(-1.8596364794099, 0.9758575176791, 0.6703312348231);
}
else if(objJ == "box2" && objI == "sphere1")
{
dd = 1.7772851599536;
pd = 1.7772851599536;
dp1.Set(-1.6006569697181, -0.40929377232158, 1.1739828310352);
dp2.Set(-2.0082863828167, 0.82274676021845, 0.86869682135086);
}
else if(objJ == "box3" && objI == "sphere1")
{
dd = 0.40873492947483;
pd = 0.40873492947483;
dp1.Set(-1.4233798793513, 0.48324374143217, 1.0100607143038);
dp2.Set(-1.883840797678, 0.90317898477367, 0.86735450011444);
}
else if(objJ == "super1" && objI == "sphere2")
{
dd = 0.039104898627535;
pd = 0.039104898627535;
dp1.Set(1.6781720909763, 0.57648753892597, -0.21331741131897);
dp2.Set(1.7976914901379, 0.7248905617555, -0.26619987217934);
}
else if(objJ == "super2" && objI == "sphere2")
{
dd = 18.906059441351;
pd = 18.906059441351;
dp1.Set(-2.0166352552171, -0.84324192220842, 1.2677212945354);
dp2.Set(1.6754467644156, 0.89957633685848, -0.22799736802078);
}
else if(objJ == "super3" && objI == "sphere2")
{
dd = 0.096550440397139;
pd = 0.096550440397139;
dp1.Set(1.6697745078346, 1.1266310160472, -1.0866387839319);
dp2.Set(1.8346899699717, 1.116376050407, -0.82348832046098);
}
else if(objJ == "box1" && objI == "sphere2")
{
dd = 3.4928506703209;
pd = 3.4928506703209;
dp1.Set(-0.056687617849561, 0.13575086229484, -0.22483311680702);
dp2.Set(1.6443705367279, 0.89739891750289, -0.3631951963815);
}
else if(objJ == "box2" && objI == "sphere2")
{
dd = 13.535796551098;
pd = 13.535796551098;
dp1.Set(-1.4206285779347, -0.3034386790228, 1.3608007525762);
dp2.Set(1.679309305274, 0.93099892363515, -0.18914940032874);
}
else if(objJ == "box3" && objI == "sphere2")
{
dd = 4.9068928394991;
pd = 4.9068928394991;
dp1.Set(-0.10352367186681, 0.018083890456479, 0.76016554875608);
dp2.Set(1.6940746685943, 0.90096107279478, -0.18643939882083);
}
else if(objJ == "sphere1" && objI == "sphere2")
{
dd = 12.731096153983;
pd = 12.731096153983;
dp1.Set(-1.8114862908327, 1.1, 0.71778175614537);
dp2.Set(1.6191438180545, 1.1, -0.26296959357561);
}
else if(objJ == "super1" && objI == "sphere3")
{
dd = 0.43645502641181;
pd = 0.43645502641181;
dp1.Set(1.6912459612619, 0.567053610651, -0.20657129901502);
dp2.Set(2.158681625653, 0.97605586976899, -0.43168477729525);
}
else if(objJ == "super2" && objI == "sphere3")
{
dd = 23.550195655262;
pd = 23.550195655262;
dp1.Set(-1.9924580739264, -0.87944172212693, 1.2854835093993);
dp2.Set(2.1300977188898, 1.0216519471083, -0.42932617426062);
}
else if(objJ == "super3" && objI == "sphere3")
{
dd = 0.42972022695158;
pd = 0.42972022695158;
dp1.Set(1.7058063536863, 1.1636066171891, -1.112225860713);
dp2.Set(2.1610693162235, 1.1148044581997, -0.64310518202643);
}
else if(objJ == "box1" && objI == "sphere3")
{
dd = 5.5750152536297;
pd = 5.5750152536297;
dp1.Set(-0.056687617849561, 0.13575086229484, -0.22483311680702);
dp2.Set(2.1157485332466, 1.0251955369043, -0.47865311966162);
}
else if(objJ == "box2" && objI == "sphere3")
{
dd = 17.558511336885;
pd = 17.558511336885;
dp1.Set(-1.4288100961977, -0.31186268568159, 1.3377283222371);
dp2.Set(2.130156805579, 1.0356334715405, -0.41627282805178);
}
else if(objJ == "box3" && objI == "sphere3")
{
dd = 7.4049800506603;
pd = 7.4049800506603;
dp1.Set(-0.11233115341526, -0.0045702874952087, 0.72231113656579);
dp2.Set(2.1346488277106, 1.0246599452678, -0.41643648386935);
}
else if(objJ == "sphere1" && objI == "sphere3")
{
dd = 16.711972710807;
pd = 16.711972710807;
dp1.Set(-1.8123385444469, 1.1, 0.71484785975054);
dp2.Set(2.1082256962979, 1.1, -0.44323190650036);
}
else if(objJ == "sphere2" && objI == "sphere3")
{
pd = 0;
#ifdef SCH_BUILD_BSD
dd = 0;
dp1.Set(2.1492688089833, 1.1, -0.89756666333404);
dp2.Set(2.2802924764067, 1.1, -0.30097333466639);
#else
dd = -0.22676975704217;
dp1.Set(2.5376620746762, 1.098724063024, -0.64109671750724);
dp2.Set(2.1249351701295, 1.1005103747904, -0.40356131299711);
#endif
}
bool res = true;
double epsilon = 1e-6;
double pepsilon = epsilon;
#if defined __i386__ || defined __aarch64__
epsilon = 1e-4;
pepsilon = 1e-1;
#endif
res = compare(distance, dd, "distance ("+objI +", "+objJ+"): ", epsilon) && res;
res = compare(penetration, pd, "penetration ("+objI +", "+objJ+"): ", epsilon) && res;
res = compare(p1, dp1, "p1 ("+objI +", "+objJ+"): ", pepsilon) && res;
res = compare(p2, dp2, "p2 ("+objI +", "+objJ+"): ", pepsilon) && res;
return res;
}