11 #include "boost/algorithm/string/predicate.hpp" 13 #include "../../common/Exception.h" 14 #include "../../common/progress/TaskProgress.h" 15 #include "../../core/translator/Translator.h" 17 #include "../../dataaccess/utils/Utils.h" 19 #include "../../datatype/Property.h" 20 #include "../../datatype/SimpleProperty.h" 21 #include "../../datatype/StringProperty.h" 23 #include "../../geometry/GeometryProperty.h" 24 #include "../../geometry/Line.h" 25 #include "../../geometry/MultiPolygon.h" 27 #include "../../memory/DataSet.h" 28 #include "../../memory/DataSetItem.h" 30 #include "../../raster/Grid.h" 31 #include "../../raster/Utils.h" 33 #include "../../vp/Utils.h" 129 if ((this->m_point.getX() == rhs.
m_point.
getX()) &&
156 if (std::find(m_edge.begin(), m_edge.end(), edge) == m_edge.end()) {
157 m_edge.push_back(edge);
165 std::vector<int32_t>::iterator it = std::find(m_edge.begin(), m_edge.end(), edge);
166 if (it != m_edge.end())
184 if (m_env.getWidth())
198 for (i = static_cast<int32_t>(m_lline - 1); i >= 0; i--)
200 if ((v = m_line[static_cast<unsigned int>(i)].
getNodeFrom()) != -1)
206 double tol = m_env.getWidth() / 1000000.;
207 double px = ptr1.
getX();
208 double py = ptr1.
getY();
213 te::gm::Point ptr2 = m_node[
static_cast<unsigned int>(v)].getNPoint();
219 std::vector<int32_t> aam;
220 if (!NodeOppositeLines(v, aam))
224 int32_t vaux =
static_cast<int32_t
>(v);
227 std::vector<int32_t> vvn;
228 if (!NodeNodes(v, vvn))
236 for (iiv = 0; iiv < vvn.size(); iiv++)
239 if ((fabs(px - m_node[static_cast<unsigned int>(vi)].getX()) < tol) && (fabs(py - m_node[static_cast<unsigned int>(vi)].getY()) < tol))
242 return NodeTriangle(vi);
249 ((fabs(m_node[static_cast<unsigned int>(vaux)].getX() - m_node[static_cast<unsigned int>(vi)].getX()) < tol) &&
250 (fabs(m_node[static_cast<unsigned int>(vaux)].getY() - m_node[static_cast<unsigned int>(vi)].getY()) < tol)))
253 te::gm::Point ptvi = m_node[
static_cast<unsigned int>(vi)].getNPoint();
264 if (iiv != vvn.size())
269 for (iia = 0; iia < aam.size(); iia++)
271 int32_t ai = aam[iia];
274 te::gm::Point lfr = m_node[
static_cast<unsigned int>(m_line[
static_cast<unsigned int>(ai)].
getNodeFrom())].getNPoint();
275 te::gm::Point lto = m_node[
static_cast<unsigned int>(m_line[
static_cast<unsigned int>(ai)].
getNodeTo())].getNPoint();
279 int32_t taux = m_line[
static_cast<unsigned int>(ai)].
getLeftPolygon();
284 if (OppositeNode(taux, ai) == vaux)
297 if (!m_triang[static_cast<unsigned int>(t)].LinesId(lidsaux))
300 for (
unsigned int j = 0; j < 3; j++)
302 if (lidsaux[j] == aaux)
315 if (ContainsPoint(t, ptr1))
323 if (!m_triang[static_cast<unsigned int>(t)].LinesId(lids))
326 for (
unsigned int j = 0; j < 3; j++)
330 if (std::find(aam.begin(), aam.end(), lids[j]) == aam.end())
331 aam.push_back(lids[j]);
338 int32_t v1 = OppositeNode(t, ai);
341 if ((fabs(ptr2.
getX() - m_node[
static_cast<unsigned int>(v1)].getX()) < tol) && (fabs(ptr2.
getY() - m_node[
static_cast<unsigned int>(v1)].getY()) < tol))
359 for (i = i - 1; i >= 0; i--)
361 if (m_line[static_cast<unsigned int>(i)].getNodeFrom() != -1)
363 v = m_line[
static_cast<unsigned int>(i)].
getNodeFrom();
371 if (iia != aam.size())
375 std::vector<int32_t> ttk;
376 if (!NodeTriangles(v, ttk))
380 for (
size_t iit = 0; iit < ttk.size(); iit++)
382 int32_t ti = ttk[iit];
385 if (ContainsPoint(ti, ptr1))
388 for (i = i - 1; i >= 0; i--)
390 if ((v = m_line[static_cast<unsigned int>(i)].
getNodeFrom()) != -1)
406 if (!m_triang[static_cast<unsigned int>(triangId)].LinesId(linesid))
408 if (m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo() == m_line[static_cast<unsigned int>(linesid[1])].
getNodeTo())
410 vertex[0].
setX(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom())].getX());
411 vertex[0].
setY(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom())].getY());
412 vertex[0].
setZ(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom())].getZ());
413 vertex[1].
setX(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo())].getX());
414 vertex[1].
setY(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo())].getY());
415 vertex[1].
setZ(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo())].getZ());
416 vertex[2].
setX(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[1])].
getNodeFrom())].getX());
417 vertex[2].
setY(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[1])].
getNodeFrom())].getY());
418 vertex[2].
setZ(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[1])].
getNodeFrom())].getZ());
420 else if (m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo() == m_line[static_cast<unsigned int>(linesid[1])].
getNodeFrom())
422 vertex[0].
setX(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom())].getX());
423 vertex[0].
setY(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom())].getY());
424 vertex[0].
setZ(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom())].getZ());
425 vertex[1].
setX(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo())].getX());
426 vertex[1].
setY(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo())].getY());
427 vertex[1].
setZ(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo())].getZ());
428 vertex[2].
setX(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[1])].
getNodeTo())].getX());
429 vertex[2].
setY(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[1])].
getNodeTo())].getY());
430 vertex[2].
setZ(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[1])].
getNodeTo())].getZ());
432 else if (m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom() == m_line[static_cast<unsigned int>(linesid[1])].
getNodeFrom())
434 vertex[0].
setX(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo())].getX());
435 vertex[0].
setY(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo())].getY());
436 vertex[0].
setZ(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo())].getZ());
437 vertex[1].
setX(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom())].getX());
438 vertex[1].
setY(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom())].getY());
439 vertex[1].
setZ(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom())].getZ());
440 vertex[2].
setX(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[1])].
getNodeTo())].getX());
441 vertex[2].
setY(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[1])].
getNodeTo())].getY());
442 vertex[2].
setZ(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[1])].
getNodeTo())].getZ());
444 else if (m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom() == m_line[static_cast<unsigned int>(linesid[1])].
getNodeTo())
446 vertex[0].
setX(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo())].getX());
447 vertex[0].
setY(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo())].getY());
448 vertex[0].
setZ(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo())].getZ());
449 vertex[1].
setX(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom())].getX());
450 vertex[1].
setY(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom())].getY());
451 vertex[1].
setZ(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom())].getZ());
452 vertex[2].
setX(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[1])].
getNodeFrom())].getX());
453 vertex[2].
setY(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[1])].
getNodeFrom())].getY());
454 vertex[2].
setZ(m_node[static_cast<unsigned int>(m_line[static_cast<unsigned int>(linesid[1])].
getNodeFrom())].getZ());
463 double totalArea, triangleArea;
468 TrianglePoints(triangId, vert);
471 triangleArea = fabs(((vert[1].getX() - vert[0].getX()) * (vert[2].getY() - vert[0].getY())) -
472 ((vert[2].getX() - vert[0].getX()) * (vert[1].getY() - vert[0].getY())));
473 triangleArea *= 1.00001;
474 totalArea = fabs(((vert[0].getX() - pt.
getX()) * (vert[1].getY() - pt.
getY())) -
475 ((vert[1].
getX() - pt.
getX()) * (vert[0].getY() - pt.
getY())));
476 if (totalArea > triangleArea)
479 totalArea += fabs(((vert[1].getX() - pt.
getX()) * (vert[2].getY() - pt.
getY())) -
480 ((vert[2].
getX() - pt.
getX()) * (vert[1].getY() - pt.
getY())));
481 if (totalArea > triangleArea)
484 totalArea += fabs(((vert[0].getX() - pt.
getX()) * (vert[2].getY() - pt.
getY())) -
485 ((vert[2].
getX() - pt.
getX()) * (vert[0].getY() - pt.
getY())));
486 if (totalArea > triangleArea)
494 int32_t
td,
te, taux, ti;
500 std::vector<int32_t> a;
507 for (
size_t i = 0; i < a.size(); i++)
509 if (a[i] == -1)
continue;
523 ao = OppositeEdge(ti, v);
527 if (std::find(linids.begin(), linids.end(), ao) == linids.end())
528 linids.push_back(ao);
549 ao = OppositeEdge(ti, v);
553 if (std::find(linids.begin(), linids.end(), ao) == linids.end())
554 linids.push_back(ao);
564 if (!m_triang[static_cast<unsigned int>(ti)].LinesId(lids))
568 for (j = 0; j < 3; j++)
572 if ((m_line[static_cast<unsigned int>(lids[j])].
getNodeFrom() == v) ||
573 (m_line[static_cast<unsigned int>(lids[j])].
getNodeTo() == v))
586 else if (m_line[static_cast<unsigned int>(aaux)].
getLeftPolygon() == ti)
600 ao = OppositeEdge(ti, v);
604 if (std::find(linids.begin(), linids.end(), ao) == linids.end())
605 linids.push_back(ao);
624 if (!m_triang[static_cast<unsigned int>(triangId)].LinesId(lids))
627 for (j = 0; j < 3; j++)
629 if ((m_line[static_cast<unsigned int>(lids[j])].
getNodeFrom() != nodeId) &&
630 (m_line[static_cast<unsigned int>(lids[j])].
getNodeTo() != nodeId))
643 std::vector<int32_t> linid = m_node[
static_cast<unsigned int>(nid)].getEdge();
646 for (
unsigned int i = 0; i < linid.size(); i++)
648 if ((m_line[static_cast<unsigned int>(linid[i])].
getNodeTo() != nid) &&
649 (m_line[
static_cast<unsigned int>(linid[i])].
getNodeFrom() != nid))
650 linid.erase(linid.begin()+i);
655 static int32_t oldtri = 1;
656 int32_t j, k, lids[3];
660 if ((oldtri < 0) || (oldtri >= m_ltriang))
664 for (i = 0; i < static_cast<unsigned int>(m_ltriang); i++)
666 if (!m_triang[i].LinesId(lids))
668 for (m = 0; m < 3; m++)
670 if ((m_line[static_cast<unsigned int>(lids[m])].getNodeFrom() == nid) ||
671 (m_line[static_cast<unsigned int>(lids[m])].getNodeTo() == nid))
673 oldtri =
static_cast<int32_t
>(i);
674 if (m_node[static_cast<unsigned int>(nid)].setEdge(lids[m]))
675 linid.push_back(lids[m]);
684 while ((j > 0) || (k < m_ltriang))
688 if (!m_triang[static_cast<unsigned int>(j)].LinesId(lids))
690 for (m = 0; m < 3; m++)
692 if ((m_line[static_cast<unsigned int>(lids[m])].
getNodeFrom() == nid) ||
693 (m_line[static_cast<unsigned int>(lids[m])].
getNodeTo() == nid))
696 if (m_node[static_cast<unsigned int>(nid)].setEdge(lids[m]))
697 linid.push_back(lids[m]);
704 if (!m_triang[static_cast<unsigned int>(k)].LinesId(lids))
706 for (m = 0; m < 3; m++)
708 if ((m_line[static_cast<unsigned int>(lids[m])].
getNodeFrom() == nid) ||
709 (m_line[static_cast<unsigned int>(lids[m])].
getNodeTo() == nid))
712 if (m_node[static_cast<unsigned int>(nid)].setEdge(lids[m]))
713 linid.push_back(lids[m]);
726 static int32_t oldtri = 1;
727 int32_t i, j, k, lids[3];
730 if ((oldtri < 0) || (oldtri >= m_ltriang))
734 for (i = 0; i < m_ltriang; i++)
736 if (!m_triang[static_cast<unsigned int>(i)].LinesId(lids))
739 for (m = 0; m < 3; m++)
741 if ((m_line[static_cast<unsigned int>(lids[m])].
getNodeFrom() == fnid) &&
742 (m_line[static_cast<unsigned int>(lids[m])].
getNodeTo() == snid))
747 if ((m_line[static_cast<unsigned int>(lids[m])].
getNodeTo() == fnid) &&
748 (m_line[static_cast<unsigned int>(lids[m])].
getNodeFrom() == snid))
759 while ((j > 0) || (k < m_ltriang))
763 if (!m_triang[static_cast<unsigned int>(j)].LinesId(lids))
766 for (m = 0; m < 3; m++)
768 if ((m_line[static_cast<unsigned int>(lids[m])].
getNodeFrom() == fnid) &&
769 (m_line[static_cast<unsigned int>(lids[m])].
getNodeTo() == snid))
774 if ((m_line[static_cast<unsigned int>(lids[m])].
getNodeTo() == fnid) &&
775 (m_line[static_cast<unsigned int>(lids[m])].
getNodeFrom() == snid))
785 if (!m_triang[static_cast<unsigned int>(k)].LinesId(lids))
788 for (m = 0; m < 3; m++)
790 if ((m_line[static_cast<unsigned int>(lids[m])].
getNodeFrom() == fnid) &&
791 (m_line[static_cast<unsigned int>(lids[m])].
getNodeTo() == snid))
796 if ((m_line[static_cast<unsigned int>(lids[m])].
getNodeTo() == fnid) &&
797 (m_line[static_cast<unsigned int>(lids[m])].
getNodeFrom() == snid))
812 int32_t
td,
te, ti, taux = 0;
817 std::vector<int32_t> a;
824 for (
size_t i = 0; i < a.size(); i++)
836 if (std::find(linids.begin(), linids.end(), ai) == linids.end())
837 linids.push_back(ai);
859 if (!m_triang[static_cast<unsigned int>(ti)].LinesId(lids))
861 for (j = 0; j < 3; j++)
865 if ((m_line[static_cast<unsigned int>(lids[j])].
getNodeFrom() == v) ||
866 (m_line[static_cast<unsigned int>(lids[j])].
getNodeTo() == v))
878 else if (m_line[static_cast<unsigned int>(aaux)].
getLeftPolygon() == ti)
889 if (std::find(linids.begin(), linids.end(), ai) == linids.end())
890 linids.push_back(ai);
906 if (!NodesId(triangId, nodeids))
910 return nodeids[
static_cast<unsigned int>(vertex)];
919 if (!m_triang[static_cast<unsigned int>(triangId)].LinesId(linesid))
921 if (m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo() == m_line[static_cast<unsigned int>(linesid[1])].
getNodeTo())
923 nodeIds[0] = m_line[
static_cast<unsigned int>(linesid[0])].
getNodeFrom();
924 nodeIds[1] = m_line[
static_cast<unsigned int>(linesid[0])].
getNodeTo();
925 nodeIds[2] = m_line[
static_cast<unsigned int>(linesid[1])].
getNodeFrom();
927 else if (m_line[static_cast<unsigned int>(linesid[0])].
getNodeTo() == m_line[static_cast<unsigned int>(linesid[1])].
getNodeFrom())
929 nodeIds[0] = m_line[
static_cast<unsigned int>(linesid[0])].
getNodeFrom();
930 nodeIds[1] = m_line[
static_cast<unsigned int>(linesid[0])].
getNodeTo();
931 nodeIds[2] = m_line[
static_cast<unsigned int>(linesid[1])].
getNodeTo();
933 else if (m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom() == m_line[static_cast<unsigned int>(linesid[1])].
getNodeFrom())
935 nodeIds[0] = m_line[
static_cast<unsigned int>(linesid[0])].
getNodeTo();
936 nodeIds[1] = m_line[
static_cast<unsigned int>(linesid[0])].
getNodeFrom();
937 nodeIds[2] = m_line[
static_cast<unsigned int>(linesid[1])].
getNodeTo();
939 else if (m_line[static_cast<unsigned int>(linesid[0])].
getNodeFrom() == m_line[static_cast<unsigned int>(linesid[1])].
getNodeTo())
941 nodeIds[0] = m_line[
static_cast<unsigned int>(linesid[0])].
getNodeTo();
942 nodeIds[1] = m_line[
static_cast<unsigned int>(linesid[0])].
getNodeFrom();
943 nodeIds[2] = m_line[
static_cast<unsigned int>(linesid[1])].
getNodeFrom();
958 if (!m_triang[static_cast<unsigned int>(triangId)].LinesId(linesid))
960 for (i = 0; i < 3; i++)
962 if (linesid[i] < 0 || linesid[i] > static_cast<int32_t>(m_linesize))
964 if (m_line[static_cast<unsigned int>(linesid[i])].
getLeftPolygon() == triangId)
965 neighsId[i] = m_line[
static_cast<unsigned int>(linesid[i])].
getRightPolygon();
966 else if (m_line[static_cast<unsigned int>(linesid[i])].
getRightPolygon() == triangId)
967 neighsId[i] = m_line[
static_cast<unsigned int>(linesid[i])].
getLeftPolygon();
977 int32_t nodtoid, nodfrid;
980 nodtoid = m_line[
static_cast<unsigned int>(linId)].
getNodeTo();
981 nodfrid = m_line[
static_cast<unsigned int>(linId)].
getNodeFrom();
982 if (!NodesId(triangId, nodeids))
985 for (i = 0; i < 3; i++)
987 if ((nodtoid == nodeids[i]) ||
988 (nodfrid == nodeids[i]))
1009 for (j = 2; nodeId + j < m_lnode; j++)
1012 if (nodeId + j > m_lnode)
1029 for (j = 2; nodeId - j >= 0; j++)
1046 std::vector<int32_t> a;
1053 for (
size_t i = 0; i < a.size(); i++)
1066 nodeid = m_line[
static_cast<unsigned int>(ai)].
getNodeFrom();
1070 nodeid = m_line[
static_cast<unsigned int>(ai)].
getNodeTo();
1071 if (std::find(nodids.begin(), nodids.end(), nodeid) == nodids.end())
1072 nodids.push_back(nodeid);
1095 m_triang[
static_cast<unsigned int>(ti)].LinesId(lids);
1096 for (j = 0; j < 3; j++)
1100 if ((m_line[static_cast<unsigned int>(lids[j])].
getNodeFrom() == v) ||
1101 (m_line[static_cast<unsigned int>(lids[j])].
getNodeTo() == v))
1113 else if (m_line[static_cast<unsigned int>(aaux)].
getLeftPolygon() == ti)
1124 nodeid = m_line[
static_cast<unsigned int>(ai)].
getNodeFrom();
1128 nodeid = m_line[
static_cast<unsigned int>(ai)].
getNodeTo();
1129 if (std::find(nodids.begin(), nodids.end(), nodeid) == nodids.end())
1130 nodids.push_back(nodeid);
1143 std::vector<int32_t> a = FindLine(v);
1146 for (
size_t i = 0; i < a.size(); i++)
1161 int32_t
td,
te, ai, ti, taux = 0,
1165 std::vector<int32_t> a;
1171 for (
size_t i = 0; i < a.size(); i++)
1187 if (std::find(triangles.begin(), triangles.end(), ti) == triangles.end())
1188 triangles.push_back(ti);
1209 if (std::find(triangles.begin(), triangles.end(), ti) == triangles.end())
1210 triangles.push_back(ti);
1221 m_triang[
static_cast<unsigned int>(ti)].LinesId(lids);
1222 for (j = 0; j < 3; j++)
1226 if ((m_line[static_cast<unsigned int>(lids[j])].
getNodeFrom() == v) ||
1227 (m_line[static_cast<unsigned int>(lids[j])].
getNodeTo() == v))
1240 else if (m_line[static_cast<unsigned int>(aaux)].
getLeftPolygon() == ti)
1254 if (std::find(triangles.begin(), triangles.end(), ti) == triangles.end())
1255 triangles.push_back(ti);
1269 if (m_nodesize < nSize)
1271 while (m_nodesize < nSize)
1274 m_nodesize = m_node.size();
1277 m_triangsize = 2 * (m_nodesize)-5;
1279 while (m_triang.size() < m_triangsize)
1284 m_linesize = 3 * m_nodesize;
1286 while (m_line.size() < m_linesize)
1303 dsType->
add(fidProperty);
1306 dsType->
add(pkProperty);
1309 pk->
add(pkProperty);
1331 dsType->
add(prop10);
1333 dsType->
add(prop11);
1335 dsType->
add(prop12);
1338 dsType->
add(geometry);
1348 std::unique_ptr<te::da::DataSetType> outDSType(
GetDataSetType(outDsetName));
1349 std::unique_ptr<te::mem::DataSet> outDSet(
new te::mem::DataSet(outDSType.get()));
1361 for (
unsigned int tri = 0; tri < m_triangsize; tri++)
1367 if (!m_triang[tri].LinesId(tEdges))
1369 TrianglePoints(static_cast<int32_t>(tri), vert);
1370 if (!NodesId(static_cast<int32_t>(tri), nids))
1372 for (
size_t e = 0; e < 3; e++)
1374 value[e] = vert[e].
getZ();
1375 left[e] = m_line[
static_cast<unsigned int>(tEdges[e])].
getLeftPolygon();
1376 right[e] = m_line[
static_cast<unsigned int>(tEdges[e])].
getRightPolygon();
1377 type[e] = m_node[
static_cast<unsigned int>(nids[e])].
getType();
1383 s->setPointN(0, vert[0]);
1384 s->setPointN(1, vert[1]);
1385 s->setPointN(2, vert[2]);
1386 s->setPointN(3, vert[0]);
1387 p->push_back(s.release());
1390 dataSetItem->
setInt32(0, static_cast<int32_t>(tri));
1391 dataSetItem->
setInt32(1, static_cast<int32_t>(tri));
1392 if (value[0] != m_nodatavalue)
1393 dataSetItem->
setDouble(
"val1", value[0]);
1394 if (value[1] != m_nodatavalue)
1395 dataSetItem->
setDouble(
"val2", value[1]);
1396 if (value[2] != m_nodatavalue)
1397 dataSetItem->
setDouble(
"val3", value[2]);
1398 dataSetItem->
setInt32(
"type1", type[0]);
1399 dataSetItem->
setInt32(
"type2", type[1]);
1400 dataSetItem->
setInt32(
"type3", type[2]);
1401 dataSetItem->
setInt32(
"right1", right[0]);
1402 dataSetItem->
setInt32(
"right2", right[1]);
1403 dataSetItem->
setInt32(
"right3", right[2]);
1404 dataSetItem->
setInt32(
"left1", left[0]);
1405 dataSetItem->
setInt32(
"left2", left[1]);
1406 dataSetItem->
setInt32(
"left3", left[2]);
1407 dataSetItem->
setGeometry(
"geometry", static_cast<te::gm::Geometry*>(p->clone()));
1409 outDSet->add(dataSetItem);
1413 te::vp::Save(outDsrc.get(), outDSet.get(), outDSType.get());
1434 std::vector<KD_NODE*> reportsnode;
1435 std::vector<std::size_t> reportline;
1437 for (std::size_t j = 0; j < 3; ++j)
1440 std::unique_ptr<te::gm::Point>
p = lr->
getPointN(j);
1441 val[j] = val[j] > zmax || val[j] < zmin || val[j] > std::numeric_limits< double >::max() ? m_nodatavalue : val[j];
1443 if (val[j] != m_nodatavalue)
1450 nd.
Init(p->getX(), p->getY(), val[j], type[j]);
1453 nodetree.
search(ept, reportsnode);
1455 for (kn = 0; kn < reportsnode.size(); kn++)
1458 if (ind.
getX() == p->getX() && ind.
getY() == p->getY())
1460 no[j] = reportsnode[kn]->getData();
1464 if (kn == reportsnode.size())
1466 no[j] =
static_cast<int32_t
>(m_node.size());
1467 m_node.push_back(nd);
1469 nodetree.
insert(coord, no[j]);
1471 reportsnode.clear();
1483 m_env.Union(*lr->
getMBR());
1489 lid[0] = lid[1] = lid[2] = -1;
1491 for (
unsigned int j = 0; j < 3; j++)
1493 double x0 = m_node[
static_cast<unsigned int>(tl[j].
getNodeFrom())].getX();
1494 double y0 = m_node[
static_cast<unsigned int>(tl[j].
getNodeFrom())].getY();
1495 double x1 = m_node[
static_cast<unsigned int>(tl[j].
getNodeTo())].getX();
1496 double y1 = m_node[
static_cast<unsigned int>(tl[j].
getNodeTo())].getY();
1497 te::gm::Envelope e1(std::min(x0, x1), std::min(y0, y1), std::max(x0, x1), std::max(y0, y1));
1499 linetree.
search(e1, reportline);
1501 for (kl = 0; kl < reportline.size(); kl++)
1503 int32_t nd0 = m_line[reportline[kl]].getNodeFrom();
1504 int32_t nd1 = m_line[reportline[kl]].getNodeTo();
1507 lid[j] =
static_cast<int32_t
>(reportline[kl]);
1508 m_node[
static_cast<unsigned int>(tl[j].
getNodeFrom())].setEdge(static_cast<int32_t>(reportline[kl]));
1509 m_node[
static_cast<unsigned int>(tl[j].
getNodeTo())].setEdge(static_cast<int32_t>(reportline[kl]));
1513 if (kl == reportline.size())
1515 lid[j] =
static_cast<int32_t
>(m_line.size());
1516 m_node[
static_cast<unsigned int>(tl[j].
getNodeFrom())].setEdge(static_cast<int32_t>(m_line.size()));
1517 m_node[
static_cast<unsigned int>(tl[j].
getNodeTo())].setEdge(static_cast<int32_t>(m_line.size()));
1518 double x0 = m_node[
static_cast<unsigned int>(tl[j].
getNodeFrom())].getX();
1519 double y0 = m_node[
static_cast<unsigned int>(tl[j].
getNodeFrom())].getY();
1520 double x1 = m_node[
static_cast<unsigned int>(tl[j].
getNodeTo())].getX();
1521 double y1 = m_node[
static_cast<unsigned int>(tl[j].
getNodeTo())].getY();
1522 te::gm::Envelope e1(std::min(x0, x1), std::min(y0, y1), std::max(x0, x1), std::max(y0, y1));
1523 linetree.
insert(e1, m_line.size());
1524 m_line.push_back(tl[j]);
1529 while (
id >= static_cast<int32_t>(m_triang.size()))
1531 m_triang[
static_cast<unsigned int>(id)].setEdges(lid[0], lid[1], lid[2]);
1551 std::unique_ptr<te::da::DataSet> inDset = inDsrc->getDataSet(inDsetName);
1553 std::unique_ptr<te::da::DataSetType> dsType = inDsrc.get()->getDataSetType(inDsetName);
1558 std::vector<KD_NODE*> reportsnode;
1560 std::vector<std::size_t> reportline;
1562 inDset->moveBeforeFirst();
1563 std::vector<te::gm::Polygon *> vp;
1566 while (inDset->moveNext())
1568 std::unique_ptr<te::gm::Geometry> gin = inDset->getGeometry(geo_pos);
1569 if (!gin.get()->is3D())
1579 for (std::size_t i = 0; i < np; i++)
1580 vp.push_back(dynamic_cast<te::gm::Polygon*>(mg->
getGeometryN(i)));
1589 for (std::size_t i = 0; i < vp.size(); ++i)
1594 right[0] = right[1] = right[2] = id;
1595 left[0] = left[1] = left[2] = -1;
1596 val[0] = lr->
getZ(0);
1597 val[1] = lr->
getZ(1);
1598 val[2] = lr->
getZ(2);
1599 if (BuildTriangle(
id, lr, val, right, left, type, zmin, zmax, first, nodetree, linetree))
1608 std::cerr <<
"LoadTin: " << ex.
what() <<
'\n';
1633 std::unique_ptr<te::da::DataSet> inDset = inDsrc->getDataSet(inDsetName);
1634 std::string geo_attr(
"tri_id");
1635 const std::size_t np = inDset->getNumProperties();
1636 m_triangsize = inDset->size();
1642 std::vector<std::string>pnames;
1643 std::vector<int> ptypes;
1644 bool isTeTIN =
false;
1645 for (std::size_t i = 0; i != np; ++i)
1647 if (boost::iequals(inDset->getPropertyName(i), geo_attr))
1649 pnames.push_back(inDset->getPropertyName(i));
1650 ptypes.push_back(inDset->getPropertyDataType(i));
1657 LoadTinQGIS(inDsrc, inDsetName, zmin, zmax);
1664 m_nodesize = m_node.size();
1665 m_lnode =
static_cast<int32_t
>(m_nodesize);
1666 m_linesize = m_line.size();
1667 m_lline =
static_cast<int32_t
>(m_linesize);
1668 m_triangsize = m_triang.size();
1669 m_ltriang =
static_cast<int32_t
>(m_triangsize);
1682 inDset->moveBeforeFirst();
1686 while (inDset->moveNext())
1692 id = inDset->getInt32(1);
1693 if (inDset->isNull(
"val1"))
1694 val[0] = m_nodatavalue;
1696 val[0] = inDset->getDouble(
"val1");
1697 if (inDset->isNull(
"val2"))
1698 val[1] = m_nodatavalue;
1700 val[1] = inDset->getDouble(
"val2");
1701 if (inDset->isNull(
"val3"))
1702 val[2] = m_nodatavalue;
1704 val[2] = inDset->getDouble(
"val3");
1706 type[0] =
static_cast<Ntype>(inDset->getInt32(
"type1"));
1707 type[1] =
static_cast<Ntype>(inDset->getInt32(
"type2"));
1708 type[2] =
static_cast<Ntype>(inDset->getInt32(
"type3"));
1709 right[0] = inDset->getInt32(
"right1");
1710 right[1] = inDset->getInt32(
"right2");
1711 right[2] = inDset->getInt32(
"right3");
1712 left[0] = inDset->getInt32(
"left1");
1713 left[1] = inDset->getInt32(
"left2");
1714 left[2] = inDset->getInt32(
"left3");
1716 std::unique_ptr<te::gm::Geometry> gin = inDset->getGeometry(geo_pos);
1728 BuildTriangle(
id, lr, val, right, left, type, zmin, zmax, first, nodetree, linetree);
1732 m_nodesize = m_node.size();
1733 m_lnode =
static_cast<int32_t
>(m_nodesize);
1734 m_linesize = m_line.size();
1735 m_lline =
static_cast<int32_t
>(m_linesize);
1736 m_triangsize = m_triang.size();
1737 m_ltriang =
static_cast<int32_t
>(m_triangsize);
1746 if (!TriangleFirstDeriv())
1750 if (!NodeFirstDeriv())
1754 if (!TriangleSecondDeriv())
1758 if (!NodeSecondDeriv())
1765 if (!BreakNodeFirstDeriv())
1769 if (!BreakTriangleSecondDeriv())
1773 if (!BreakNodeSecondDeriv())
1793 if (m_tfderiv.size())
1798 for (i = 0; i < m_triangsize + 1; i++)
1801 pt.
setX(m_nodatavalue);
1804 m_tfderiv.push_back(pt);
1809 for (i = 0; i <static_cast<unsigned int>(m_ltriang); i++)
1814 if (!NodesId(static_cast<int32_t>(i), nodesid))
1816 m_tfderiv[i].setY(m_nodatavalue);
1820 for (j = 0; j < 3; j++)
1822 p3da[j].
setX(m_node[static_cast<unsigned int>(nodesid[j])].getNPoint().getX());
1823 p3da[j].
setY(m_node[static_cast<unsigned int>(nodesid[j])].getNPoint().getY());
1824 p3da[j].
setZ(m_node[static_cast<unsigned int>(nodesid[j])].getZ());
1828 if ((p3da[0].getZ() >= m_nodatavalue) || (p3da[1].getZ() >= m_nodatavalue) ||
1829 (p3da[2].getZ() >= m_nodatavalue))
1832 m_tfderiv[i].setY(m_nodatavalue);
1836 m1 = m2 = m_nodatavalue;
1838 if ((p3da[1].getY() - p3da[0].getY()) != 0.0)
1839 m1 = (p3da[1].
getX() - p3da[0].
getX()) / (p3da[1].getY() - p3da[0].
getY());
1841 if ((p3da[2].getY() - p3da[0].getY()) != 0.0)
1842 m2 = (p3da[2].
getX() - p3da[0].
getX()) / (p3da[2].getY() - p3da[0].
getY());
1844 if (fabs(m1 - m2) < tol)
1847 m_tfderiv[i].setY(m_nodatavalue);
1851 if ((p3da[0].getZ() == p3da[1].getZ()) && (p3da[0].getZ() == p3da[2].getZ()))
1854 m_tfderiv[i].setX(0.);
1860 m_tfderiv[i].setX(-nvector[0] / nvector[2]);
1861 m_tfderiv[i].setY(-nvector[1] / nvector[2]);
1879 if (!m_nfderiv.size())
1881 if (m_tsderiv.size())
1888 for (i = 0; i < m_triangsize + 1; i++)
1890 m_tsderiv.push_back(
TinNode());
1893 pt.
setX(m_nodatavalue);
1894 pt.
setY(m_nodatavalue);
1897 m_tsderiv[i].setNPoint(pt);
1900 for (i = 0; i < static_cast<unsigned int>(m_ltriang); i++)
1905 if (!NodesId(static_cast<int32_t>(i), nodesid))
1907 m_tsderiv[i].setZ(m_nodatavalue);
1912 if ((m_nfderiv[static_cast<unsigned int>(nodesid[0])].getX() >= m_nodatavalue) ||
1913 (m_nfderiv[static_cast<unsigned int>(nodesid[1])].getX() >= m_nodatavalue) ||
1914 (m_nfderiv[static_cast<unsigned int>(nodesid[2])].getX() >= m_nodatavalue) ||
1915 (m_node[static_cast<unsigned int>(nodesid[0])].getZ() >= m_nodatavalue) ||
1916 (m_node[static_cast<unsigned int>(nodesid[1])].getZ() >= m_nodatavalue) ||
1917 (m_node[static_cast<unsigned int>(nodesid[2])].getZ() >= m_nodatavalue))
1920 m_tsderiv[i].setZ(m_nodatavalue);
1924 m1 = m2 = m_nodatavalue;
1926 if ((m_nfderiv[static_cast<unsigned int>(nodesid[1])].getY() - m_nfderiv[static_cast<unsigned int>(nodesid[0])].getY()) != 0.0)
1927 m1 = (m_nfderiv[
static_cast<unsigned int>(nodesid[1])].getX() - m_nfderiv[
static_cast<unsigned int>(nodesid[0])].getX()) /
1928 (m_nfderiv[static_cast<unsigned int>(nodesid[1])].getY() - m_nfderiv[
static_cast<unsigned int>(nodesid[0])].getY());
1930 if ((m_nfderiv[static_cast<unsigned int>(nodesid[2])].getY() - m_nfderiv[
static_cast<unsigned int>(nodesid[0])].getY()) != 0.0)
1931 m2 = (m_nfderiv[
static_cast<unsigned int>(nodesid[2])].getX() - m_nfderiv[
static_cast<unsigned int>(nodesid[0])].getX()) /
1932 (m_nfderiv[static_cast<unsigned int>(nodesid[2])].getY() - m_nfderiv[
static_cast<unsigned int>(nodesid[0])].getY());
1934 if (fabs(m1 - m2) < tol)
1937 m_tsderiv[i].setZ(m_nodatavalue);
1942 for (
unsigned short j = 0; j < 3; j++)
1944 p3da[j].
setX(m_node[static_cast<unsigned int>(nodesid[j])].getNPoint().getX());
1945 p3da[j].
setY(m_node[static_cast<unsigned int>(nodesid[j])].getNPoint().getY());
1946 p3da[j].
setZ(m_nfderiv[static_cast<unsigned int>(nodesid[j])].getX());
1949 if ((p3da[0].getZ() == p3da[1].getZ()) && (p3da[0].getZ() == p3da[2].getZ()))
1951 m_tsderiv[i].setX(0.);
1957 m_tsderiv[i].setX(-nvector[0] / nvector[2]);
1958 dxy = (-nvector[1] / nvector[2]);
1962 for (
unsigned int j = 0; j < 3; j++)
1963 p3da[j].setZ(m_nfderiv[static_cast<unsigned int>(nodesid[j])].getY());
1965 if ((p3da[0].getZ() == p3da[1].getZ()) && (p3da[0].
getZ() == p3da[2].
getZ()))
1967 m_tsderiv[i].
setY(0.);
1973 m_tsderiv[i].setY(-nvector[1] / nvector[2]);
1974 dyx = (-nvector[0] / nvector[2]);
1976 m_tsderiv[i].setZ((dxy + dyx) / 2.);
1989 if (m_nfderiv.size())
1993 for (i = 0; i < m_nodesize + 1; i++)
1999 m_nfderiv.push_back(pt);
2005 for (i = 0; i < m_node.size(); i++)
2011 if (m_node[i].getZ() >= m_nodatavalue)
2018 if (!NodeClosestPoints(static_cast<int32_t>(i), clstnids))
2020 m_nfderiv[i] = CalcNodeFirstDeriv(static_cast<int32_t>(i), clstnids);
2033 if (!m_tsderiv.size())
2036 if (m_nsderiv.size())
2041 for (i = 0; i < m_nodesize + 1; i++)
2043 m_nsderiv.push_back(
TinNode());
2044 m_nsderiv[i].
Init(0., 0., 0.);
2048 for (i = 0; i < m_node.size(); i++)
2054 if (m_node[i].getZ() >= m_nodatavalue)
2062 if (!NodeClosestPoints(static_cast<int32_t>(i), clstnids))
2064 sderiv = CalcNodeSecondDeriv(static_cast<int32_t>(i), clstnids);
2065 m_nsderiv[i].setX(sderiv.
getX());
2066 m_nsderiv[i].setY(sderiv.
getY());
2067 m_nsderiv[i].setZ(sderiv.
getZ());
2081 std::vector<int32_t> lineids = FindLine(nid);
2082 if (!lineids.size())
2087 distv[j] = m_nodatavalue;
2091 for (
size_t i = 0; i < lineids.size(); i++)
2093 if (lineids[i] == -1)
2096 lineid = lineids[i];
2098 if (m_line[static_cast<unsigned int>(lineid)].getNodeFrom() == nid)
2099 nodeid = m_line[static_cast<unsigned int>(lineid)].getNodeTo();
2100 else if (m_line[static_cast<unsigned int>(lineid)].
getNodeTo() == nid)
2101 nodeid = m_line[
static_cast<unsigned int>(lineid)].
getNodeFrom();
2105 if ((m_node[static_cast<unsigned int>(nodeid)].getZ() < m_nodatavalue) && ((useBrNode) ||
2106 ((useBrNode) && (nodeid < m_fbnode))))
2108 dist = (m_node[
static_cast<unsigned int>(nid)].getX() - m_node[
static_cast<unsigned int>(nodeid)].getX()) *
2109 (m_node[static_cast<unsigned int>(nid)].getX() - m_node[
static_cast<unsigned int>(nodeid)].getX()) +
2110 (m_node[static_cast<unsigned int>(nid)].getY() - m_node[
static_cast<unsigned int>(nodeid)].getY()) *
2111 (m_node[static_cast<unsigned int>(nid)].getY() - m_node[
static_cast<unsigned int>(nodeid)].getY());
2114 if (dist < distv[j])
2116 for (k = CLNODES - 1; k > j; k--)
2118 distv[k] = distv[k - 1];
2119 clstNids[k] = clstNids[k - 1];
2122 clstNids[j] = nodeid;
2139 double nvector[3], tnx, tny, tnz;
2143 p3da[0].
setX(m_node[static_cast<unsigned int>(nodeId)].getNPoint().getX());
2144 p3da[0].
setY(m_node[static_cast<unsigned int>(nodeId)].getNPoint().getY());
2145 p3da[0].
setZ(m_node[static_cast<unsigned int>(nodeId)].getZ());
2152 if (clstNodes[j] == -1)
2154 p3da[1].
setX(m_node[static_cast<unsigned int>(clstNodes[j])].getNPoint().getX());
2155 p3da[1].
setY(m_node[static_cast<unsigned int>(clstNodes[j])].getNPoint().getY());
2156 p3da[1].
setZ(m_node[static_cast<unsigned int>(clstNodes[j])].getZ());
2157 for (k = j + 1; k <
CLNODES; k++)
2159 if (clstNodes[k] == -1)
2161 p3da[2].
setX(m_node[static_cast<unsigned int>(clstNodes[k])].getNPoint().getX());
2162 p3da[2].
setY(m_node[static_cast<unsigned int>(clstNodes[k])].getNPoint().getY());
2163 p3da[2].
setZ(m_node[static_cast<unsigned int>(clstNodes[k])].getZ());
2166 m1 = m2 = m_nodatavalue;
2168 if ((p3da[1].getY() - p3da[0].getY()) != 0.0)
2169 m1 = (p3da[1].
getX() - p3da[0].
getX()) / (p3da[1].getY() - p3da[0].
getY());
2171 if ((p3da[2].getY() - p3da[0].getY()) != 0.0)
2172 m2 = (p3da[2].
getX() - p3da[0].
getX()) / (p3da[2].getY() - p3da[0].
getY());
2174 if (fabs(m1 - m2) < tol)
2177 if ((p3da[0].getZ() >= m_nodatavalue) || (p3da[1].
getZ() >= m_nodatavalue) ||
2178 (p3da[2].getZ() >= m_nodatavalue))
2181 if ((p3da[0].getZ() == p3da[1].
getZ()) &&
2182 (p3da[0].getZ() == p3da[2].
getZ()))
2195 deriv.
setX(-tnx / tnz);
2196 deriv.
setY(-tny / tnz);
2212 double tnxx, tnxy, tnxz, tnyx, tnyy, tnyz,
2218 p3da[0].
setX(m_node[static_cast<unsigned int>(nodeId)].getNPoint().getX());
2219 p3da[0].
setY(m_node[static_cast<unsigned int>(nodeId)].getNPoint().getY());
2220 p3da[0].
setZ(m_nfderiv[static_cast<unsigned int>(nodeId)].getX());
2229 for (j = 0; j < static_cast<unsigned int>(
CLNODES); j++)
2231 if (clstNIds[j] == -1)
2233 p3da[1].
setX(m_node[static_cast<unsigned int>(clstNIds[j])].getNPoint().getX());
2234 p3da[1].
setY(m_node[static_cast<unsigned int>(clstNIds[j])].getNPoint().getY());
2235 p3da[1].
setZ(m_nfderiv[static_cast<unsigned int>(clstNIds[j])].getX());
2236 for (k = j + 1; k <
CLNODES; k++)
2238 if (clstNIds[k] == -1)
2240 p3da[2].
setX(m_node[static_cast<unsigned int>(clstNIds[k])].getNPoint().getX());
2241 p3da[2].
setY(m_node[static_cast<unsigned int>(clstNIds[k])].getNPoint().getY());
2242 p3da[2].
setZ(m_nfderiv[static_cast<unsigned int>(clstNIds[k])].getX());
2244 m1 = m2 = m_nodatavalue;
2246 if ((p3da[1].getY() - p3da[0].getY()) != 0.0)
2247 m1 = (p3da[1].
getX() - p3da[0].
getX()) / (p3da[1].getY() - p3da[0].
getY());
2249 if ((p3da[2].getY() - p3da[0].getY()) != 0.0)
2250 m2 = (p3da[2].
getX() - p3da[0].
getX()) / (p3da[2].getY() - p3da[0].
getY());
2252 if (fabs(m1 - m2) < tol)
continue;
2254 if ((p3da[0].getZ() >= m_nodatavalue) ||
2255 (p3da[1].
getZ() >= m_nodatavalue) ||
2256 (p3da[2].getZ() >= m_nodatavalue))
2259 if ((p3da[0].getZ() == p3da[1].
getZ()) &&
2260 (p3da[0].getZ() == p3da[2].
getZ()))
2270 p3da[0].
setZ(m_nfderiv[static_cast<unsigned int>(nodeId)].getY());
2273 if (clstNIds[j] == -1)
2275 p3da[1].
setX(m_node[static_cast<unsigned int>(clstNIds[j])].getNPoint().getX());
2276 p3da[1].
setY(m_node[static_cast<unsigned int>(clstNIds[j])].getNPoint().getY());
2277 p3da[1].
setZ(m_nfderiv[static_cast<unsigned int>(clstNIds[j])].getY());
2278 for (k = j + 1; k <
CLNODES; k++)
2280 if (clstNIds[k] == -1)
2282 p3da[2].
setX(m_node[static_cast<unsigned int>(clstNIds[k])].getNPoint().getX());
2283 p3da[2].
setY(m_node[static_cast<unsigned int>(clstNIds[k])].getNPoint().getY());
2284 p3da[2].
setZ(m_nfderiv[static_cast<unsigned int>(clstNIds[k])].getY());
2286 m1 = m2 = m_nodatavalue;
2288 if ((p3da[1].getY() - p3da[0].getY()) != 0.0)
2289 m1 = (p3da[1].
getX() - p3da[0].
getX()) / (p3da[1].getY() - p3da[0].
getY());
2291 if ((p3da[2].getY() - p3da[0].getY()) != 0.0)
2292 m2 = (p3da[2].
getX() - p3da[0].
getX()) / (p3da[2].getY() - p3da[0].
getY());
2294 if (fabs(m1 - m2) < tol)
2297 if ((p3da[0].getZ() >= m_nodatavalue) ||
2298 (p3da[1].
getZ() >= m_nodatavalue) ||
2299 (p3da[2].getZ() >= m_nodatavalue))
2301 if ((p3da[0].getZ() == p3da[1].
getZ()) &&
2302 (p3da[0].getZ() == p3da[2].
getZ()))
2314 sderiv.
setX(-tnxx / tnxz);
2315 tnxy = -tnxy / tnxz;
2321 sderiv.
setY(-tnyy / tnyz);
2322 tnyx = -tnyx / tnyz;
2327 sderiv.
setZ((tnxy + tnyx) / 2.);
2333 bool ::te::mnt::Tin::BreakNodeFirstDeriv()
2335 size_t i, bnodesize,
2338 double deltax, deltay,
2339 sintheta, costheta, modxy,
2340 dzds, dzdt, dzdx, dzdy;
2344 if (!m_tfderiv.size())
2347 bnodesize =
static_cast<unsigned int>(m_lnode - m_fbnode);
2348 if (m_nbrfderiv.size())
2350 m_nbrfderiv.clear();
2353 for (i = 0; i < bnodesize + 1; i++)
2355 m_nbrfderiv.push_back(m_nfderiv[i + static_cast<unsigned long>(m_fbnode)]);
2356 m_nblfderiv.push_back(m_nfderiv[i + static_cast<unsigned long>(m_fbnode)]);
2362 for (i = static_cast<unsigned int>(m_fbnode); i < m_node.size() - 1; i++)
2368 if ((m_node[i].getZ() >= m_nodatavalue) ||
2374 BreakNodeClosestPoints(static_cast<int32_t>(i), rclstnids, lclstnids);
2375 rderiv = CalcNodeFirstDeriv(static_cast<int32_t>(i), rclstnids);
2376 lderiv = CalcNodeFirstDeriv(static_cast<int32_t>(i), lclstnids);
2378 node1 =
static_cast<unsigned int>(NextNode(static_cast<int32_t>(i)));
2379 node2 =
static_cast<unsigned int>(PreviousNode(static_cast<int32_t>(i)));
2381 deltax = m_node[node1].getX() - m_node[node2].getX();
2382 deltay = m_node[node1].getY() - m_node[node2].getY();
2383 modxy = sqrt(deltax*deltax + deltay*deltay);
2384 costheta = deltax / modxy;
2385 sintheta = deltay / modxy;
2387 if (m_nfderiv[i].getX() >= m_nodatavalue)
2390 dzds = costheta*m_nfderiv[i].getX() -
2391 sintheta*m_nfderiv[i].getY();
2393 if (rderiv.
getX() >= m_nodatavalue)
2396 dzdt = sintheta*rderiv.
getX() +
2397 costheta*rderiv.
getY();
2398 dzdx = costheta*dzds + sintheta*dzdt;
2399 dzdy = -sintheta*dzds + costheta*dzdt;
2400 m_nbrfderiv[i -
static_cast<unsigned long>(m_fbnode)].setX(dzdx);
2401 m_nbrfderiv[i -
static_cast<unsigned long>(m_fbnode)].setY(dzdy);
2403 if (lderiv.
getX() >= m_nodatavalue)
2406 dzdt = sintheta*lderiv.
getX() +
2407 costheta*lderiv.
getY();
2408 dzdx = costheta*dzds + sintheta*dzdt;
2409 dzdy = -sintheta*dzds + costheta*dzdt;
2410 m_nblfderiv[i -
static_cast<unsigned long>(m_fbnode)].setX(dzdx);
2411 m_nblfderiv[i -
static_cast<unsigned long>(m_fbnode)].setY(dzdy);
2420 std::vector<int32_t> rightri, leftri;
2423 if ((!m_nbrfderiv.size()) || (!m_nblfderiv.size()))
2425 if (!m_tsderiv.size())
2430 for (i = static_cast<unsigned int>(m_fbnode); i < m_node.size() - 1; i++)
2435 if (m_node[i].getZ() >- m_nodatavalue)
2445 NodeTriangles(static_cast<int32_t>(i), rightri, leftri);
2448 CalcTriangleSecondDeriv(rightri, m_nbrfderiv);
2451 CalcTriangleSecondDeriv(leftri, m_nblfderiv);
2463 int32_t lids[3], linid;
2466 lids[0] = lids[1] = lids[2] = -1;
2469 std::vector<int32_t> fline = FindLine(nodeid);
2473 for (
size_t i = 0; i < fline.size(); i++)
2477 ltri = m_line[
static_cast<unsigned int>(linid)].
getLeftPolygon();
2486 while (rtri != ltri)
2488 if (m_line[static_cast<unsigned int>(linid)].
getNodeTo() == nodeid)
2490 rightri.push_back(m_line[static_cast<unsigned int>(linid)].
getRightPolygon());
2492 else if (m_line[static_cast<unsigned int>(linid)].
getNodeFrom() == nodeid)
2494 leftri.push_back(m_line[static_cast<unsigned int>(linid)].
getLeftPolygon());
2499 if (!m_triang[static_cast<unsigned int>(rtri)].LinesId(lids))
2502 for (k = 0; k < 3; k++)
2504 if (lids[k] == linid || lids[k] == -1)
2506 if ((m_line[static_cast<unsigned int>(lids[k])].
getNodeFrom() == nodeid) ||
2507 (m_line[static_cast<unsigned int>(lids[k])].
getNodeTo() == nodeid))
2517 if (m_line[static_cast<unsigned int>(linid)].
getRightPolygon() == rtri)
2518 rtri = m_line[
static_cast<unsigned int>(linid)].
getLeftPolygon();
2519 else if (m_line[static_cast<unsigned int>(linid)].
getLeftPolygon() == rtri)
2533 if (m_line[static_cast<unsigned int>(linid)].
getNodeTo() == nodeid)
2535 rightri.push_back(m_line[static_cast<unsigned int>(linid)].
getRightPolygon());
2537 if (m_line[static_cast<unsigned int>(linid)].
getNodeFrom() == nodeid)
2539 leftri.push_back(m_line[static_cast<unsigned int>(linid)].
getLeftPolygon());
2555 lids[0] = lids[1] = lids[2] = -1;
2557 std::vector<int32_t>lineid = FindLine(nid);
2561 for (
size_t i = 0; i < lineid.size(); i++)
2565 for (
unsigned int j = 0; j <
CLNODES; j++)
2567 rdistv[j] = m_nodatavalue;
2570 ldistv[j] = m_nodatavalue;
2575 rtri = m_line[
static_cast<unsigned int>(lineid[i])].
getRightPolygon();
2576 ltri = m_line[
static_cast<unsigned int>(lineid[i])].
getLeftPolygon();
2582 while (rtri != ltri)
2585 if (!m_triang[static_cast<unsigned int>(rtri)].LinesId(lids))
2589 for (j = 0; j < 3; j++)
2592 if (lids[j] == lineid[i] || lids[j] == -1)
2594 if ((m_line[static_cast<unsigned int>(lids[j])].
getNodeFrom() == nid) ||
2595 (m_line[static_cast<unsigned int>(lids[j])].
getNodeTo() == nid))
2602 lineid[i] = lids[j];
2603 if (m_line[static_cast<unsigned int>(lineid[i])].
getNodeFrom() == nid)
2605 nodeid = m_line[
static_cast<unsigned int>(lineid[i])].
getNodeTo();
2606 if (nodeid < m_fbnode)
2608 dist = (m_node[
static_cast<unsigned int>(nid)].getX() - m_node[
static_cast<unsigned int>(nodeid)].getX()) *
2609 (m_node[static_cast<unsigned int>(nid)].getX() - m_node[
static_cast<unsigned int>(nodeid)].getX()) +
2610 (m_node[static_cast<unsigned int>(nid)].getY() - m_node[
static_cast<unsigned int>(nodeid)].getY()) *
2611 (m_node[static_cast<unsigned int>(nid)].getY() - m_node[
static_cast<unsigned int>(nodeid)].getY());
2614 if (dist < rdistv[j])
2616 for (
unsigned int k = static_cast<unsigned int>(CLNODES - 1); k > j; k--)
2618 rdistv[k] = rdistv[k - 1];
2619 rClstNids[k] = rClstNids[k - 1];
2622 rClstNids[j] = nodeid;
2630 nodeid = m_line[
static_cast<unsigned int>(lineid[i])].
getNodeFrom();
2631 if (nodeid < m_fbnode)
2633 dist = (m_node[
static_cast<unsigned int>(nid)].getX() - m_node[
static_cast<unsigned int>(nodeid)].getX()) *
2634 (m_node[static_cast<unsigned int>(nid)].getX() - m_node[
static_cast<unsigned int>(nodeid)].getX()) +
2635 (m_node[static_cast<unsigned int>(nid)].getY() - m_node[
static_cast<unsigned int>(nodeid)].getY()) *
2636 (m_node[static_cast<unsigned int>(nid)].getY() - m_node[
static_cast<unsigned int>(nodeid)].getY());
2639 if (dist < ldistv[j])
2641 for (
unsigned int k = static_cast<unsigned int>(CLNODES - 1); k > j; k--)
2643 ldistv[k] = ldistv[k - 1];
2644 lClstNids[k] = lClstNids[k - 1];
2647 lClstNids[j] = nodeid;
2655 if (m_line[static_cast<unsigned int>(lineid[i])].getRightPolygon() == rtri)
2656 rtri = m_line[static_cast<unsigned int>(lineid[i])].getLeftPolygon();
2657 else if (m_line[static_cast<unsigned int>(lineid[i])].
getLeftPolygon() == rtri)
2658 rtri = m_line[
static_cast<unsigned int>(lineid[i])].
getRightPolygon();
2661 if ((rtri == -1) && (ltri != -1))
2674 int32_t triid, nodesid[3];
2683 for (
size_t i = 0; i < triangles.size(); i++)
2685 if (triangles[i] == -1)
2687 triid = triangles[i];
2688 if (!NodesId(triid, nodesid))
2692 if ((m_node[static_cast<unsigned int>(nodesid[0])].getZ() >= m_nodatavalue) ||
2693 (m_node[
static_cast<unsigned int>(nodesid[1])].getZ() >= m_nodatavalue) ||
2694 (m_node[static_cast<unsigned int>(nodesid[2])].getZ() >= m_nodatavalue))
2697 m_tsderiv[
static_cast<unsigned int>(triid)].setX(m_nodatavalue);
2698 m_tsderiv[
static_cast<unsigned int>(triid)].setY(m_nodatavalue);
2699 m_tsderiv[
static_cast<unsigned int>(triid)].setZ(m_nodatavalue);
2702 m1 = m2 = m_nodatavalue;
2703 if ((m_node[static_cast<unsigned int>(nodesid[1])].getY() - m_node[static_cast<unsigned int>(nodesid[0])].getY()) != 0.0)
2704 m1 = (m_node[
static_cast<unsigned int>(nodesid[1])].getX() - m_node[
static_cast<unsigned int>(nodesid[0])].getX()) /
2705 (m_node[static_cast<unsigned int>(nodesid[1])].getY() - m_node[
static_cast<unsigned int>(nodesid[0])].getY());
2706 if ((m_node[static_cast<unsigned int>(nodesid[2])].getY() - m_node[
static_cast<unsigned int>(nodesid[0])].getY()) != 0.0)
2707 m2 = (m_node[
static_cast<unsigned int>(nodesid[2])].getX() - m_node[
static_cast<unsigned int>(nodesid[0])].getX()) /
2708 (m_node[static_cast<unsigned int>(nodesid[2])].getY() - m_node[
static_cast<unsigned int>(nodesid[0])].getY());
2710 if (fabs(m1 - m2) < tol)
2713 m_tsderiv[
static_cast<unsigned int>(triid)].setX(m_nodatavalue);
2714 m_tsderiv[
static_cast<unsigned int>(triid)].setY(m_nodatavalue);
2715 m_tsderiv[
static_cast<unsigned int>(triid)].setZ(m_nodatavalue);
2720 for (
unsigned int j = 0; j < 3; j++)
2722 p3da[j].setX(m_node[static_cast<unsigned int>(nodesid[j])].getNPoint().getX());
2723 p3da[j].setY(m_node[static_cast<unsigned int>(nodesid[j])].getNPoint().getY());
2724 if (m_node[static_cast<unsigned int>(nodesid[j])].
getType() >
Last && m_node[static_cast<unsigned int>(nodesid[j])].
getType() <
Sample)
2726 p3da[j].setZ(fderiv[static_cast<unsigned int>(nodesid[j] - m_fbnode)].getX());
2728 p3da[j].setZ(m_nfderiv[static_cast<unsigned int>(nodesid[j])].getX());
2731 if ((p3da[0].getZ() == p3da[1].getZ()) && (p3da[0].getZ() == p3da[2].getZ()))
2733 m_tsderiv[
static_cast<unsigned int>(triid)].setX(0.);
2739 m_tsderiv[
static_cast<unsigned int>(triid)].setX(-nvector[0] / nvector[2]);
2740 dxy = (-nvector[1] / nvector[2]);
2744 for (
unsigned int j = 0; j < 3; j++)
2745 if (m_node[static_cast<unsigned int>(nodesid[j])].getType() >
Last && m_node[
static_cast<unsigned int>(nodesid[j])].
getType() <
Sample)
2747 p3da[j].setZ(fderiv[static_cast<unsigned int>(nodesid[j] - m_fbnode)].getY());
2749 p3da[j].setZ(m_nfderiv[static_cast<unsigned int>(nodesid[j])].getY());
2751 if ((p3da[0].getZ() == p3da[1].getZ()) && (p3da[0].getZ() == p3da[2].getZ()))
2753 m_tsderiv[
static_cast<unsigned int>(triid)].setY(0.);
2759 m_tsderiv[
static_cast<unsigned int>(triid)].setY(-nvector[1] / nvector[2]);
2760 dyx = (-nvector[0] / nvector[2]);
2762 m_tsderiv[
static_cast<unsigned int>(triid)].setZ((dxy + dyx) / 2.);
2774 double deltax, deltay, modxy,
2776 cos2theta, sin2theta, sincostheta,
2777 dzdss, dzdtt, dzdst,
2778 dzdxx, dzdyy, dzdxy;
2780 if (!m_tsderiv.size())
2784 bnodesize = m_lnode - m_fbnode;
2785 if (m_nbrsderiv.size())
2787 m_nbrsderiv.clear();
2791 for (i = 0; i < static_cast<unsigned int>(bnodesize + 1); i++)
2793 m_nbrsderiv.push_back(m_nsderiv[i + static_cast<unsigned int>(m_fbnode)]);
2794 m_nblsderiv.push_back(m_nsderiv[i + static_cast<unsigned int>(m_fbnode)]);
2798 for (i = static_cast<unsigned int>(m_fbnode); i < m_node.size() - 1; i++)
2801 if ((m_node[i].getZ() >= m_nodatavalue) ||
2807 BreakNodeClosestPoints(static_cast<int32_t>(i), rclstnids, lclstnids);
2808 rsderiv = CalcNodeSecondDeriv(static_cast<int32_t>(i), rclstnids);
2809 lsderiv = CalcNodeSecondDeriv(static_cast<int32_t>(i), lclstnids);
2811 node1 = NextNode(static_cast<int32_t>(i));
2812 node2 = PreviousNode(static_cast<int32_t>(i));
2814 deltax = m_node[
static_cast<unsigned int>(node1)].getX() - m_node[
static_cast<unsigned int>(node2)].getX();
2815 deltay = m_node[
static_cast<unsigned int>(node1)].getY() - m_node[
static_cast<unsigned int>(node2)].getY();
2816 modxy = sqrt(deltax*deltax + deltay*deltay);
2817 costheta = deltax / modxy;
2818 sintheta = deltay / modxy;
2819 cos2theta = costheta*costheta;
2820 sin2theta = sintheta*sintheta;
2821 sincostheta = sintheta*costheta;
2823 dzdss = cos2theta*m_nsderiv[i].getX() -
2824 2 * sincostheta*m_nsderiv[i].getZ() +
2825 sin2theta*m_nsderiv[i].getY();
2827 dzdtt = sin2theta*rsderiv.
getX() +
2828 2 * sincostheta*rsderiv.
getZ() +
2829 cos2theta*rsderiv.
getY();
2830 dzdst = sincostheta*rsderiv.
getX() +
2831 (cos2theta - sin2theta)*rsderiv.
getZ() -
2832 sincostheta*rsderiv.
getY();
2834 dzdxx = cos2theta*dzdss +
2835 2 * sincostheta*dzdst +
2837 dzdyy = sin2theta*dzdss -
2838 2 * sincostheta*dzdst +
2840 dzdxy = -sincostheta*dzdss +
2841 (cos2theta - sin2theta)*dzdst +
2844 m_nbrsderiv[i -
static_cast<unsigned long>(m_fbnode)].setX(dzdxx);
2845 m_nbrsderiv[i -
static_cast<unsigned long>(m_fbnode)].setY(dzdyy);
2846 m_nbrsderiv[i -
static_cast<unsigned long>(m_fbnode)].setZ(dzdxy);
2848 dzdtt = sin2theta*lsderiv.
getX() +
2849 2 * sincostheta*lsderiv.
getZ() +
2850 cos2theta*lsderiv.
getY();
2851 dzdst = sincostheta*lsderiv.
getX() +
2852 (cos2theta - sin2theta)*lsderiv.
getZ() -
2853 sincostheta*lsderiv.
getY();
2855 dzdxx = cos2theta*dzdss +
2856 2 * sincostheta*dzdst +
2858 dzdyy = sin2theta*dzdss -
2859 2 * sincostheta*dzdst +
2861 dzdxy = -sincostheta*dzdss +
2862 (cos2theta - sin2theta)*dzdst +
2865 m_nblsderiv[i -
static_cast<unsigned long>(m_fbnode)].setX(dzdxx);
2866 m_nblsderiv[i -
static_cast<unsigned long>(m_fbnode)].setY(dzdyy);
2867 m_nblsderiv[i -
static_cast<unsigned long>(m_fbnode)].setZ(dzdxy);
2877 for (triangid = 0; triangid < m_ltriang; triangid++)
2879 CheckLines(triangid);
2888 int32_t lids[3], nids[3];
2889 double a,
b, c,
d, s;
2892 if (trid > m_ltriang)
2895 if (!m_triang[static_cast<unsigned int>(trid)].LinesId(lids))
2898 if (!NodesId(trid, nids))
2901 a = m_node[
static_cast<unsigned int>(nids[1])].getX() - m_node[
static_cast<unsigned int>(nids[0])].getX();
2902 b = m_node[
static_cast<unsigned int>(nids[1])].getY() - m_node[
static_cast<unsigned int>(nids[0])].getY();
2903 c = m_node[
static_cast<unsigned int>(nids[2])].getX() - m_node[
static_cast<unsigned int>(nids[0])].getX();
2904 d = m_node[
static_cast<unsigned int>(nids[2])].getY() - m_node[
static_cast<unsigned int>(nids[0])].getY();
2908 for (i = 0; i < 3; i++)
2913 if (((m_line[static_cast<unsigned int>(lids[i])].
getNodeFrom() == nids[i]) &&
2914 (m_line[static_cast<unsigned int>(lids[i])].
getRightPolygon() == trid)) ||
2915 ((m_line[static_cast<unsigned int>(lids[i])].
getNodeTo() == nids[i]) &&
2916 (m_line[static_cast<unsigned int>(lids[i])].
getLeftPolygon() == trid)))
2917 m_line[
static_cast<unsigned int>(lids[i])].
SwapPolygon();
2921 if (((m_line[static_cast<unsigned int>(lids[i])].
getNodeTo() == nids[i]) &&
2922 (m_line[static_cast<unsigned int>(lids[i])].
getRightPolygon() == trid)) ||
2923 ((m_line[static_cast<unsigned int>(lids[i])].
getNodeFrom() == nids[i]) &&
2924 (m_line[static_cast<unsigned int>(lids[i])].
getLeftPolygon() == trid)))
2925 m_line[
static_cast<unsigned int>(lids[i])].
SwapPolygon();
2935 double u, v, ap, bp, cp, dp, x0, y0,
2936 p00, p01, p02, p03, p04, p05,
2937 p10, p11, p12, p13, p14,
2944 DefineAkimaCoeficients(triid, coef);
2947 p00 = coef[0]; p01 = coef[1]; p02 = coef[2]; p03 = coef[3]; p04 = coef[4]; p05 = coef[5];
2948 p10 = coef[6]; p11 = coef[7]; p12 = coef[8]; p13 = coef[9]; p14 = coef[10];
2949 p20 = coef[11]; p21 = coef[12]; p22 = coef[13]; p23 = coef[14];
2950 p30 = coef[15]; p31 = coef[16]; p32 = coef[17];
2951 p40 = coef[18]; p41 = coef[19];
2955 ap = coef[21]; bp = coef[22]; cp = coef[23]; dp = coef[24];
2956 x0 = coef[25]; y0 = coef[26];
2959 u = ap*(pt1.
getX() - x0) +
2960 bp*(pt1.
getY() - y0);
2961 v = cp*(pt1.
getX() - x0) +
2962 dp*(pt1.
getY() - y0);
2965 p0 = p00 + v*(p01 + v*(p02 + v*(p03 + v*(p04 + v*p05))));
2966 p1 = p10 + v*(p11 + v*(p12 + v*(p13 + v*p14)));
2967 p2 = p20 + v*(p21 + v*(p22 + v*p23));
2968 p3 = p30 + v*(p31 + v*p32);
2971 pt1.
setZ((p0 + u*(p1 + u*(p2 + u*(p3 + u*(p4 + u*p50))))));
2974 u = ap*(pt2.
getX() - x0) +
2975 bp*(pt2.
getY() - y0);
2976 v = cp*(pt2.
getX() - x0) +
2977 dp*(pt2.
getY() - y0);
2980 p0 = p00 + v*(p01 + v*(p02 + v*(p03 + v*(p04 + v*p05))));
2981 p1 = p10 + v*(p11 + v*(p12 + v*(p13 + v*p14)));
2982 p2 = p20 + v*(p21 + v*(p22 + v*p23));
2983 p3 = p30 + v*(p31 + v*p32);
2986 pt2.
setZ((p0 + u*(p1 + u*(p2 + u*(p3 + u*(p4 + u*p50))))));
2998 if (!NodesId(triid, nodesid))
3000 for (
unsigned int j = 0; j < 3; j++)
3002 p3d[j].
setX(m_node[static_cast<unsigned int>(nodesid[j])].getNPoint().getX());
3003 p3d[j].
setY(m_node[static_cast<unsigned int>(nodesid[j])].getNPoint().getY());
3004 p3d[j].
setZ(m_node[static_cast<unsigned int>(nodesid[j])].getZ());
3007 DefineAkimaCoeficients(triid, nodesid, p3d, coef);
3019 theta, phi, thxu, thphi,
3020 cstheta, lusntheta, lvsntheta,
3022 p00, p01, p02, p03, p04, p05,
3023 p10, p11, p12, p13, p14,
3029 zu[3], zv[3], zuu[3], zvv[3], zuv[3];
3031 int32_t lids[3], nodid;
3032 std::vector<te::gm::Point>* fderiv;
3033 std::vector<TinNode> *sderiv;
3059 if (!m_triang[static_cast<unsigned int>(triid)].LinesId(lids))
3062 for (
unsigned int i = 0; i < 3; i++)
3064 if ((m_line[static_cast<unsigned int>(lids[i])].
getNodeTo() >= m_fbnode) &&
3065 (m_line[static_cast<unsigned int>(lids[i])].
getNodeFrom() >= m_fbnode))
3067 if (m_line[static_cast<unsigned int>(lids[i])].
getRightPolygon() == triid)
3070 else if (m_line[static_cast<unsigned int>(lids[i])].
getLeftPolygon() == triid)
3077 if (m_line[static_cast<unsigned int>(lids[i])].
getNodeTo() >= m_fbnode)
3083 if (m_line[static_cast<unsigned int>(lids[i])].
getNodeFrom() >= m_fbnode)
3093 for (
unsigned int i = 0; i < 3; i++)
3095 if ((m_fbnode == 0) ||
3096 ((m_fbnode > 0) && (nodesid[i] < m_fbnode)))
3099 fderiv = &m_nfderiv;
3100 sderiv = &m_nsderiv;
3102 else if (bside == 1)
3104 nodid = nodesid[i] - m_fbnode;
3105 fderiv = &m_nbrfderiv;
3106 sderiv = &m_nbrsderiv;
3108 else if (bside == 2)
3110 nodid = nodesid[i] - m_fbnode;
3111 fderiv = &m_nblfderiv;
3112 sderiv = &m_nbrsderiv;
3118 if ((*fderiv)[static_cast<unsigned int>(nodid)].getY() >= m_nodatavalue)
3120 zu[i] = 0.; zv[i] = 0.;
3124 zu[i] = a * (*fderiv)[
static_cast<unsigned int>(nodid)].getX() +
3125 c * (*fderiv)[
static_cast<unsigned int>(nodid)].getY();
3126 zv[i] = b * (*fderiv)[
static_cast<unsigned int>(nodid)].getX() +
3127 d * (*fderiv)[
static_cast<unsigned int>(nodid)].getY();
3129 if ((*sderiv)[static_cast<unsigned int>(nodid)].getZ() >= m_nodatavalue)
3137 zuu[i] = aa * (*sderiv)[
static_cast<unsigned int>(nodid)].getX() +
3138 2.*a*c *
static_cast<double>((*sderiv)[
static_cast<unsigned int>(nodid)].getZ()) +
3139 cc * (*sderiv)[
static_cast<unsigned int>(nodid)].getY();
3140 zuv[i] = a*b * (*sderiv)[
static_cast<unsigned int>(nodid)].getX() +
3141 (ad + bc) * static_cast<double>((*sderiv)[
static_cast<unsigned int>(nodid)].getZ()) +
3142 c*d * (*sderiv)[
static_cast<unsigned int>(nodid)].getY();
3143 zvv[i] = bb * (*sderiv)[
static_cast<unsigned int>(nodid)].getX() +
3144 2.*b*d *
static_cast<double>((*sderiv)[
static_cast<unsigned int>(nodid)].getZ()) +
3145 dd * (*sderiv)[
static_cast<unsigned int>(nodid)].getY();
3155 theta = atan2(d, b) - thxu;
3156 cstheta = cos(theta);
3157 lusntheta = lu * sin(theta);
3158 lvsntheta = lv * sin(theta);
3161 phi = atan2(d - c, b - a) - thxu;
3162 thphi = theta - phi;
3166 e = sin(thphi) / lusntheta;
3167 f = -cos(thphi) / lusntheta;
3168 g = sin(phi) / lvsntheta;
3169 h = cos(phi) / lvsntheta;
3173 p00 = p3d[0].
getZ();
3181 h1 = p3d[1].
getZ() - p00 - p10 - p20;
3182 h2 = zu[1] - p10 - zuu[0];
3183 h3 = zuu[1] - zuu[0];
3184 p30 = 10.*h1 - 4.*h2 + h3 / 2.;
3185 p40 = -15.*h1 + 7.*h2 - h3;
3186 p50 = 6.*h1 - 3.*h2 + h3 / 2.;
3189 h1 = p3d[2].
getZ() - p00 - p01 - p02;
3190 h2 = zv[2] - p01 - zvv[0];
3191 h3 = zvv[2] - zvv[0];
3192 p03 = 10.*h1 - 4.*h2 + h3 / 2.;
3193 p04 = -15.*h1 + 7.*h2 - h3;
3194 p05 = 6.*h1 - 3.*h2 + h3 / 2.;
3196 p41 = 5. * lv * cstheta * p50 / lu;
3197 p14 = 5. * lu * cstheta * p05 / lv;
3200 h1 = zv[1] - p01 - p11 - p41;
3201 h2 = zuv[1] - p11 - 4.*p41;
3206 h1 = zu[2] - p10 - p11 - p14;
3207 h2 = zuv[2] - p11 - 4.*p14;
3217 g1 = ee*g*(3.*fg + 2.*eh);
3218 g2 = e*gg*(2.*fg + 3.*eh);
3220 h1 = -5.*ee*ee*f*p50 -
3221 ee*e*(fg + eh)*p41 -
3222 gg*g*(fg + 4 * eh) -
3225 h2 = zvv[1] / 2. - p02 - p12;
3226 h3 = zuu[2] / 2. - p20 - p21;
3228 p22 = (g1*h2 + g2*h3 - h1) / (g1 + g2);
3233 coef[0] = p00; coef[1] = p01; coef[2] = p02; coef[3] = p03; coef[4] = p04; coef[5] = p05;
3234 coef[6] = p10; coef[7] = p11; coef[8] = p12; coef[9] = p13; coef[10] = p14;
3235 coef[11] = p20; coef[12] = p21; coef[13] = p22; coef[14] = p23;
3236 coef[15] = p30; coef[16] = p31; coef[17] = p32;
3237 coef[18] = p40; coef[19] = p41;
3241 coef[21] = ap; coef[22] = bp; coef[23] = cp; coef[24] = dp;
3242 coef[25] = p3d[0].
getX(); coef[26] = p3d[0].
getY();
3262 for (nlin = flin; nlin <= llin; nlin++)
3264 for (ncol = fcol; ncol <= lcol; ncol++)
3266 cg = m_rst->getGrid()->gridToGeo(ncol, nlin);
3269 if (!(ContainsPoint(triid, pg)))
3271 m_rst->setValue(static_cast<unsigned int>(ncol), static_cast<unsigned int>(nlin), zvalue);
3283 te::gm::Point llpt(std::numeric_limits< double >::max(), std::numeric_limits< double >::max());
3284 te::gm::Point urpt(-std::numeric_limits< double >::max(), -std::numeric_limits< double >::max());
3285 for (
size_t j = 0; j < 3; j++)
3287 llpt =
Min(llpt, m_node[static_cast<unsigned int>(nodesid[j])].getNPoint());
3288 urpt =
Max(urpt, m_node[static_cast<unsigned int>(nodesid[j])].getNPoint());
3292 cg = m_rst->getGrid()->geoToGrid(llpt.
getX(), llpt.
getY());
3295 cg = m_rst->getGrid()->geoToGrid(urpt.
getX(), urpt.
getY());
3299 if ((static_cast<int32_t>(m_rst->getNumberOfColumns()) <= fcol) || (lcol < 0) ||
3300 (static_cast<int32_t>(m_rst->getNumberOfRows()) <= flin) || (llin < 0))
3307 if (static_cast<int32_t>(m_rst->getNumberOfColumns()) <= lcol)
3308 lcol =
static_cast<int32_t
>(m_rst->getNumberOfColumns()) - 1;
3309 if (static_cast<int32_t>(m_rst->getNumberOfRows()) <= llin)
3310 llin =
static_cast<int32_t
>(m_rst->getNumberOfRows()) - 1;
static te::dt::TimeDuration td(20, 30, 50, 11)
void insert(const kdKey &key, const kdDataItem &item)
It inserts the data with a given key in tree.
void setAutoNumber(bool a)
It tells if the property is an autonumber or not.
std::size_t getNumGeometries() const
It returns the number of geometries in this GeometryCollection.
int32_t m_nodeto
last node number
bool ExchangePolygon(int32_t oldPolyId, int32_t newPolyId)
Method for exchange polygons in the triangulation.
int32_t getRightPolygon()
bool CheckTopology()
Method that check the topology in a triangulation.
MultiPolygon is a MultiSurface whose elements are Polygons.
bool setEdge(int32_t edge)
int32_t FindTriangle(te::gm::Point &ptr1)
Method that finds a triangle containing a given point.
void add(te::dt::Property *p)
It adds a property to the list of properties of the primary key.
void setGeometry(std::size_t i, te::gm::Geometry *value)
It sets the value of the i-th property.
bool TrianglePoints(int32_t triangId, te::gm::Point *vertex)
Method that reads the vertex (points) of a given triangle.
void setSRID(int srid)
It sets the spatial reference system identifier associated to this property.
bool TriangleSecondDeriv()
Method that calculates the second derivatives in the nodes of a given triangle.
void setDouble(std::size_t i, double value)
It sets the value of the i-th property.
bool ContainsPoint(int32_t triangId, te::gm::Point &pt)
Method that verifies if a triangle contains a given point.
An atomic property like an integer or double.
bool FillGridValue(int32_t triid, int32_t flin, int32_t llin, int32_t fcol, int32_t lcol, double zvalue)
Method that fills the grid locations, inside a triangle, with a zvalue.
bool operator==(const TinLine &rhs) const
int32_t PreviousNode(int32_t nodeId)
Method that finds out which is the previous node.
bool NodeSecondDeriv()
Method that calculates the second derivative at all triangulation nodes.
bool NodesId(int32_t triangId, int32_t *nodeIds)
Method that reads the identification number of the nodes of a given triangle.
boost::shared_ptr< DataSource > DataSourcePtr
bool operator<(const TinNode &rhs) const
bool NodeDerivatives()
Method that calculates the first and second derivatives in the nodes of a given triangle.
A class that represents an R-tree.
bool CalcZvalueAkima(int32_t triid, te::gm::Point &pt1, te::gm::Point &pt2)
Method that evaluates Z values for pt1 and pt2 using the Akima polynomium fitted in a triangle...
A class that models the description of a dataset.
Curve is an abstract class that represents 1-dimensional geometric objects stored as a sequence of co...
virtual const char * what() const
It outputs the exception message.
TEMNTEXPORT te::gm::Point Max(te::gm::Point &p1, te::gm::Point &p2)
bool NodeLines(int32_t v, std::vector< int32_t > &linids)
Method that includes a node in the tin line list.
bool ExchangeNode(int32_t oldNodeId, int32_t newNodeId)
Method for exchange nodes in the triangulation.
bool NodeFirstDeriv()
Method that calculates the first derivatives in the nodes of a given triangle.
This class can be used to inform the progress of a task.
std::unique_ptr< Point > getPointN(std::size_t i) const
It returns the specified point in this LineString.
bool removeEdge(int32_t edge)
An utility struct for representing 2D coordinates.
double getY() const
It returns the y-coordinate.
bool LoadTinQGIS(te::da::DataSourcePtr &inDsrc, std::string &inDsetName, double zmin, double zmax)
Method used to load a triangular network (TIN) generated by QGIS.
TEMNTEXPORT double pointToSegmentDistance(te::gm::Point &fseg, te::gm::Point &lseg, te::gm::Point &pt, te::gm::Point *pti)
#define TE_TR(message)
It marks a string in order to get translated.
bool SwapPolygon()
Method for swap two adjacent polygons.
bool operator>(const TinLine &rhs) const
bool SwapNode()
Method for swap two nodes.
bool CalcTriangleSecondDeriv(std::vector< int32_t > &triangles, std::vector< te::gm::Point > &fderiv)
Method that calculates the second derivatives in a node of a given triangle.
bool isActive() const
Verify if the task is active.
bool NodeClosestPoints(int32_t nid, int32_t *clstNids, bool useBrNode=true)
Method that searches the closest points of a specific node.
bool operator==(const TinNode &rhs) const
bool DefineInterLinesColumns(int32_t *nodesid, int32_t &flin, int32_t &llin, int32_t &fcol, int32_t &lcol)
Method that calculates the lines and the columns intercepted by a triangle.
int32_t OppositeNode(int32_t triangId, int32_t linId)
Method that reads the identification number of the opposite node of a given edge. ...
bool BuildTriangle(int32_t id, te::gm::LinearRing *lr, double *val, int32_t *right, int32_t *left, te::mnt::Ntype *type, double zmin, double zmax, bool &first, KD_TREE &nodetree, te::sam::rtree::Index< std::size_t > &linetree)
void setInt32(std::size_t i, boost::int32_t value)
It sets the value of the i-th property.
TEVPEXPORT void Save(te::da::DataSource *source, te::da::DataSet *result, te::da::DataSetType *outDsType, const bool &enableProgress=true)
A LinearRing is a LineString that is both closed and simple.
bool SwapNodePolygon()
Method for swap two nodes and two adjacent polygons.
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
const double & getY() const
It returns the Point y-coordinate value.
A point with x and y coordinate values.
const Envelope * getMBR() const _NOEXCEPT_OP(true)
It returns the minimum bounding rectangle for the geometry in an internal representation.
An Envelope defines a 2D rectangular region.
bool NodeOppositeLines(int32_t v, std::vector< int32_t > &linids)
Method that find the oposite lines of a specific node.
bool NeighborsId(int32_t triangId, int32_t *neighsId)
void Init(te::gm::Point &npoint, Ntype ntype=Normalnode)
Set node coordinates and height.
int32_t m_leftpoly
left polygon number
int32_t m_rightpoly
right polygon number
static te::dt::DateTime d(2010, 8, 9, 15, 58, 39)
TERASTEREXPORT int Round(double val)
Round a double value to a integer value.
void setEnvelope(te::gm::Envelope &env)
void pulse()
Calls setCurrentStep() function using getCurrentStep() + 1.
A class that represents a two dimensional K-d Tree (2-d Tree).
int search(const te::gm::Envelope &mbr, std::vector< DATATYPE > &report) const
Range search query.
bool BreakNodeSecondDeriv()
Method that calculates the second derivative at all triangulation break nodes.
Utility functions for the data access module.
int32_t NextNode(int32_t nodeId)
Method that finds out which is the next node.
const double & getZ() const
It returns the Point z-coordinate value, if it has one or DoubleNotANumber otherwise.
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
te::da::DataSetType * GetDataSetType(std::string &outDsetName)
int32_t OppositeEdge(int32_t triangId, int32_t nodeId)
Method that reads the identification number of the opposite edge of a given node. ...
bool BreakTriangleSecondDeriv()
Method that calculates the second derivatives in the nodes of a given break triangle.
Geometry * getGeometryN(std::size_t i) const
It returns the n-th geometry in this GeometryCollection.
void add(Constraint *c)
It adds a new constraint.
An implementation of the DatasetItem class for the TerraLib In-Memory Data Access driver...
bool operator>(const TinNode &rhs) const
bool TriangleFirstDeriv()
Method that calculates the first derivatives in the nodes of a given triangle.
Polygon is a subclass of CurvePolygon whose rings are defined by linear rings.
double getX() const
It returns the x-coordinate.
bool SaveTin(te::da::DataSourcePtr &outDsrc, std::string &outDsetName)
void setX(const double &x)
It sets the Point x-coordinate value.
int32_t NodeId(int32_t triangId, short vertex)
Method that reads the identification number of the nodes of a given triangle.
void insert(const te::gm::Envelope &mbr, const DATATYPE &data)
It inserts an item into the tree.
te::gm::Point CalcNodeFirstDeriv(int32_t nodeId, int32_t clstNodes[CLNODES])
Method that calculates the first derivative in a given node.
It describes a primary key (pk) constraint.
bool NodeNodes(int32_t v, std::vector< int32_t > &nodids)
Method that includes a node in the tin node list.
int32_t NodeTriangle(int32_t v)
Method that search a node in a triangulation.
bool NodeTriangles(int32_t v, std::vector< int32_t > &triangles)
Method that includes a node in a triangle list.
TEMNTEXPORT short segIntersect(te::gm::Point &pfr, te::gm::Point &pto, te::gm::Point &lfr, te::gm::Point <o)
Function for check segment intersection.
TinNode CalcNodeSecondDeriv(int32_t nodeId, int32_t clstNIds[CLNODES])
Method that calculates the second derivative in a given node.
bool LoadTin(te::da::DataSourcePtr &inDsrc, std::string &inDsetName, double zmin=std::numeric_limits< double >::min(), double zmax=std::numeric_limits< double >::max())
Method used to load a triangular network (TIN)
const double & getZ(std::size_t i) const
It returns the n-th z coordinate value.
TEDATAACCESSEXPORT DataSetType * GetDataSetType(const std::string &name, const std::string &datasourceId)
TEMNTEXPORT te::gm::Point Min(te::gm::Point &p1, te::gm::Point &p2)
TEDATAACCESSEXPORT std::size_t GetFirstPropertyPos(const te::da::DataSet *dataset, int datatype)
void setY(const double &y)
It sets the Point y-coordinate value.
te::gm::Point m_point
Node point.
bool operator<(const TinLine &rhs) const
void search(const te::gm::Envelope &e, std::vector< KdTreeNode * > &report) const
Range search query.
It is a collection of other geometric objects.
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
int32_t m_nodefrom
initial node number
TEMNTEXPORT bool triangleNormalVector(te::gm::Point *, double *)
Function that defines the triangle normal vector.
bool ReallocateVectors(size_t nSize)
Method that reallocates Vectors.
bool DefineAkimaCoeficients(int32_t triid, double *coef)
Method that defines the coefficients of the Akima polynomium fitted in a given triangle.
const double & getX() const
It returns the Point x-coordinate value.
bool fncomp(te::mnt::TinNode lhs, te::mnt::TinNode rhs)
This file contains a class to define a TIN. Adapted from SPRING.
void setPrimaryKey(PrimaryKey *pk)
It sets the primary key constraint.
bool BreakNodeClosestPoints(int32_t nid, int32_t *rClstNids, int32_t *lClstNids)
Method that searches the Break node closest points.
Curve * getRingN(std::size_t i) const
It returns the n-th ring for this curve polygon as a curve.
void setZ(const double &z)
It sets the Point z-coordinate value.
bool CheckLines(int32_t trid)
Method that check the lines in a triangulation.
std::vector< int32_t > FindLine(int32_t nid)
Method that find a line containing a specific node.