ROOT logo
// $Id: GTSRetriangulator.cxx 2204 2009-05-17 18:01:48Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

//__________________________________________________________________________
// GTSRetriangulator
//
// Interface to GTS surface 'coarsen' and 'refine' functions.
// See GTS manual for details.
// Refine always uses the mid-vertex insertion function.

#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:1
 GTSRetriangulator.cxx:2
 GTSRetriangulator.cxx:3
 GTSRetriangulator.cxx:4
 GTSRetriangulator.cxx:5
 GTSRetriangulator.cxx:6
 GTSRetriangulator.cxx:7
 GTSRetriangulator.cxx:8
 GTSRetriangulator.cxx:9
 GTSRetriangulator.cxx:10
 GTSRetriangulator.cxx:11
 GTSRetriangulator.cxx:12
 GTSRetriangulator.cxx:13
 GTSRetriangulator.cxx:14
 GTSRetriangulator.cxx:15
 GTSRetriangulator.cxx:16
 GTSRetriangulator.cxx:17
 GTSRetriangulator.cxx:18
 GTSRetriangulator.cxx:19
 GTSRetriangulator.cxx:20
 GTSRetriangulator.cxx:21
 GTSRetriangulator.cxx:22
 GTSRetriangulator.cxx:23
 GTSRetriangulator.cxx:24
 GTSRetriangulator.cxx:25
 GTSRetriangulator.cxx:26
 GTSRetriangulator.cxx:27
 GTSRetriangulator.cxx:28
 GTSRetriangulator.cxx:29
 GTSRetriangulator.cxx:30
 GTSRetriangulator.cxx:31
 GTSRetriangulator.cxx:32
 GTSRetriangulator.cxx:33
 GTSRetriangulator.cxx:34
 GTSRetriangulator.cxx:35
 GTSRetriangulator.cxx:36
 GTSRetriangulator.cxx:37
 GTSRetriangulator.cxx:38
 GTSRetriangulator.cxx:39
 GTSRetriangulator.cxx:40
 GTSRetriangulator.cxx:41
 GTSRetriangulator.cxx:42
 GTSRetriangulator.cxx:43
 GTSRetriangulator.cxx:44
 GTSRetriangulator.cxx:45
 GTSRetriangulator.cxx:46
 GTSRetriangulator.cxx:47
 GTSRetriangulator.cxx:48
 GTSRetriangulator.cxx:49
 GTSRetriangulator.cxx:50
 GTSRetriangulator.cxx:51
 GTSRetriangulator.cxx:52
 GTSRetriangulator.cxx:53
 GTSRetriangulator.cxx:54
 GTSRetriangulator.cxx:55
 GTSRetriangulator.cxx:56
 GTSRetriangulator.cxx:57
 GTSRetriangulator.cxx:58
 GTSRetriangulator.cxx:59
 GTSRetriangulator.cxx:60
 GTSRetriangulator.cxx:61
 GTSRetriangulator.cxx:62
 GTSRetriangulator.cxx:63
 GTSRetriangulator.cxx:64
 GTSRetriangulator.cxx:65
 GTSRetriangulator.cxx:66
 GTSRetriangulator.cxx:67
 GTSRetriangulator.cxx:68
 GTSRetriangulator.cxx:69
 GTSRetriangulator.cxx:70
 GTSRetriangulator.cxx:71
 GTSRetriangulator.cxx:72
 GTSRetriangulator.cxx:73
 GTSRetriangulator.cxx:74
 GTSRetriangulator.cxx:75
 GTSRetriangulator.cxx:76
 GTSRetriangulator.cxx:77
 GTSRetriangulator.cxx:78
 GTSRetriangulator.cxx:79
 GTSRetriangulator.cxx:80
 GTSRetriangulator.cxx:81
 GTSRetriangulator.cxx:82
 GTSRetriangulator.cxx:83
 GTSRetriangulator.cxx:84
 GTSRetriangulator.cxx:85
 GTSRetriangulator.cxx:86
 GTSRetriangulator.cxx:87
 GTSRetriangulator.cxx:88
 GTSRetriangulator.cxx:89
 GTSRetriangulator.cxx:90
 GTSRetriangulator.cxx:91
 GTSRetriangulator.cxx:92
 GTSRetriangulator.cxx:93
 GTSRetriangulator.cxx:94
 GTSRetriangulator.cxx:95
 GTSRetriangulator.cxx:96
 GTSRetriangulator.cxx:97
 GTSRetriangulator.cxx:98
 GTSRetriangulator.cxx:99
 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