Path: blob/devel/ElmerGUI/netgen/libsrc/stlgeom/meshstlsurface.cpp
3206 views
#include <mystdlib.h>1#include <myadt.hpp>23#include <linalg.hpp>4#include <gprim.hpp>56#include <meshing.hpp>789#include "stlgeom.hpp"101112namespace netgen13{1415static void STLFindEdges (STLGeometry & geom,16class Mesh & mesh)17{18int i, j;19double h;2021h = mparam.maxh;2223// mark edge points:24//int ngp = geom.GetNP();2526geom.RestrictLocalH(mesh, h);2728PushStatusF("Mesh Lines");2930ARRAY<STLLine*> meshlines;31ARRAY<Point3d> meshpoints;3233PrintMessage(3,"Mesh Lines");3435for (i = 1; i <= geom.GetNLines(); i++)36{37meshlines.Append(geom.GetLine(i)->Mesh(geom.GetPoints(), meshpoints, h, mesh));38SetThreadPercent(100.0 * (double)i/(double)geom.GetNLines());39}4041geom.meshpoints.SetSize(0); //testing42geom.meshlines.SetSize(0); //testing43int pim;44for (i = 1; i <= meshpoints.Size(); i++)45{46geom.meshpoints.Append(meshpoints.Get(i)); //testing4748pim = mesh.AddPoint(meshpoints.Get(i));49}50//(++++++++++++++testing51for (i = 1; i <= geom.GetNLines(); i++)52{53geom.meshlines.Append(meshlines.Get(i));54}55//++++++++++++++testing)5657PrintMessage(7,"feed with edges");5859for (i = 1; i <= meshlines.Size(); i++)60{61STLLine* line = meshlines.Get(i);62(*testout) << "store line " << i << endl;63for (j = 1; j <= line->GetNS(); j++)64{65int p1, p2;6667line->GetSeg(j, p1, p2);68int trig1, trig2, trig1b, trig2b;6970if (p1 == p2)71cout << "Add Segment, p1 == p2 == " << p1 << endl;7273// Test auf geschlossener Rand mit 2 Segmenten7475if ((j == 2) && (line->GetNS() == 2))76{77int oldp1, oldp2;78line->GetSeg (1, oldp1, oldp2);79if (oldp1 == p2 && oldp2 == p1)80{81PrintMessage(7,"MESSAGE: don't use second segment");82continue;83}84}858687//mesh point number88//p1 = geom2meshnum.Get(p1); // for unmeshed lines!!!89//p2 = geom2meshnum.Get(p2); // for unmeshed lines!!!9091//left and right trigs92trig1 = line->GetLeftTrig(j);93trig2 = line->GetRightTrig(j);94trig1b = line->GetLeftTrig(j+1);95trig2b = line->GetRightTrig(j+1);9697(*testout) << "j = " << j << ", p1 = " << p1 << ", p2 = " << p2 << endl;98(*testout) << "segm-trigs: "99<< "trig1 = " << trig1100<< ", trig1b = " << trig1b101<< ", trig2 = " << trig2102<< ", trig2b = " << trig2b << endl;103104if (trig1 <= 0 || trig2 <= 0 || trig1b <= 0 || trig2b <= 0)105{106cout << "negative trigs, "107<< ", trig1 = " << trig1108<< ", trig1b = " << trig1b109<< ", trig2 = " << trig2110<< ", trig2b = " << trig2b << endl;111}112/*113(*testout) << " trigs p1: " << trig1 << " - " << trig2 << endl;114(*testout) << " trigs p2: " << trig1b << " - " << trig2b << endl;115(*testout) << " charts p1: " << geom.GetChartNr(trig1) << " - " << geom.GetChartNr(trig2) << endl;116(*testout) << " charts p2: " << geom.GetChartNr(trig1b) << " - " << geom.GetChartNr(trig2b) << endl;117*/118Point3d hp, hp2;119Segment seg;120seg.p1 = p1;121seg.p2 = p2;122seg.si = geom.GetTriangle(trig1).GetFaceNum();123seg.edgenr = i;124125seg.epgeominfo[0].edgenr = i;126seg.epgeominfo[0].dist = line->GetDist(j);127seg.epgeominfo[1].edgenr = i;128seg.epgeominfo[1].dist = line->GetDist(j+1);129/*130(*testout) << "seg = "131<< "edgenr " << seg.epgeominfo[0].edgenr132<< " dist " << seg.epgeominfo[0].dist133<< " edgenr " << seg.epgeominfo[1].edgenr134<< " dist " << seg.epgeominfo[1].dist << endl;135*/136137seg.geominfo[0].trignum = trig1;138seg.geominfo[1].trignum = trig1b;139140/*141geom.SelectChartOfTriangle (trig1);142hp = hp2 = mesh.Point (seg.p1);143seg.geominfo[0].trignum = geom.Project (hp);144145(*testout) << "hp = " << hp2 << ", hp proj = " << hp << ", trignum = " << seg.geominfo[0].trignum << endl;146if (Dist (hp, hp2) > 1e-5 || seg.geominfo[0].trignum == 0)147{148(*testout) << "PROBLEM" << endl;149}150151geom.SelectChartOfTriangle (trig1b);152hp = hp2 = mesh.Point (seg.p2);153seg.geominfo[1].trignum = geom.Project (hp);154155(*testout) << "hp = " << hp2 << ", hp proj = " << hp << ", trignum = " << seg.geominfo[1].trignum << endl;156if (Dist (hp, hp2) > 1e-5 || seg.geominfo[1].trignum == 0)157{158(*testout) << "PROBLEM" << endl;159}160*/161162163if (Dist (mesh.Point(seg.p1), mesh.Point(seg.p2)) < 1e-10)164{165(*testout) << "ERROR: Line segment of length 0" << endl;166(*testout) << "pi1, 2 = " << seg.p1 << ", " << seg.p2 << endl;167(*testout) << "p1, 2 = " << mesh.Point(seg.p1)168<< ", " << mesh.Point(seg.p2) << endl;169throw NgException ("Line segment of length 0");170}171172mesh.AddSegment (seg);173174175Segment seg2;176seg2.p1 = p2;177seg2.p2 = p1;178seg2.si = geom.GetTriangle(trig2).GetFaceNum();179seg2.edgenr = i;180181seg2.epgeominfo[0].edgenr = i;182seg2.epgeominfo[0].dist = line->GetDist(j+1);183seg2.epgeominfo[1].edgenr = i;184seg2.epgeominfo[1].dist = line->GetDist(j);185/*186(*testout) << "seg = "187<< "edgenr " << seg2.epgeominfo[0].edgenr188<< " dist " << seg2.epgeominfo[0].dist189<< " edgenr " << seg2.epgeominfo[1].edgenr190<< " dist " << seg2.epgeominfo[1].dist << endl;191*/192193seg2.geominfo[0].trignum = trig2b;194seg2.geominfo[1].trignum = trig2;195196/*197geom.SelectChartOfTriangle (trig2);198hp = hp2 = mesh.Point (seg.p1);199seg2.geominfo[0].trignum = geom.Project (hp);200201(*testout) << "hp = " << hp2 << ", hp proj = " << hp << ", trignum = " << seg.geominfo[0].trignum << endl;202if (Dist (hp, hp2) > 1e-5 || seg2.geominfo[0].trignum == 0)203{204(*testout) << "Get GeomInfo PROBLEM" << endl;205}206207208geom.SelectChartOfTriangle (trig2b);209hp = hp2 = mesh.Point (seg.p2);210seg2.geominfo[1].trignum = geom.Project (hp);211(*testout) << "hp = " << hp2 << ", hp proj = " << hp << ", trignum = " << seg.geominfo[1].trignum << endl;212if (Dist (hp, hp2) > 1e-5 || seg2.geominfo[1].trignum == 0)213{214(*testout) << "Get GeomInfo PROBLEM" << endl;215}216*/217218mesh.AddSegment (seg2);219220221/*222// should be start triangle and end triangle223int bothtrigs1[2] = { trig1, trig1 };224meshing.AddBoundaryElement (p1, p2, sizeof (bothtrigs1), &bothtrigs1);225226int bothtrigs2[2] = { trig2, trig2 };227meshing.AddBoundaryElement (p2, p1, sizeof (bothtrigs2), &bothtrigs2);228*/229}230}231232PopStatus();233}234235236237238void STLSurfaceMeshing1 (STLGeometry & geom,239class Mesh & mesh,240int retrynr);241242int STLSurfaceMeshing (STLGeometry & geom,243class Mesh & mesh)244{245int i, j;246PrintFnStart("Do Surface Meshing");247248geom.PrepareSurfaceMeshing();249250if (mesh.GetNSeg() == 0)251STLFindEdges (geom, mesh);252253int nopen;254int outercnt = 20;255256// mesh.Save ("mesh.edges");257258for (i = 1; i <= mesh.GetNSeg(); i++)259{260const Segment & seg = mesh.LineSegment (i);261if (seg.geominfo[0].trignum <= 0 || seg.geominfo[1].trignum <= 0)262{263(*testout) << "Problem with segment " << i << ": " << seg << endl;264}265}266267268do269{270outercnt--;271if (outercnt <= 0)272return MESHING3_OUTERSTEPSEXCEEDED;273274if (multithread.terminate)275{276return MESHING3_TERMINATE;277}278279mesh.FindOpenSegments();280nopen = mesh.GetNOpenSegments();281282if (nopen)283{284int trialcnt = 0;285while (nopen && trialcnt <= 5)286{287if (multithread.terminate)288{289return MESHING3_TERMINATE;290}291trialcnt++;292STLSurfaceMeshing1 (geom, mesh, trialcnt);293294mesh.FindOpenSegments();295nopen = mesh.GetNOpenSegments();296297if (nopen)298{299geom.ClearMarkedSegs();300for (i = 1; i <= nopen; i++)301{302const Segment & seg = mesh.GetOpenSegment (i);303geom.AddMarkedSeg(mesh.Point(seg.p1),mesh.Point(seg.p2));304}305306geom.InitMarkedTrigs();307for (i = 1; i <= nopen; i++)308{309const Segment & seg = mesh.GetOpenSegment (i);310geom.SetMarkedTrig(seg.geominfo[0].trignum,1);311geom.SetMarkedTrig(seg.geominfo[1].trignum,1);312}313314MeshOptimizeSTLSurface optmesh(geom);315optmesh.SetFaceIndex (0);316optmesh.SetImproveEdges (0);317optmesh.SetMetricWeight (0);318319mesh.CalcSurfacesOfNode();320optmesh.EdgeSwapping (mesh, 0);321mesh.CalcSurfacesOfNode();322optmesh.ImproveMesh (mesh);323}324325mesh.Compress();326mesh.FindOpenSegments();327nopen = mesh.GetNOpenSegments();328329if (trialcnt <= 5 && nopen)330{331mesh.RemoveOneLayerSurfaceElements();332333if (trialcnt >= 4)334{335mesh.FindOpenSegments();336mesh.RemoveOneLayerSurfaceElements();337338mesh.FindOpenSegments ();339nopen = mesh.GetNOpenSegments();340}341}342}343344345if (multithread.terminate)346return MESHING3_TERMINATE;347348if (nopen)349{350351PrintMessage(3,"Meshing failed, trying to refine");352353mesh.FindOpenSegments ();354nopen = mesh.GetNOpenSegments();355356mesh.FindOpenSegments ();357mesh.RemoveOneLayerSurfaceElements();358mesh.FindOpenSegments ();359mesh.RemoveOneLayerSurfaceElements();360361// Open edge-segments will be refined !362INDEX_2_HASHTABLE<int> openseght (nopen+1);363for (i = 1; i <= mesh.GetNOpenSegments(); i++)364{365const Segment & seg = mesh.GetOpenSegment (i);366INDEX_2 i2(seg.p1, seg.p2);367i2.Sort();368openseght.Set (i2, 1);369}370371372mesh.FindOpenSegments ();373mesh.RemoveOneLayerSurfaceElements();374mesh.FindOpenSegments ();375mesh.RemoveOneLayerSurfaceElements();376377378INDEX_2_HASHTABLE<int> newpht(100);379380int nsegold = mesh.GetNSeg();381for (i = 1; i <= nsegold; i++)382{383Segment seg = mesh.LineSegment(i);384INDEX_2 i2(seg.p1, seg.p2);385i2.Sort();386if (openseght.Used (i2))387{388// segment will be split389PrintMessage(7,"Split segment ", int(seg.p1), "-", int(seg.p2));390391Segment nseg1, nseg2;392EdgePointGeomInfo newgi;393394const EdgePointGeomInfo & gi1 = seg.epgeominfo[0];395const EdgePointGeomInfo & gi2 = seg.epgeominfo[1];396397newgi.dist = 0.5 * (gi1.dist + gi2.dist);398newgi.edgenr = gi1.edgenr;399400int hi;401402Point3d newp;403int newpi;404405if (!newpht.Used (i2))406{407newp = geom.GetLine (gi1.edgenr)->408GetPointInDist (geom.GetPoints(), newgi.dist, hi);409newpi = mesh.AddPoint (newp);410newpht.Set (i2, newpi);411}412else413{414newpi = newpht.Get (i2);415newp = mesh.Point (newpi);416}417418nseg1 = seg;419nseg2 = seg;420nseg1.p2 = newpi;421nseg1.epgeominfo[1] = newgi;422423nseg2.p1 = newpi;424nseg2.epgeominfo[0] = newgi;425426mesh.LineSegment(i) = nseg1;427mesh.AddSegment (nseg2);428429mesh.RestrictLocalH (Center (mesh.Point(nseg1.p1),430mesh.Point(nseg1.p2)),431Dist (mesh.Point(nseg1.p1),432mesh.Point(nseg1.p2)));433mesh.RestrictLocalH (Center (mesh.Point(nseg2.p1),434mesh.Point(nseg2.p2)),435Dist (mesh.Point(nseg2.p1),436mesh.Point(nseg2.p2)));437}438}439440}441442nopen = -1;443}444445else446447{448PrintMessage(5,"mesh is closed, verifying ...");449450// no open elements, check wrong elemetns (intersecting..)451452453454PrintMessage(5,"check overlapping");455// mesh.FindOpenElements(); // would leed to locked points456if(mesh.CheckOverlappingBoundary())457{458return MESHING3_BADSURFACEMESH;459}460461462geom.InitMarkedTrigs();463464for (i = 1; i <= mesh.GetNSE(); i++)465if (mesh.SurfaceElement(i).BadElement())466{467int trig = mesh.SurfaceElement(i).PNum(1);468geom.SetMarkedTrig(trig,1);469PrintMessage(7, "overlapping element, will be removed");470}471472473474ARRAY<Point3d> refpts;475ARRAY<double> refh;476477// was commented:478479for (i = 1; i <= mesh.GetNSE(); i++)480if (mesh.SurfaceElement(i).BadElement())481{482for (j = 1; j <= 3; j++)483{484refpts.Append (mesh.Point (mesh.SurfaceElement(i).PNum(j)));485refh.Append (mesh.GetH (refpts.Last()) / 2);486}487mesh.DeleteSurfaceElement(i);488}489490// delete wrong oriented element491for (i = 1; i <= mesh.GetNSE(); i++)492{493const Element2d & el = mesh.SurfaceElement(i);494if (!el.PNum(1))495continue;496497Vec3d n = Cross (Vec3d (mesh.Point(el.PNum(1)),498mesh.Point(el.PNum(2))),499Vec3d (mesh.Point(el.PNum(1)),500mesh.Point(el.PNum(3))));501Vec3d ng = geom.GetTriangle(el.GeomInfoPi(1).trignum).Normal();502if (n * ng < 0)503{504refpts.Append (mesh.Point (mesh.SurfaceElement(i).PNum(1)));505refh.Append (mesh.GetH (refpts.Last()) / 2);506mesh.DeleteSurfaceElement(i);507}508}509// end comments510511for (i = 1; i <= refpts.Size(); i++)512mesh.RestrictLocalH (refpts.Get(i), refh.Get(i));513514mesh.RemoveOneLayerSurfaceElements();515516mesh.Compress();517518mesh.FindOpenSegments ();519nopen = mesh.GetNOpenSegments();520521/*522if (!nopen)523{524// mesh is still ok525526void STLSurfaceOptimization (STLGeometry & geom,527class Mesh & mesh,528MeshingParameters & mparam)529530}531*/532}533534}535while (nopen);536537mesh.Compress();538mesh.CalcSurfacesOfNode();539540return MESHING3_OK;541}542543544545546547548void STLSurfaceMeshing1 (STLGeometry & geom,549class Mesh & mesh,550int retrynr)551{552int i, j;553double h;554555556h = mparam.maxh;557558mesh.FindOpenSegments();559560ARRAY<int> spiralps(0);561spiralps.SetSize(0);562for (i = 1; i <= geom.GetNP(); i++)563{564if (geom.GetSpiralPoint(i)) {spiralps.Append(i);}565}566567PrintMessage(7,"NO spiralpoints = ", spiralps.Size());568//int spfound;569int sppointnum;570int spcnt = 0;571572ARRAY<int> meshsp(mesh.GetNP());573for (i = 1; i <= mesh.GetNP(); i++)574{575meshsp.Elem(i) = 0;576for (j = 1; j <= spiralps.Size(); j++)577if (Dist2(geom.GetPoint(spiralps.Get(j)), mesh.Point(i)) < 1e-20)578meshsp.Elem(i) = spiralps.Get(j);579}580581582ARRAY<int> opensegsperface(mesh.GetNFD());583for (i = 1; i <= mesh.GetNFD(); i++)584opensegsperface.Elem(i) = 0;585for (i = 1; i <= mesh.GetNOpenSegments(); i++)586{587int si = mesh.GetOpenSegment (i).si;588if (si >= 1 && si <= mesh.GetNFD())589{590opensegsperface.Elem(si)++;591}592else593{594cerr << "illegal face index" << endl;595}596}597598599double starttime = GetTime ();600601for (int fnr = 1; fnr <= mesh.GetNFD(); fnr++)602if (opensegsperface.Get(fnr))603{604if (multithread.terminate)605return;606607PrintMessage(5,"Meshing surface ", fnr, "/", mesh.GetNFD());608MeshingSTLSurface meshing (geom);609610meshing.SetStartTime (starttime);611612for (i = 1; i <= mesh.GetNP(); i++)613{614/*615spfound = 0;616for (j = 1; j <= spiralps.Size(); j++)617{618if (Dist2(geom.GetPoint(spiralps.Get(j)),mesh.Point(i)) < 1e-20)619{spfound = 1; sppointnum = spiralps.Get(j);}620}621*/622sppointnum = 0;623if (i <= meshsp.Size())624sppointnum = meshsp.Get(i);625626//spfound = 0;627if (sppointnum)628{629MultiPointGeomInfo mgi;630631int ntrigs = geom.NOTrigsPerPoint(sppointnum);632spcnt++;633634for (j = 0; j < ntrigs; j++)635{636PointGeomInfo gi;637gi.trignum = geom.TrigPerPoint(sppointnum, j+1);638mgi.AddPointGeomInfo (gi);639}640641// Einfuegen von ConePoint: Point bekommt alle642// Dreiecke (werden dann intern kopiert)643// Ein Segment zum ConePoint muss vorhanden sein !!!644645meshing.AddPoint (mesh.Point(i), i, &mgi);646647}648else649{650meshing.AddPoint (mesh.Point(i), i);651}652}653654655for (i = 1; i <= mesh.GetNOpenSegments(); i++)656{657const Segment & seg = mesh.GetOpenSegment (i);658if (seg.si == fnr)659meshing.AddBoundaryElement (seg.p1, seg.p2, seg.geominfo[0], seg.geominfo[1]);660}661662663PrintMessage(3,"start meshing, trialcnt = ", retrynr);664665/*666(*testout) << "start meshing with h = " << h << endl;667*/668meshing.GenerateMesh (mesh, h, fnr); // face index669#ifdef OPENGL670extern void Render();671Render();672#endif673}674675676mesh.CalcSurfacesOfNode();677}678679680681void STLSurfaceOptimization (STLGeometry & geom,682class Mesh & mesh,683MeshingParameters & meshparam)684{685PrintFnStart("optimize STL Surface");686687688MeshOptimizeSTLSurface optmesh(geom);689//690691int i;692/*693for (i = 1; i <= mparam.optsteps2d; i++)694{695EdgeSwapping (mesh, 1, 1);696CombineImprove (mesh, 1);697optmesh.ImproveMesh (mesh, 0, 10, 1, 1);698}699*/700701optmesh.SetFaceIndex (0);702optmesh.SetImproveEdges (0);703optmesh.SetMetricWeight (meshparam.elsizeweight);704705PrintMessage(5,"optimize string = ", meshparam.optimize2d, " elsizew = ", meshparam.elsizeweight);706707for (i = 1; i <= meshparam.optsteps2d; i++)708for (size_t j = 1; j <= strlen(meshparam.optimize2d); j++)709{710if (multithread.terminate)711break;712713//(*testout) << "optimize, before, step = " << meshparam.optimize2d[j-1] << mesh.Point (3679) << endl;714715mesh.CalcSurfacesOfNode();716switch (meshparam.optimize2d[j-1])717{718case 's':719{720optmesh.EdgeSwapping (mesh, 0);721break;722}723case 'S':724{725optmesh.EdgeSwapping (mesh, 1);726break;727}728case 'm':729{730optmesh.ImproveMesh(mesh);731break;732}733case 'c':734{735optmesh.CombineImprove (mesh);736break;737}738}739//(*testout) << "optimize, after, step = " << meshparam.optimize2d[j-1] << mesh.Point (3679) << endl;740}741742geom.surfaceoptimized = 1;743744mesh.Compress();745mesh.CalcSurfacesOfNode();746747748}749750751752MeshingSTLSurface :: MeshingSTLSurface (STLGeometry & ageom)753: Meshing2(ageom.GetBoundingBox()), geom(ageom)754{755;756}757758void MeshingSTLSurface :: DefineTransformation (const Point3d & p1, const Point3d & p2,759const PointGeomInfo * geominfo,760const PointGeomInfo * geominfo2)761{762transformationtrig = geominfo[0].trignum;763764geom.DefineTangentialPlane(p1, p2, transformationtrig);765}766767void MeshingSTLSurface :: TransformToPlain (const Point3d & locpoint, const MultiPointGeomInfo & gi,768Point2d & plainpoint, double h, int & zone)769{770int trigs[10000];771int i;772773if (gi.GetNPGI() >= 9999)774{775PrintError("In Transform to plane: increase size of trigs!!!");776}777778for (i = 1; i <= gi.GetNPGI(); i++)779trigs[i-1] = gi.GetPGI(i).trignum;780trigs[gi.GetNPGI()] = 0;781782// int trig = gi.trignum;783// (*testout) << "locpoint = " << locpoint;784785Point<2> hp2d;786geom.ToPlane (locpoint, trigs, hp2d, h, zone, 1);787plainpoint = hp2d;788789// geom.ToPlane (locpoint, NULL, plainpoint, h, zone, 1);790/*791(*testout) << " plainpoint = " << plainpoint792<< " h = " << h793<< endl;794*/795}796797/*798int MeshingSTLSurface :: ComputeLineGeoInfo (const Point3d & p1, const Point3d & p2,799int & geoinfosize, void *& geoinfo)800{801static int geomtrig[2] = { 0, 0 };802803Point3d hp;804hp = p1;805geomtrig[0] = geom.Project (hp);806807hp = p2;808geomtrig[1] = geom.Project (hp);809810geoinfosize = sizeof (geomtrig);811geoinfo = &geomtrig;812813if (geomtrig[0] == 0)814{815return 1;816}817return 0;818}819*/820821822int MeshingSTLSurface :: ComputePointGeomInfo (const Point3d & p, PointGeomInfo & gi)823{824// compute triangle of point,825// if non-unique: 0826827Point<3> hp = p;828gi.trignum = geom.Project (hp);829830if (!gi.trignum)831{832return 1;833}834835return 0;836}837838839int MeshingSTLSurface ::840ChooseChartPointGeomInfo (const MultiPointGeomInfo & mpgi,841PointGeomInfo & pgi)842{843int i;844845for (i = 1; i <= mpgi.GetNPGI(); i++)846if (geom.TrigIsInOC (mpgi.GetPGI(i).trignum, geom.meshchart))847{848pgi = mpgi.GetPGI(i);849return 0;850}851/*852for (i = 0; i < mpgi.cnt; i++)853{854// (*testout) << "d" << endl;855if (geom.TrigIsInOC (mpgi.mgi[i].trignum, geom.meshchart))856{857pgi = mpgi.mgi[i];858return 0;859}860}861*/862PrintMessage(7,"INFORM: no gi on chart");863pgi.trignum = 1;864return 1;865}866867868869int MeshingSTLSurface ::870IsLineVertexOnChart (const Point3d & p1, const Point3d & p2,871int endpoint, const PointGeomInfo & gi)872{873Vec3d baselinenormal = geom.meshtrignv;874875int lineendtrig = gi.trignum;876877878return geom.TrigIsInOC (lineendtrig, geom.meshchart);879880// Vec3d linenormal = geom.GetTriangleNormal (lineendtrig);881// return ( (baselinenormal * linenormal) > cos (30 * (M_PI/180)) );882}883884void MeshingSTLSurface ::885GetChartBoundary (ARRAY<Point2d > & points,886ARRAY<Point3d > & points3d,887ARRAY<INDEX_2> & lines, double h) const888{889points.SetSize (0);890points3d.SetSize (0);891lines.SetSize (0);892geom.GetMeshChartBoundary (points, points3d, lines, h);893}894895896897898int MeshingSTLSurface :: TransformFromPlain (Point2d & plainpoint,899Point3d & locpoint,900PointGeomInfo & gi,901double h)902{903//return 0, wenn alles OK904Point<3> hp3d;905int res = geom.FromPlane (plainpoint, hp3d, h);906locpoint = hp3d;907ComputePointGeomInfo (locpoint, gi);908return res;909}910911912int MeshingSTLSurface ::913BelongsToActiveChart (const Point3d & p,914const PointGeomInfo & gi)915{916return (geom.TrigIsInOC(gi.trignum, geom.meshchart) != 0);917}918919920921double MeshingSTLSurface :: CalcLocalH (const Point3d & p, double gh) const922{923return gh;924}925926double MeshingSTLSurface :: Area () const927{928return geom.Area();929}930931932933934935936MeshOptimizeSTLSurface :: MeshOptimizeSTLSurface (STLGeometry & ageom)937: MeshOptimize2d(), geom(ageom)938{939;940}941942943void MeshOptimizeSTLSurface :: SelectSurfaceOfPoint (const Point<3> & p,944const PointGeomInfo & gi)945{946// (*testout) << "sel char: " << gi.trignum << endl;947948geom.SelectChartOfTriangle (gi.trignum);949// geom.SelectChartOfPoint (p);950}951952953void MeshOptimizeSTLSurface :: ProjectPoint (INDEX surfind, Point<3> & p) const954{955if (!geom.Project (p))956{957PrintMessage(7,"project failed");958959if (!geom.ProjectOnWholeSurface(p))960{961PrintMessage(7, "project on whole surface failed");962}963}964965// geometry.GetSurface(surfind)->Project (p);966}967968void MeshOptimizeSTLSurface :: ProjectPoint2 (INDEX surfind, INDEX surfind2, Point<3> & p) const969{970/*971ProjectToEdge ( geometry.GetSurface(surfind),972geometry.GetSurface(surfind2), p);973*/974}975976int MeshOptimizeSTLSurface :: CalcPointGeomInfo(PointGeomInfo& gi, const Point<3> & p3) const977{978Point<3> hp = p3;979gi.trignum = geom.Project (hp);980981if (gi.trignum)982{983return 1;984}985986return 0;987988}989990void MeshOptimizeSTLSurface :: GetNormalVector(INDEX surfind, const Point<3> & p, Vec<3> & n) const991{992n = geom.GetChartNormalVector();993994/*995geometry.GetSurface(surfind)->CalcGradient (p, n);996n /= n.Length();997if (geometry.GetSurface(surfind)->Inverse())998n *= -1;999*/1000}10011002100310041005100610071008100910101011RefinementSTLGeometry :: RefinementSTLGeometry (const STLGeometry & ageom)1012: Refinement(), geom(ageom)1013{1014;1015}10161017RefinementSTLGeometry :: ~RefinementSTLGeometry ()1018{1019;1020}10211022void RefinementSTLGeometry ::1023PointBetween (const Point<3> & p1, const Point<3> & p2, double secpoint,1024int surfi,1025const PointGeomInfo & gi1,1026const PointGeomInfo & gi2,1027Point<3> & newp, PointGeomInfo & newgi)1028{1029newp = p1+secpoint*(p2-p1);10301031/*1032(*testout) << "surf-between: p1 = " << p1 << ", p2 = " << p21033<< ", gi = " << gi1 << " - " << gi2 << endl;1034*/10351036if (gi1.trignum > 0)1037{1038// ((STLGeometry&)geom).SelectChartOfTriangle (gi1.trignum);10391040Point<3> np1 = newp;1041Point<3> np2 = newp;1042((STLGeometry&)geom).SelectChartOfTriangle (gi1.trignum);1043int tn1 = geom.Project (np1);10441045((STLGeometry&)geom).SelectChartOfTriangle (gi2.trignum);1046int tn2 = geom.Project (np2);10471048newgi.trignum = tn1; //urspruengliche version1049newp = np1; //urspruengliche version10501051if (!newgi.trignum)1052{ newgi.trignum = tn2; newp = np2; }1053if (!newgi.trignum) newgi.trignum = gi1.trignum;10541055/*1056if (tn1 != 0 && tn2 != 0 && ((STLGeometry&)geom).GetAngle(tn1,tn2) < M_PI*0.05) {1057newgi.trignum = tn1;1058newp = np1;1059}1060else1061{1062newp = ((STLGeometry&)geom).PointBetween(p1, gi1.trignum, p2, gi2.trignum);1063tn1 = ((STLGeometry&)geom).Project(newp);1064newgi.trignum = tn1;10651066if (!tn1)1067{1068newp = Center (p1, p2);1069newgi.trignum = 0;10701071}1072}1073*/1074}1075else1076{1077// (*testout) << "WARNING: PointBetween got geominfo = 0" << endl;1078newp = p1+secpoint*(p2-p1);1079newgi.trignum = 0;1080}10811082// (*testout) << "newp = " << newp << ", ngi = " << newgi << endl;1083}10841085void RefinementSTLGeometry ::1086PointBetween (const Point<3> & p1, const Point<3> & p2, double secpoint,1087int surfi1, int surfi2,1088const EdgePointGeomInfo & gi1,1089const EdgePointGeomInfo & gi2,1090Point<3> & newp, EdgePointGeomInfo & newgi)1091{1092/*1093(*testout) << "edge-between: p1 = " << p1 << ", p2 = " << p21094<< ", gi1,2 = " << gi1 << ", " << gi2 << endl;1095*/1096/*1097newp = Center (p1, p2);1098((STLGeometry&)geom).SelectChartOfTriangle (gi1.trignum);1099newgi.trignum = geom.Project (newp);1100*/1101int hi;1102newgi.dist = (1.0-secpoint) * gi1.dist + secpoint*gi2.dist;1103newgi.edgenr = gi1.edgenr;11041105/*1106(*testout) << "p1 = " << p1 << ", p2 = " << p2 << endl;1107(*testout) << "refedge: " << gi1.edgenr1108<< " d1 = " << gi1.dist << ", d2 = " << gi2.dist << endl;1109*/1110newp = geom.GetLine (gi1.edgenr)->GetPointInDist (geom.GetPoints(), newgi.dist, hi);11111112// (*testout) << "newp = " << newp << endl;1113}111411151116void RefinementSTLGeometry :: ProjectToSurface (Point<3> & p, int surfi)1117{1118cout << "RefinementSTLGeometry :: ProjectToSurface not implemented!" << endl;1119};112011211122void RefinementSTLGeometry :: ProjectToSurface (Point<3> & p, int surfi,1123PointGeomInfo & gi)1124{1125((STLGeometry&)geom).SelectChartOfTriangle (gi.trignum);1126gi.trignum = geom.Project (p);1127// if (!gi.trignum)1128// cout << "projectSTL failed" << endl;1129};113011311132}113311341135