#include "GTSRetriangulator.h"
#include "GTSRetriangulator.c7"
#include <GTS/GTS.h>
#include <Gled/GTime.h>
#include <TMath.h>
#include <cmath>
namespace GTS {
gdouble cost_angle (GtsEdge * e)
{
if (e->triangles && e->triangles->next)
return fabs (gts_triangles_angle ((GtsTriangle*)e->triangles->data,
(GtsTriangle*)e->triangles->next->data));
return G_MAXDOUBLE;
}
gboolean refine_stop_number (gdouble cost, guint number, guint * max)
{
if (number > *max)
return TRUE;
return FALSE;
}
gboolean refine_stop_cost (gdouble cost, guint number, gdouble * min)
{
if (cost < *min)
return TRUE;
return FALSE;
}
}
ClassImp(GTSRetriangulator);
void GTSRetriangulator::_init()
{
mTarget = 0;
mStopOpts = SO_Number;
mStopNumber = 1000;
mStopCost = 0.5;
mCostOpts = CO_Length;
mVO_VolumeWght = 0.5;
mVO_BoundaryWght = 0.5;
mVO_ShapeWght = 0;
mMidvertOpts = MO_Midvert;
mMinAngleDeg = 1;
bMeasureTime = false;
mRunTime = 0;
}
void GTSRetriangulator::Coarsen()
{
static const Exc_t _eh("GTSRetriangulator::Coarsen ");
using namespace GTS;
GTSurf* target = *mTarget;
if(target == 0) {
throw(_eh + "Link Target should be set.");
}
if(target == 0) {
throw(_eh + "Link Target should be set.");
}
GtsSurface* s = target->CopySurface();
if(s == 0) {
throw(_eh + "Target should have non-null surface.");
}
GtsStopFunc l_stop_func = 0;
gpointer l_stop_data = 0;
switch(mStopOpts) {
case SO_Number:
l_stop_func = (GtsStopFunc)gts_coarsen_stop_number;
l_stop_data = &mStopNumber;
break;
case SO_Cost:
l_stop_func = (GtsStopFunc)gts_coarsen_stop_cost;
l_stop_data = &mStopCost;
break;
default:
throw(_eh + "Unknown StopOpts.");
}
GtsVolumeOptimizedParams l_vo_params =
{ mVO_VolumeWght, mVO_BoundaryWght, mVO_ShapeWght };
GtsKeyFunc l_cost_func = 0;
gpointer l_cost_data = 0;
switch (mCostOpts) {
case CO_Length:
break;
case CO_Volume:
l_cost_func = (GtsKeyFunc)gts_volume_optimized_cost;
l_cost_data = &l_vo_params;
break;
case CO_Angle:
l_cost_func = (GtsKeyFunc)cost_angle;
break;
default:
throw(_eh + "Unknown CostOpts.");
}
GtsCoarsenFunc l_coarsen_func = 0;
gpointer l_coarsen_data = 0;
switch (mMidvertOpts) {
case MO_Midvert:
break;
case MO_Volume:
l_coarsen_func = (GtsCoarsenFunc) gts_volume_optimized_vertex;
l_coarsen_data = &l_vo_params;
break;
default:
throw(_eh + "Unknown MidvertOpts.");
}
::GTime* start_time = 0;
if(bMeasureTime) start_time = new ::GTime(::GTime::I_Now);
gts_surface_coarsen(s,
l_cost_func, l_cost_data,
l_coarsen_func, l_coarsen_data,
l_stop_func, l_stop_data,
mMinAngleDeg*TMath::Pi()/180);
if(bMeasureTime) SetRunTime(start_time->TimeUntilNow().ToDouble());
target->WriteLock();
target->ReplaceSurface(s);
target->WriteUnlock();
}
void GTSRetriangulator::Refine()
{
static const Exc_t _eh("GTSRetriangulator::Refine ");
using namespace GTS;
GTSurf* target = *mTarget;
if(target == 0) {
throw(_eh + "Link Target should be set.");
}
if(target == 0) {
throw(_eh + "Link Target should be set.");
}
GtsSurface* s = target->CopySurface();
if(s == 0) {
throw(_eh + "Target should have non-null surface.");
}
GtsStopFunc l_stop_func = 0;
gpointer l_stop_data = 0;
switch(mStopOpts) {
case SO_Number:
l_stop_func = (GtsStopFunc)refine_stop_number;
l_stop_data = &mStopNumber;
break;
case SO_Cost:
l_stop_func = (GtsStopFunc)refine_stop_cost;
l_stop_data = &mStopCost;
break;
default:
throw(_eh + "Unknown StopOpts.");
}
GtsVolumeOptimizedParams l_vo_params =
{ mVO_VolumeWght, mVO_BoundaryWght, mVO_ShapeWght };
GtsKeyFunc l_cost_func = 0;
gpointer l_cost_data = 0;
switch (mCostOpts) {
case CO_Length:
break;
case CO_Volume:
l_cost_func = (GtsKeyFunc)gts_volume_optimized_cost;
l_cost_data = &l_vo_params;
break;
case CO_Angle:
l_cost_func = (GtsKeyFunc)cost_angle;
break;
default:
throw(_eh + "Unknown CostOpts.");
}
::GTime* start_time = 0;
if(bMeasureTime) start_time = new ::GTime(::GTime::I_Now);
gts_surface_refine(s,
l_cost_func, l_cost_data,
0, 0,
l_stop_func, l_stop_data);
if(bMeasureTime) SetRunTime(start_time->TimeUntilNow().ToDouble());
target->WriteLock();
target->ReplaceSurface(s);
target->WriteUnlock();
}
GTSRetriangulator.cxx:100 GTSRetriangulator.cxx:101 GTSRetriangulator.cxx:102 GTSRetriangulator.cxx:103 GTSRetriangulator.cxx:104 GTSRetriangulator.cxx:105 GTSRetriangulator.cxx:106 GTSRetriangulator.cxx:107 GTSRetriangulator.cxx:108 GTSRetriangulator.cxx:109 GTSRetriangulator.cxx:110 GTSRetriangulator.cxx:111 GTSRetriangulator.cxx:112 GTSRetriangulator.cxx:113 GTSRetriangulator.cxx:114 GTSRetriangulator.cxx:115 GTSRetriangulator.cxx:116 GTSRetriangulator.cxx:117 GTSRetriangulator.cxx:118 GTSRetriangulator.cxx:119 GTSRetriangulator.cxx:120 GTSRetriangulator.cxx:121 GTSRetriangulator.cxx:122 GTSRetriangulator.cxx:123 GTSRetriangulator.cxx:124 GTSRetriangulator.cxx:125 GTSRetriangulator.cxx:126 GTSRetriangulator.cxx:127 GTSRetriangulator.cxx:128 GTSRetriangulator.cxx:129 GTSRetriangulator.cxx:130 GTSRetriangulator.cxx:131 GTSRetriangulator.cxx:132 GTSRetriangulator.cxx:133 GTSRetriangulator.cxx:134 GTSRetriangulator.cxx:135 GTSRetriangulator.cxx:136 GTSRetriangulator.cxx:137 GTSRetriangulator.cxx:138 GTSRetriangulator.cxx:139 GTSRetriangulator.cxx:140 GTSRetriangulator.cxx:141 GTSRetriangulator.cxx:142 GTSRetriangulator.cxx:143 GTSRetriangulator.cxx:144 GTSRetriangulator.cxx:145 GTSRetriangulator.cxx:146 GTSRetriangulator.cxx:147 GTSRetriangulator.cxx:148 GTSRetriangulator.cxx:149 GTSRetriangulator.cxx:150 GTSRetriangulator.cxx:151 GTSRetriangulator.cxx:152 GTSRetriangulator.cxx:153 GTSRetriangulator.cxx:154 GTSRetriangulator.cxx:155 GTSRetriangulator.cxx:156 GTSRetriangulator.cxx:157 GTSRetriangulator.cxx:158 GTSRetriangulator.cxx:159 GTSRetriangulator.cxx:160 GTSRetriangulator.cxx:161 GTSRetriangulator.cxx:162 GTSRetriangulator.cxx:163 GTSRetriangulator.cxx:164 GTSRetriangulator.cxx:165 GTSRetriangulator.cxx:166 GTSRetriangulator.cxx:167 GTSRetriangulator.cxx:168 GTSRetriangulator.cxx:169 GTSRetriangulator.cxx:170 GTSRetriangulator.cxx:171 GTSRetriangulator.cxx:172 GTSRetriangulator.cxx:173 GTSRetriangulator.cxx:174 GTSRetriangulator.cxx:175 GTSRetriangulator.cxx:176 GTSRetriangulator.cxx:177 GTSRetriangulator.cxx:178 GTSRetriangulator.cxx:179 GTSRetriangulator.cxx:180 GTSRetriangulator.cxx:181 GTSRetriangulator.cxx:182 GTSRetriangulator.cxx:183 GTSRetriangulator.cxx:184 GTSRetriangulator.cxx:185 GTSRetriangulator.cxx:186 GTSRetriangulator.cxx:187 GTSRetriangulator.cxx:188 GTSRetriangulator.cxx:189 GTSRetriangulator.cxx:190 GTSRetriangulator.cxx:191 GTSRetriangulator.cxx:192 GTSRetriangulator.cxx:193 GTSRetriangulator.cxx:194 GTSRetriangulator.cxx:195 GTSRetriangulator.cxx:196 GTSRetriangulator.cxx:197 GTSRetriangulator.cxx:198 GTSRetriangulator.cxx:199 GTSRetriangulator.cxx:200 GTSRetriangulator.cxx:201 GTSRetriangulator.cxx:202 GTSRetriangulator.cxx:203 GTSRetriangulator.cxx:204 GTSRetriangulator.cxx:205 GTSRetriangulator.cxx:206 GTSRetriangulator.cxx:207 GTSRetriangulator.cxx:208 GTSRetriangulator.cxx:209 GTSRetriangulator.cxx:210 GTSRetriangulator.cxx:211 GTSRetriangulator.cxx:212 GTSRetriangulator.cxx:213 GTSRetriangulator.cxx:214 GTSRetriangulator.cxx:215 GTSRetriangulator.cxx:216 GTSRetriangulator.cxx:217 GTSRetriangulator.cxx:218 GTSRetriangulator.cxx:219 GTSRetriangulator.cxx:220 GTSRetriangulator.cxx:221 GTSRetriangulator.cxx:222 GTSRetriangulator.cxx:223 GTSRetriangulator.cxx:224 GTSRetriangulator.cxx:225 GTSRetriangulator.cxx:226 GTSRetriangulator.cxx:227 GTSRetriangulator.cxx:228 GTSRetriangulator.cxx:229 GTSRetriangulator.cxx:230