Forked from
gmsh / gmsh
11310 commits behind the upstream repository.
-
Christophe Geuzaine authoredChristophe Geuzaine authored
LongitudeLatitude.cpp 3.98 KiB
// Gmsh - Copyright (C) 1997-2013 C. Geuzaine, J.-F. Remacle
//
// See the LICENSE.txt file for license information. Please report all
// bugs and problems to the public mailing list <gmsh@geuz.org>.
#include "LongitudeLatitude.h"
#include "OpenFile.h"
StringXNumber LongituteLatitudeOptions_Number[] = {
{GMSH_FULLRC, "View", NULL, -1.}
};
extern "C"
{
GMSH_Plugin *GMSH_RegisterLongituteLatitudePlugin()
{
return new GMSH_LongituteLatitudePlugin();
}
}
std::string GMSH_LongituteLatitudePlugin::getHelp() const
{
return "Plugin(LongituteLatitude) projects the view `View' "
"in longitude-latitude.\n\n"
"If `View' < 0, the plugin is run on the current view.\n\n"
"Plugin(LongituteLatitude) is executed in place.";
}
int GMSH_LongituteLatitudePlugin::getNbOptions() const
{
return sizeof(LongituteLatitudeOptions_Number) / sizeof(StringXNumber);
}
StringXNumber *GMSH_LongituteLatitudePlugin::getOption(int iopt)
{
return &LongituteLatitudeOptions_Number[iopt];
}
PView *GMSH_LongituteLatitudePlugin::execute(PView *v)
{
int iView = (int)LongituteLatitudeOptions_Number[0].def;
PView *v1 = getView(iView, v);
if(!v1) return v;
PViewData *data1 = v1->getData();
// tag all the nodes with "0" (the default tag)
for(int step = 0; step < data1->getNumTimeSteps(); step++){
for(int ent = 0; ent < data1->getNumEntities(step); ent++){
for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
if(data1->skipElement(step, ent, ele)) continue;
for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
data1->tagNode(step, ent, ele, nod, 0);
}
}
}
double gxmin = 180, gxmax = -180, gymin = 90, gymax = -90;
// transform all "0" nodes
for(int step = 0; step < data1->getNumTimeSteps(); step++){
for(int ent = 0; ent < data1->getNumEntities(step); ent++){
for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
if(data1->skipElement(step, ent, ele)) continue;
int nbComp = data1->getNumComponents(step, ent, ele);
double vin[3], vout[3];
double xmin = M_PI, xmax = -M_PI;
for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++){
double x, y, z;
int tag = data1->getNode(step, ent, ele, nod, x, y, z);
if(!tag){
double x2, y2, z2;
z2 = sqrt(x * x + y * y + z * z);
y2 = asin(z / z2);
x2 = atan2(y, x);
xmin=std::min(x2, xmin);
xmax=std::max(x2, xmax);
gxmin = std::min(x2 * 180 / M_PI, gxmin);
gxmax = std::max(x2 * 180 / M_PI, gxmax);
gymin = std::min(y2 * 180 / M_PI, gymin);
gymax = std::max(y2 * 180 / M_PI, gymax);
data1->setNode(step, ent, ele, nod, x2 * 180 / M_PI, y2 * 180 / M_PI, 0);
data1->tagNode(step, ent, ele, nod, 1);
if(nbComp == 3){
for(int i = 0; i < 3; i++)
data1->getValue(step, ent, ele, nod, i, vin[i]);
vout[0] = -sin(x2) * vin[0] + cos(x2) * vin[1];
vout[1] =
-sin(y2) * (cos(x2) * vin[0] + sin(x2) * vin[1]) +
cos(y2) * vin[2];
vout[2] =
cos(y2) * (cos(x2) * vin[0] + sin(x2) * vin[1]) +
sin(y2) * vin[2];
for(int i = 0; i < 3; i++)
data1->setValue(step, ent, ele, nod, i, vout[i]);
}
}
}
if(xmax - xmin > M_PI){ // periodicity check (broken for continuous views)
for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++){
double x, y, z;
data1->getNode(step, ent, ele, nod, x, y, z);
if(xmax * 180 / M_PI - x > 180) x += 360;
data1->setNode(step, ent, ele, nod, x, y, z);
}
}
}
}
}
data1->destroyAdaptiveData();
data1->finalize();
SetBoundingBox();
SBoundingBox3d bb(gxmin, gymin, 0, gxmax, gymax, 0);
data1->setBoundingBox(bb);
v1->setChanged(true);
return v1;
}