Re[5]: Падение доллара и цена шаровары
От: flаt  
Дата: 20.04.25 17:20
Оценка:
Здравствуйте, PeterOne, Вы писали:

PO>На 1 февраля 2022 М2 была 66 трл руб. А на 1 февраля 2025 уже 117 трлн руб. До 2022 темпы прироста М2 были около 8% в год, а сейчас около 20%


Было 66, стало 117. Прирост 20%?
Re[11]: Падение доллара и цена шаровары
От: flаt  
Дата: 20.04.25 17:23
Оценка:
Здравствуйте, falcoware, Вы писали:


Говнокод. Писал либо разработчик, который не знает С++ (и не хочет знать), либо не разработчик.
Re[6]: Падение доллара и цена шаровары
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 20.04.25 17:26
Оценка:
Здравствуйте, flаt, Вы писали:

PO>>На 1 февраля 2022 М2 была 66 трл руб. А на 1 февраля 2025 уже 117 трлн руб. До 2022 темпы прироста М2 были около 8% в год, а сейчас около 20%


F>Было 66, стало 117. Прирост 20%?


21% в год. Сложный процент: 1.21*1.21*1.21=1.771561. 66*1.771561=116.9. Ну да, не 20%, а 21%
Маньяк Робокряк колесит по городу
Re[7]: Падение доллара и цена шаровары
От: flаt  
Дата: 20.04.25 17:31
Оценка:
Здравствуйте, Marty, Вы писали:

PO>>>На 1 февраля 2022 М2 была 66 трл руб. А на 1 февраля 2025 уже 117 трлн руб. До 2022 темпы прироста М2 были около 8% в год, а сейчас около 20%


Я только собрался спорить о степенях, но понял, что я год неверно прочитал: мне показалось, что 2024 За три года — всё верно, да. Спасибо.
Re[12]: Падение доллара и цена шаровары
От: falcoware Россия https://falcoware.com/rus/
Дата: 20.04.25 17:32
Оценка: -1
Здравствуйте, flаt, Вы писали:

F>Здравствуйте, falcoware, Вы писали:



F>Говнокод. Писал либо разработчик, который не знает С++ (и не хочет знать), либо не разработчик.


А тут что скажешь?

// MercatorGlobe.cpp: implementation of the CMercatorGlobe class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SPM CUDA.h"

#include "MercatorGlobe.h"
#include <math.h>

#include "IniSet.h"
#include "Scene.h"

#include <gl\gl.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define FF_IS_CALC 128
#define FF_TR_EXT 64
#define FF_TR_X_Y 32
#define FF_TR_BOTTM 16
#define FF_TR_LEFT 8
#define FF_ON_MAP 4
#define FF_SMOOTH 2
#define FF_RESERVE 1
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMercatorGlobe::CMercatorGlobe()
{
}
CMercatorGlobe::~CMercatorGlobe()
{

}

BOOL CMercatorGlobe::Init(float fSize, CIniSet *pIniSet, CScene *pScene)
{
m_pIniSet = pIniSet;
// m_pRendView = pRendView;
m_pScene = pScene;
fRadius = fSize;

int np, nm;
float fAlpha = 0.f;
float fGamma = 0.f;
float fEpsilon = PI_LB / 2000.f; // fEpsilon guarantees The calculating of reconversion correct
float fDeltaAlpha = 2.f * PI_LB / float(pIniSet->nMeridians);
float fDeltaGamma = (PI_LB — 2 * fEpsilon) / float(pIniSet->nParallels + 1);

Globe.Set(pIniSet->nMeridians + 1, pIniSet->nParallels + 2);
if(!pIniSet->m_mtGlobe.MemorySize()){
pIniSet->m_mtGlobe.Set(pIniSet->nMeridians + 1, pIniSet->nParallels + 2);
pIniSet->m_mtGlobeColors.Set(pIniSet->nMeridians + 1, pIniSet->nParallels + 2);
}

TranformGlobe.Set(pIniSet->nMeridians + 1, pIniSet->nParallels + 2);

mtSavedTranform.Set(pIniSet->nMeridians + 1, pIniSet->nParallels + 2);

for(fGamma = fEpsilon * 0.99f, np = 0; np < pIniSet->nParallels + 2; np++, fGamma += fDeltaGamma){
for(fAlpha = HALFPI, nm = 0; nm < pIniSet->nMeridians + 1; nm++, fAlpha += fDeltaAlpha){
point3d ptPos = { fSize * (float)sin(fGamma) * (float)cos(fAlpha),
fSize * (float)sin(fGamma) * (float)sin(fAlpha),
fSize * (float)cos(fGamma)};
Globe.e(nm, np) = ptPos;// Formulas received from [1 page 3, eq. 1.3]
ptPos.x /= fSize;
ptPos.y /= fSize;
ptPos.z /= fSize;

float fTemp = ptPos.y;
ptPos.y = ptPos.x;
ptPos.x = ptPos.z;
ptPos.z = fTemp;

pIniSet->m_mtGlobe.e(nm, np) = ptPos;
}
}

return TRUE;
}

void CMercatorGlobe::CreateEarth()
{
CString sPathEarth = m_pScene->m_sExePath + "_ImagesCarthographic\\Earth.bmp";
m_cbmpEarth.Load(sPathEarth.GetBuffer());

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

glGenTextures(1, &m_nEarth);
glBindTexture(GL_TEXTURE_2D, m_nEarth);
glEnable(GL_TEXTURE_2D);

glPixelStorei(GL_PACK_ALIGNMENT, 1);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, m_cbmpEarth.SizeX(), m_cbmpEarth.SizeY(), GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)m_cbmpEarth.Memory());

CString sPathEarthBright = m_pScene->m_sExePath + "_ImagesCarthographic\\EarthBright.bmp";
m_cbmpEarthBright.Load(sPathEarthBright.GetBuffer());

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

glGenTextures(1, &m_nEarthBright);
glBindTexture(GL_TEXTURE_2D, m_nEarthBright);
glEnable(GL_TEXTURE_2D);

glPixelStorei(GL_PACK_ALIGNMENT, 1);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, m_cbmpEarthBright.SizeX(), m_cbmpEarthBright.SizeY(), GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)m_cbmpEarthBright.Memory());
}

#define ANM 20.0f
void CMercatorGlobe::TransToGeod(point3d *pPoint)
{
if(m_pIniSet->nViewMode != PP_CARTOGRAPHIC_PLOT) return;

// Transform from cartesian position to Geodetic position
float fX = pPoint->z;
float fY = pPoint->x;
float fZ = pPoint->y;// yes: zxy
float fP = sqrt(fX * fX + fY * fY);
float fFi, fGm = atan2(fY , fX);
fFi = atan( fZ / fP );// Formulas received from [1]
fFi = RadToDeg(fFi);// fFi has framework { -90.. 90}
fGm = RadToDeg(fGm);// fGm has framework {-180..180}

bFl_Point2 = bFl_Point1; // kind of place of second point
bFl_Point1 = 0; // Clear flages of first point
// set kind of place of first point
if(fFi < 0.f) bFl_Point1 |= FF_TR_BOTTM;
if(fGm < 0.f) bFl_Point1 |= FF_TR_LEFT;
if(fabs(fGm) < 90.f) bFl_Point1 |= FF_TR_EXT;

if(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP || m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_70){
if (fFi > 80.f) fFi = 80.f;
if (fFi < -80.f) fFi = -80.f;
fFi = log(tan(0.785398 * (1.f + fFi / 90.f))) * 57.2958;
}// Formulas received from [1 page 50]

if(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_ENHANC){
if(fFi > 0.f) { fFi = fEnhan * (1.f — exp(- 0.05f * fabs(fFi)) ); }
else { fFi = -fEnhan * (1.f — exp(- 0.01f * fabs(fFi)) ); }
}// This formula was made by experiment way

float fangle = fGm;
if(fGm < 0.f) fangle = fGm + 360.f;

if(m_pIniSet->bAnimationMap){
// This part of code implemented for animation
if(fangle < ANM){
bFl_Point1 |= FF_SMOOTH;
bFl_Point1 |= FF_ON_MAP;
float fMult = fabs(fangle) / ANM;
pPoint->y = (1.f — fMult) * fFi / PP_SIZE_CARTOG_SCALE + fMult * pPoint->y;
pPoint->x = (1.f — fMult) * fGm / PP_SIZE_CARTOG_SCALE + fMult * pPoint->x;
pPoint->z = 0.f;// fMult * pPoint->z + (1.f — fMult) * m_pIniSet->nSpaceCubeSize;// / 2.f;
}

if(fangle > m_pScene->fAnimal_Angle) {
if(m_pScene->fAnimal_Angle != 0.f){
if(fGm > 0.f) fGm -= 360.f;
}
bFl_Point1 |= FF_ON_MAP;
pPoint->y = fFi / PP_SIZE_CARTOG_SCALE;
pPoint->x = fGm / PP_SIZE_CARTOG_SCALE;
pPoint->z = 0.f;//m_pIniSet->nSpaceCubeSize;// / 2.f;
}
}
else{
bFl_Point1 |= FF_ON_MAP;
pPoint->y = fFi / PP_SIZE_CARTOG_SCALE;//for rectangle: (-90 ,90)
pPoint->x = fGm / PP_SIZE_CARTOG_SCALE;//for rectangle: (-180, 180)
pPoint->z = 0.f;
}
}

void CMercatorGlobe::Map_Draw()
{
if(m_pIniSet->bGlobeMode == WS_INVISIBLE && m_pIniSet->bGlobeSkinMode == WS_INVISIBLE && m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH_OFF) { return; }

// arrTriangles.FreeData();
arrLines.FreeData();

glDisable(GL_LIGHTING);
glLineWidth(m_pIniSet->fNormalWidthLine);

// CColor24 col = m_pIniSet->GetGlobeSkinColor();
// if(m_pIniSet->bGlobeMode == WS_SOLID){
// col = CColor24(0, 0, 0);
// }

CColor24 col = m_pScene->m_cSpaceGlobeWiresColor;

if (m_pIniSet->nDrawMode == PP_3D_VIEWPORT) {
col = m_pScene->m_cSpaceGlobeWires3DViewColor;
}

if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
col = m_pScene->m_cSpaceGlobeWire2DViewColor;
}

int nTransp;
CHOICE_COLOR_MODE(nTransp, m_pIniSet->nInlayTransp, m_pIniSet->bAppColorMode)

glDisable(GL_LIGHTING);
glDisable(GL_COLOR_MATERIAL);
glEnable(GL_BLEND);
glEnable(GL_COLOR_MATERIAL);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glAlphaFunc(GL_GREATER, .0001f);
glEnable(GL_ALPHA_TEST);

glColor4f(col.R(), col.G(), col.B(), m_pIniSet->fGlobeTrasparent);
glDepthFunc(GL_LEQUAL);
glDisable(GL_CULL_FACE);

// if((m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && (m_pIniSet->nDrawMode != PP_2D_PLOT)){
// glDepthFunc(GL_LEQUAL);
// }

int ix, jx, nSzX = Globe.SizeX(), nSzY = Globe.SizeY();
fEnhan = 180.f / m_pScene->pixel_sz;

mtSaved.Set(nSzX, nSzY);
memcpy(mtSaved.Memory(), Globe.Memory(), Globe.MemorySize());

// if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT){
// for (ix = 0; ix < nSzX; ix++) {
// for (int iy = 0; iy < nSzY; iy++) {
// transform_point(&mtSaved.e(ix, iy), &Globe.e(ix, iy), &m_pScene->m_mtCartho);
// }
// }
// }
// else {
for (ix = 0; ix < nSzX; ix++) {
for (int iy = 0; iy < nSzY; iy++) {
transform_point(&mtSaved.e(ix, iy), &Globe.e(ix, iy), &m_pScene->m_mtMatrix);

if ((m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && m_pIniSet->m_bCarthPlaneView){
transform_point(&mtSaved.e(ix, iy), &mtSaved.e(ix, iy), &m_pScene->m_mtCartho);
}

if ((m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && (m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP)) {
matrix mtMatr; // hack!
ident_matrix(&mtMatr);
rotate_matrix(&mtMatr, 0.00, 0.00, 0.0001);
transform_point(&mtSaved.e(ix, iy), &mtSaved.e(ix, iy), &mtMatr);
}
}
}
// }

if((m_pIniSet->bCheckCarthoMode || m_pIniSet->bCheckCarthoFixedMode || m_pIniSet->bCheckCarthoCylinderMode || m_pScene->IsCarthoMatrixRotated()) && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && !m_pIniSet->bCheckCarthoCylinderMode){
if(m_pIniSet->nDrawMode == PP_2D_PLOT){
float fX = m_pScene->m_mtCartho.m[1][0];
float fY = m_pScene->m_mtCartho.m[1][1];
float fDelta = sqrt(fX * fX + fY * fY);
glPushMatrix();
glScalef(1.f, fDelta, 1.f);
}
else{
glPushMatrix();
glMultMatrixf(&m_pScene->m_mtCartho.m[0][0]);
}
}

// Drawing of Meridians ...
for(ix = 0; ix < nSzX; ix++){
point3d ptPos1, ptPos2 = mtSaved.e(ix, 0);//nSzY — 1);
TransToMap(&ptPos2);

// The points of globe will be transform in map by this function
// if(!m_pIniSet->bAseExport){
// TranformGlobe.e(ix, 0) = m_pScene->ConvertPos2D(ptPos2);
// }else{
TranformGlobe.e(ix, 0) = ptPos2;
// }

CColor24 cCol2 = m_pIniSet->m_mtGlobeColors.e(ix, 0);

for(jx = 1; jx < nSzY; jx++){
ptPos1 = mtSaved.e(ix, jx);
CColor24 cCol1 = m_pIniSet->m_mtGlobeColors.e(ix, jx);

TransToMap(&ptPos1);

ptPos2 = ptPos1;
cCol2 = cCol1;
TranformGlobe.e(ix, jx) = ptPos1;
}
}

// Drawing of Paralells ...
for(ix = 0; ix < nSzY; ix++){
point3d ptPos1, ptPos2 = mtSaved.e(0, ix);//nSzX — 1

TransToMap(&ptPos2);

// if(!m_pIniSet->bAseExport){
// TranformGlobe.e(0, ix) = m_pScene->ConvertPos2D(ptPos2);
// }else{
TranformGlobe.e(0, ix) = ptPos2;
// }

CColor24 cCol2 = m_pIniSet->m_mtGlobeColors.e(0, ix);

for(jx = 1; jx < nSzX; jx++){
ptPos1 = mtSaved.e(jx, ix);
CColor24 cCol1 = m_pIniSet->m_mtGlobeColors.e(jx, ix);

TransToMap(&ptPos1);

ptPos2 = ptPos1;
cCol2 = cCol1;
TranformGlobe.e(jx, ix) = ptPos1;
}
}

if(m_pIniSet->bCheckCarthoCylinderMode && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)){

if(m_pIniSet->nDrawMode != PP_2D_PLOT){
// glPushMatrix();
// glMultMatrixf(&m_pIniSet->mtCylinderMode.m[0][0]);
}

// 1. Find the center.
point3d ptCenter = { 0.f, 0.f, 0.f };

float fMaxLength = 0.f;
for(ix = 0; ix < nSzX; ix++){
for(jx = 0; jx < nSzY; jx++){
float fLen = fabs(TranformGlobe.e(ix, jx).x — ptCenter.x);
if(fLen > fMaxLength){
fMaxLength = fLen;
}
}
}

// CString s;
// s.Format("%f", fMaxLength);
// AfxMessageBox(s);

// Rotate.
for(ix = 0; ix < nSzX; ix++){
for(jx = 0; jx < nSzY; jx++){
TranformGlobe.e(ix, jx) = TransformCylinderPoint(TranformGlobe.e(ix, jx), ptCenter, fMaxLength);
}
}

CalcObjectProjectPoints(ptCenter, fMaxLength);
}

float fMinX = 0.f;
float fMinY = 0.f;
float fMaxX = 0.f;
float fMaxY = 0.f;

if (m_pIniSet->bObjsTransProcess) {
point3d vtVect, vtVect1;
for (int ix = 0; ix < nSzX; ix++) {
for (int jx = 0; jx < nSzY; jx++) {
vtVect = TranformGlobe.e(ix, jx);
vtVect1 = mtSavedTranform.e(ix, jx);
point3d vt;
sub_vectors(&vt.x, &vtVect1.x, &vtVect.x);
scale_vect(&vt.x, float(m_pIniSet->m_nObjsTrans) / float(m_pIniSet->nFrameTrans));
point3d ptPos;
add_vectors(&ptPos.x, &vtVect.x, &vt.x);

TranformGlobe.e(ix, jx) = ptPos;
}
}
}

int n70Offset1 = 0;
if (m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_70) {
n70Offset1 = 2;
}

if (m_pIniSet->bGlobeSkinMode == WS_WIRE_FRAME || m_pIniSet->bGlobeMode == WS_TRANSPARENT) {
// Drawing of Meridians ...

MyArray<float> arrValuesY;

for (ix = 0; ix < nSzX; ix++) {
point3d ptPos1, ptPos2 = TranformGlobe.e(ix, 0 + n70Offset1);
CColor24 cCol2 = m_pIniSet->m_mtGlobeColors.e(ix, 0 + n70Offset1);

if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos2.z /= 100.f;
}

for (jx = 0 + n70Offset1; jx < nSzY — n70Offset1; jx++) {
ptPos1 = TranformGlobe.e(ix, jx);

if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos1.z /= 100.f;
}

if (0 && m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT && m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos1.z = ptPos2.z = -0.005f;
}

if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) {
ptPos1.z = ptPos2.z = 0.005f;
}

CColor24 cCol1 = m_pIniSet->m_mtGlobeColors.e(ix, jx);
if ((m_pIniSet->bGlobeMode == WS_CODED) || (m_pIniSet->bGlobeMode == WS_CODED_TRASPARENT) || (m_pIniSet->bGlobeMode == WS_WIRE_FRAME)) {
Map_Line_Draw(&ptPos1, &ptPos2, &cCol1, &cCol2);
}
else {
Map_Line_Draw(&ptPos1, &ptPos2);
}

// if (!m_pIniSet->bObjsTransProcess) {
mtSavedTranform.e(ix, jx) = ptPos1;
// }

if (fMinX > ptPos1.x) {
fMinX = ptPos1.x;
}
if (fMinX > ptPos2.x) {
fMinX = ptPos2.x;
}

if (fMaxX < ptPos1.x) {
fMaxX = ptPos1.x;
}
if (fMaxX < ptPos2.x) {
fMaxX = ptPos2.x;
}

if (fMinY > ptPos1.y) {
fMinY = ptPos1.y;
}
if (fMinY > ptPos2.y) {
fMinY = ptPos2.y;
}

if (fMaxY < ptPos1.y) {
fMaxY = ptPos1.y;
}
if (fMaxY < ptPos2.y) {
fMaxY = ptPos2.y;
}

ptPos2 = ptPos1;
cCol2 = cCol1;
}
}

// Drawing of Paralells ..
for (ix = 0 + n70Offset1; ix < nSzY — n70Offset1; ix++) {
point3d ptPos1, ptPos2 = TranformGlobe.e(0, ix);
CColor24 cCol2 = m_pIniSet->m_mtGlobeColors.e(0, ix);

if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos2.z /= 100.f;
}

for (jx = 0; jx < nSzX; jx++) {
ptPos1 = TranformGlobe.e(jx, ix);

if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos1.z /= 100.f;
}

if (0 && m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT && m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos1.z = ptPos2.z = -0.005f;
}

if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) {
ptPos1.z = ptPos2.z = 0.005f;
}

CColor24 cCol1 = m_pIniSet->m_mtGlobeColors.e(jx, ix);

if (jx == nSzX — 1) {
cCol1 = cCol2 = CColor24(255, 0, 0);
}

if (m_pIniSet->bGlobeMode == WS_CODED || m_pIniSet->bGlobeMode == WS_CODED_TRASPARENT || m_pIniSet->bGlobeMode == WS_WIRE_FRAME) {
Map_Line_Draw(&ptPos1, &ptPos2, &cCol1, &cCol2);
}
else {
Map_Line_Draw(&ptPos1, &ptPos2);
}

// if (!m_pIniSet->bObjsTransProcess) {
// mtSavedTranform.e(jx, ix) = ptPos1;
// }

if (fMinX > ptPos1.x) {
fMinX = ptPos1.x;
}
if (fMinX > ptPos2.x) {
fMinX = ptPos2.x;
}

if (fMaxX < ptPos1.x) {
fMaxX = ptPos1.x;
}
if (fMaxX < ptPos2.x) {
fMaxX = ptPos2.x;
}

if (fMinY > ptPos1.y) {
fMinY = ptPos1.y;
}
if (fMinY > ptPos2.y) {
fMinY = ptPos2.y;
}

if (fMaxY < ptPos1.y) {
fMaxY = ptPos1.y;
}
if (fMaxY < ptPos2.y) {
fMaxY = ptPos2.y;
}

ptPos2 = ptPos1;
cCol2 = cCol1;
}
}
}

if (m_pIniSet->m_bMarkDegreesGlobe && m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)
{
if (m_pIniSet->nViewMode2d == PP_MERCATOR_MAP) {
n70Offset1 = 1;
}

CColor24 col;
if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
col = m_pScene->m_cDegreeMarkers2DPlot;
}
if (m_pIniSet->nDrawMode == PP_3D_PLOT) {
col = m_pScene->m_cDegreeMarkers3DPlot;
}
if (m_pIniSet->nDrawMode == PP_3D_VIEWPORT) {
col = m_pScene->m_cDegreeMarkers3DView;
}

if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cParallelsColor;
}

if (m_pScene->m_fV == 0.f && m_pScene->m_fH == -90.f) { // ZY Plane!
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
}
}

glColor3f(col.R(), col.G(), col.B());
MyArray<CPoint> arrPoints;

if (m_pScene->m_fV == 90.f && m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP) {
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cParallelsColor;
}

glColor3f(col.R(), col.G(), col.B());

point3d ptPos = TranformGlobe.e(nSzX / 2, 0);
ptPos.y = fMinY + (fMaxY — fMinY) / 2.f;
ptPos.x = fMaxX;

int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
yy += m_pIniSet->m_cszMarkDegree.cy / 4;
m_pScene->Screen2World(xx, yy, ptPos);

glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);

CString s;
s.Format(" 0°");

glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());

if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
}

glColor3f(col.R(), col.G(), col.B());

ptPos.y = fMinY;
ptPos.x = fMinX + (fMaxX — fMinX) / 2.f;

m_pScene->World2Screen(ptPos, xx, yy);
yy += m_pIniSet->m_cszMarkDegree.cy * 0.9f;
xx -= m_pIniSet->m_cszMarkDegree.cx / 2;
m_pScene->Screen2World(xx, yy, ptPos);

glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);

s.Format(" 0°");

glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());

ptPos.x = fMinX + (fMaxX — fMinX) / 2.f;
ptPos.y = fMaxY;
m_pScene->World2Screen(ptPos, xx, yy);
yy -= m_pIniSet->m_cszMarkDegree.cy / 4;
xx -= m_pIniSet->m_cszMarkDegree.cx / 2;
m_pScene->Screen2World(xx, yy, ptPos);

glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);

s.Format(" 0°");

glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
else
if (m_pScene->m_fV == 0.f && m_pScene->m_fH == 0.f && m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP) {

if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
}

glColor3f(col.R(), col.G(), col.B());

point3d ptPos = TranformGlobe.e(nSzX / 2, 0);
ptPos.y = fMinY;
ptPos.x = fMinX + (fMaxX — fMinX) / 2.f;

int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
xx -= m_pIniSet->m_cszMarkDegree.cx / 2;
yy += m_pIniSet->m_cszMarkDegree.cy * 0.9f;
m_pScene->Screen2World(xx, yy, ptPos);

glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);

CString s;
s.Format(" 0°");

glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());

ptPos = TranformGlobe.e(nSzX / 2, 0);
ptPos.y = fMaxY;
ptPos.x = fMinX + (fMaxX — fMinX) / 2.f;

m_pScene->World2Screen(ptPos, xx, yy);
xx -= m_pIniSet->m_cszMarkDegree.cx / 2;
yy -= m_pIniSet->m_cszMarkDegree.cy / 4;
m_pScene->Screen2World(xx, yy, ptPos);

glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
else
for (ix = 0 + n70Offset1; ix < nSzY; ix++) {
point3d ptPos = TranformGlobe.e(0, ix);
if (ptPos.y > 0.f && (ix < nSzY / 2) && (TranformGlobe.e(0, ix + nSzY / 2).y > 0.f)) {
ptPos.y = -ptPos.y;
}

if (ptPos.y < 0.f && (ix > nSzY / 2) && (TranformGlobe.e(0, ix — nSzY / 2).y < 0.f)) {
ptPos.y = -ptPos.y;
}

ptPos.x = fMaxX;

int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
yy += m_pIniSet->m_cszMarkDegree.cy / 4;
m_pScene->Screen2World(xx, yy, ptPos);

BOOL bCross = FALSE;

for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}

if (bCross && ptPos.y != (fMaxY + fMinY) / 2.f) {
continue;
}

if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}

arrPoints.Append(CPoint(xx, yy));

glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);

CString s;

float fValue = (-180.f + 20.f * n70Offset1) / float(nSzY — 2.f * n70Offset1 — 1) * float(ix — n70Offset1 — float(nSzY — 2.f * n70Offset1 — 1) / 2.f);

if (m_pScene->m_fV == 0.f && m_pScene->m_fH == -90.f) { // ZY Plane!
fValue = 20.f * n70Offset1 + float((nSzY — 2.f * n70Offset1 — 1) / 2 — ix — n70Offset1) * (180.f — 20.f * n70Offset1) / float(nSzY — 2.f * n70Offset1 — 1);

if (ix == (nSzY — 2.f * n70Offset1) / 2) {
// fValue = 90.f;
}

if (ix >= (nSzY — 2.f * n70Offset1) / 2) {
fValue = 80.f * n70Offset1 + fabs(float(ix — 1 * n70Offset1 — (nSzY — 1.f * n70Offset1))) * (180.f) / float(nSzY — 1.f * n70Offset1);

if (fValue > 170.f) { // HACK!
fValue = 170.f;
}
// continue;
}
}

s.Format(" %.0f°", fValue);

if (fValue > 0.f) {
if (m_pScene->m_fH == 0.f && m_pScene->m_fV != 90.f && m_pScene->m_fH != -90.f) {
fValue = -fValue;
}

s.Format(" %.0f°", fValue);
}

if (atoi(s.GetBuffer()) == 0) {
if (m_pScene->m_fV == 0.f && n70Offset1 != 0) {
s.Format(" -10°");
}
else {
s.Format(" 0°");
}
}

glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}

arrPoints.FreeData();

if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
}

glColor3f(col.R(), col.G(), col.B());

if (m_pScene->m_fV == 90.f && m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP) {

if (m_pScene->m_bAllBlack) {
}
else {
col = m_pScene->m_cParallelsColor;
glColor3f(col.R(), col.G(), col.B());
}

for (ix = 0; ix < 8; ix++) {
if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}

point3d ptPos = TranformGlobe.e(ix, 0);
ptPos.y = fMaxY;
ptPos.x = fMinX + (fMaxX — fMinX) / (3.f * 8.f) * float(ix);

int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
yy -= m_pIniSet->m_cszMarkDegree.cy / 4;
xx -= m_pIniSet->m_cszMarkDegree.cx / float(ix + 1);

if (ix == 0) { // Hack
xx += m_pIniSet->m_cszMarkDegree.cx / 2.f;
}

if (ix == 2) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx / 4.f;
}

if (ix != 0 && ix != 7) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx * 0.8f;
}

if (ix == 3 || ix == 4 || ix == 5) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx / 4.5f;
}

if (ix == 1 || ix == 2) { // Hack
xx += m_pIniSet->m_cszMarkDegree.cx / 4.f;
}


BOOL bCross = FALSE;

for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}

if (bCross) {
continue;
}

arrPoints.Append(CPoint(xx, yy));

m_pScene->Screen2World(xx, yy, ptPos);

glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);

CString s;
s.Format(" %d°", ix * 10);

glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}

for (ix = 1; ix <= 8; ix++) {
if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}

point3d ptPos = TranformGlobe.e(ix, 0);
ptPos.y = fMinY;
ptPos.x = fMinX + (fMaxX — fMinX) / (3.f * 8.f) * float(1.2f * ix);

int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
yy += m_pIniSet->m_cszMarkDegree.cy * 0.9f;
xx -= m_pIniSet->m_cszMarkDegree.cx / float(ix + 1) / 1.25f;

if (ix == 1 || ix == 2) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx * 1.5f / 1.25f;
}

if (ix == 3) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx * 2.f / 1.25f;
}

if (ix == 7) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx * 2.f / 1.25f;
}

if (ix != 1 && ix != 8) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx * 0.8f / 1.25f;
}

if (ix == 4 || ix == 5 || ix == 6) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx * 2.5f / 1.25f;
}

if (ix == 2 || ix == 3) { // Hack
xx += m_pIniSet->m_cszMarkDegree.cx / (4.f * 1.25f);
}

if (ix == 2 || ix == 3 || ix == 4 || ix == 5) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx / (4.f * 1.25f);
}

if (ix == 4 || ix == 6 || ix == 7) { // Hack
xx += m_pIniSet->m_cszMarkDegree.cx / 4.f;
}

if (ix == 7) { // Hack
xx += m_pIniSet->m_cszMarkDegree.cx / 4.f;
}

BOOL bCross = FALSE;

for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}

if (bCross) {
continue;
}

arrPoints.Append(CPoint(xx, yy));

m_pScene->Screen2World(xx, yy, ptPos);

glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);

CString s;
s.Format(" %d°", -ix * 10);

glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}

if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
}

glColor3f(col.R(), col.G(), col.B());

for (ix = 0; ix <= 8; ix++) {
if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}

point3d ptPos = TranformGlobe.e(ix, 0);
ptPos.y = fMinY + 0.64f * (ix) / 8.f * (fMaxY — fMinY) / 2.f;
ptPos.x = fMinX;

int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
xx -= m_pIniSet->m_cszMarkDegree.cx * 2.25f;
yy += m_pIniSet->m_cszMarkDegree.cy / 4;

if (ix == 2 || ix == 3 || ix == 4 || ix == 5 || ix == 6 || ix == 7) { // Hack
yy += m_pIniSet->m_cszMarkDegree.cy / 5;
}

BOOL bCross = FALSE;

for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}

if (bCross) {
continue;
}

arrPoints.Append(CPoint(xx, yy));

m_pScene->Screen2World(xx, yy, ptPos);

glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);

CString s;
s.Format("%d°", 180 + ix * 10);

glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}

for (ix = 0; ix <= 8; ix++) {
if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}

point3d ptPos = TranformGlobe.e(ix, 0);
ptPos.y = fMinY + (fMaxY — fMinY) / 2.f + 1.03f * (ix) / 9.f * (fMaxY — fMinY) / 2.f;
ptPos.x = fMinX;

int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
xx -= m_pIniSet->m_cszMarkDegree.cx * 2.25f;
yy += m_pIniSet->m_cszMarkDegree.cy / 4;

if (ix == 1) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 1.55f;
}

if (ix == 2) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 2.15f;
}

if (ix == 3) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 2.55f;
}

if (ix == 4) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 2.55f;
}

if (ix == 5) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 2.15f;
}

if (ix == 6) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 1.55f;
}

if (ix == 7) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 0.75f;
}

BOOL bCross = FALSE;

for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}

if (bCross) {
continue;
}

arrPoints.Append(CPoint(xx, yy));

m_pScene->Screen2World(xx, yy, ptPos);

glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);

CString s;
s.Format("%d°", 270 — ix * 10);

glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}

for (ix = 1; ix <= 8; ix++) {
if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}

point3d ptPos = TranformGlobe.e(ix, 0);
ptPos.y = fMinY + 0.8f * (ix) / 8.f * (fMaxY — fMinY) / 2.f;
ptPos.x = fMaxX;

int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
// xx -= m_pIniSet->m_cszMarkDegree.cx * 2;
// yy += m_pIniSet->m_cszMarkDegree.cy / 4;

if (ix == 2 || ix == 3 || ix == 4 || ix == 5 || ix == 6 || ix == 7) { // Hack
// yy += m_pIniSet->m_cszMarkDegree.cy / 5;
}
if (ix == 1) { // 170
yy += m_pIniSet->m_cszMarkDegree.cy * 0.9f;
}
if (ix == 2) { // 160
yy += 1.25f * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 3) { // 150
yy += 1.5f * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 4) { // 140
yy += 1.75f * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 5) { // 130
yy += 2.f * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 6) { // 120
yy += 1.75f * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 7) { // 110
yy += 1.05f * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 8) { // 100
yy -= 0.05 * m_pIniSet->m_cszMarkDegree.cy;
}

if (ix == 1 || ix == 2 || ix == 5 || ix == 7) {
yy -= m_pIniSet->m_cszMarkDegree.cy / 4;
}

BOOL bCross = FALSE;

for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}

if (bCross) {
continue;
}

arrPoints.Append(CPoint(xx, yy));

m_pScene->Screen2World(xx, yy, ptPos);

glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);

CString s;
s.Format(" %d°", 180 — ix * 10);

glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
}
else
if (m_pScene->m_fV == 0.f && m_pScene->m_fH == 0.f && m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP) { // while nothing!
}
else
for (ix = 0; ix < nSzX; ix++) {

point3d ptPos = TranformGlobe.e(ix, 0);
if (ptPos.x > 0.f && (ix < nSzX / 2) && (TranformGlobe.e(ix + nSzX / 2, 0).x > 0.f)) {
// ptPos.x = -ptPos.x;
}

if (m_pScene->m_fV == 0.f && ix > nSzX / 1.5f) {
if (m_pScene->m_bAllBlack) {
}
else {
col = m_pScene->m_cParallelsColor;
glColor3f(col.R(), col.G(), col.B());
}
}

if (m_pScene->m_fV == 0.f) {
if (ix == 0) {
ptPos.x = fMinX + (fMaxX — fMinX) / 4.f;
if (m_pScene->m_bAllBlack) {
}
else {
col = m_pScene->m_cParallelsColor;
glColor3f(col.R(), col.G(), col.B());
}
}

if (ix == nSzX / 2) {
ptPos.x = fMinX + (fMaxX — fMinX) / 2.f;
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
glColor3f(col.R(), col.G(), col.B());
}
}

if (ix > nSzX / 1.5f) {
if (m_pScene->m_bAllBlack) {
}
else {
col = m_pScene->m_cParallelsColor;
glColor3f(col.R(), col.G(), col.B());
}
}

if (m_pScene->m_fV == 0.f && m_pScene->m_fH == -90.f) { // ZY Plane!
if (ix == nSzX / 2) {
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cParallelsColor;
glColor3f(col.R(), col.G(), col.B());
}
}else{
if (m_pScene->m_bAllBlack) {
}
else {
col = m_pScene->m_cMeridiansColor;
glColor3f(col.R(), col.G(), col.B());
}
}
}

if (ix == nSzX — 1) {
ptPos.x = fMinX + 3.f * (fMaxX — fMinX) / 4.f;
}
}

if (m_pScene->m_fV == 0.f && m_pScene->m_fH == 0.f && (ix > nSzX / 4) && (ix < nSzX / 1.5f)) {
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
glColor3f(col.R(), col.G(), col.B());
}
}

ptPos.y = fMinY;

int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
xx -= m_pIniSet->m_cszMarkDegree.cx;
yy += m_pIniSet->m_cszMarkDegree.cy;

float fValue = 180.f + 360.f * (ix) / float(nSzX — 1);
if (ix > (nSzX — 2) / 2) {
fValue = 360.f * (ix — float(nSzX — 1) / 2.f) / float(nSzX — 1);
}

if (m_pScene->m_fV == 0.f) {
fValue = 0.f;
}

if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}

CString s;
s.Format("%.0f°", fValue);

if (s.GetLength() <= 3) {
xx += m_pIniSet->m_cszMarkDegree.cx / 2.f;
}

if (fValue == 0.f) { // ZERO!
xx += m_pIniSet->m_cszMarkDegree.cx / 4.f;
}

m_pScene->Screen2World(xx, yy, ptPos);

BOOL bCross = FALSE;

for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}

if (bCross && (ix != nSzX / 2) && fValue != 100.f) { continue; }

arrPoints.Append(CPoint(xx, yy));

glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);

glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
}

if ((m_pIniSet->m_nGlobeEarthMode != VS_GLOBE_EARTH_OFF && m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) || ((m_pIniSet->bGlobeMode == WS_TRANSPARENT) && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH_OFF))){
glDisable(GL_CULL_FACE);
glColor4f(1.f, 1.f, 1.f, m_pIniSet->fGlobeTrasparent);

float fDeltaY = 0.f;
if (m_pIniSet->nViewMode2d == PP_MERCATOR_MAP) {
fDeltaY = 1.0f;
}

float fScaleY = 0.f;
int n70Offset = 0;
if (m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_70) {
// fScaleY = 0.3f;
n70Offset = 2;
fDeltaY = 1.0f;
}

fDeltaY = 0.0f;

for (int ix = n70Offset; ix < nSzY — 1 — n70Offset; ix++) {
for (int jx = 0; jx < nSzX — 1; jx++) {

point3d ptPos1 = mtSavedTranform.e(jx, ix);
point3d ptPos2 = mtSavedTranform.e(jx + 1, ix);
point3d ptPos3 = mtSavedTranform.e(jx + 1, ix + 1);
point3d ptPos4 = mtSavedTranform.e(jx, ix + 1);

if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT || m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos1.z = ptPos2.z = ptPos3.z = ptPos4.z = 0.f;
}

if (fabs(ptPos1.x — ptPos2.x) > 0.75f) { continue; } // volosnya!
if (fabs(ptPos4.x — ptPos3.x) > 0.75f) { continue; } // volosnya!
if (fabs(ptPos2.x — ptPos3.x) > 0.75f) { continue; } // volosnya!

if ((m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && (m_pIniSet->bGlobeMode == WS_TRANSPARENT)) {
if (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH_OFF) {
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glAlphaFunc(GL_GREATER, .01f);
glEnable(GL_ALPHA_TEST);

if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) {
glDisable(GL_CULL_FACE);
}

CColor24 col = m_pScene->m_cSpaceGlobeSkin2DViewColor;// m_pIniSet->GetGlobeSkinColor();
if (m_pIniSet->nDrawMode == PP_3D_PLOT) {
col = m_pScene->m_cSpaceGlobeSkinColor;
}

if (m_pIniSet->nDrawMode == PP_3D_VIEWPORT) {
col = m_pScene->m_cSpaceGlobeSkin3DViewColor;
}

float fGlobeTransp = m_pIniSet->fGlobeTrasparent + 0.1;
if (fGlobeTransp > 1.f) {
fGlobeTransp = 1.f;
}
glColor4f(col.R(), col.G(), col.B(), fGlobeTransp);

glBegin(GL_TRIANGLES);
// glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos1.x);

// glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos2.x);

// glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos3.x);

// glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos1.x);

// glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos3.x);

// glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos4.x);
glEnd();
}
}

if (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH_BRIGHT) {
glBindTexture(GL_TEXTURE_2D, m_nEarthBright);
glEnable(GL_TEXTURE_2D);

glBegin(GL_QUADS);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos1.x);

glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos2.x);

glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos3.x);

glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos4.x);
glEnd();
}

if (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH) {
glBindTexture(GL_TEXTURE_2D, m_nEarth);
glEnable(GL_TEXTURE_2D);

glBegin(GL_QUADS);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos1.x);

glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos2.x);

glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos3.x);

glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos4.x);
glEnd();
}
}
}
}

if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT && m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP) {
point3d ptPos1 = { -180.f / PP_SIZE_CARTOG_SCALE, -180.f / PP_SIZE_CARTOG_SCALE, 0.f };
point3d ptPos2 = { 180.f / PP_SIZE_CARTOG_SCALE, -180.f / PP_SIZE_CARTOG_SCALE, 0.f };
point3d ptPos3 = { 180.f / PP_SIZE_CARTOG_SCALE, 180.f / PP_SIZE_CARTOG_SCALE, 0.f };
point3d ptPos4 = { -180.f / PP_SIZE_CARTOG_SCALE, 180.f / PP_SIZE_CARTOG_SCALE, 0.f };
glBegin(GL_LINES);

glVertex3fv(&ptPos1.x);
glVertex3fv(&ptPos2.x);

glVertex3fv(&ptPos2.x);
glVertex3fv(&ptPos3.x);

glVertex3fv(&ptPos3.x);
glVertex3fv(&ptPos4.x);

glVertex3fv(&ptPos4.x);
glVertex3fv(&ptPos1.x);

glEnd();
}

/*
if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT && m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP) {
if (ix == nSzX — 1) {
}
}

if(m_pIniSet->bCheckCarthoCylinderMode && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)){
if (m_pIniSet->nDrawMode != PP_2D_PLOT) {
// Drawing of Paralells ...
for (ix = nSzY — 1; ix >= 0; ix--) {
point3d ptPos1, ptPos2 = TranformGlobe.e(0, ix);

for (jx = 0; jx < nSzX; jx++) {
ptPos1 = TranformGlobe.e(jx, ix);
Map_Line_Draw(&ptPos1, &ptPos2);
}
}*
}
}
*/

if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) {
// glClear(GL_DEPTH_BUFFER_BIT);
}

if((m_pIniSet->bGlobeMode == WS_TRANSPARENT) || (m_pIniSet->m_nGlobeEarthMode != VS_GLOBE_EARTH_OFF) || m_pIniSet->m_bCarthPlaneView) {
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);

glDepthFunc(GL_LESS);
glShadeModel(GL_SMOOTH);

// glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);

if ((m_pIniSet->bCheckCarthoMode || m_pIniSet->bCheckCarthoFixedMode || m_pScene->IsCarthoMatrixRotated()) && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)) {
if (m_pIniSet->nDrawMode != PP_2D_PLOT) {
point3d ptVectorZ;
ptVectorZ.x = m_pScene->m_mtCartho.m[2][0];
ptVectorZ.y = m_pScene->m_mtCartho.m[2][1];
ptVectorZ.z = m_pScene->m_mtCartho.m[2][2];
if (dot_prod(&m_pIniSet->ptCamPos.x, &ptVectorZ.x) < 0.f) {
// glCullFace(GL_BACK);
}
}
}

if (m_pScene->GetCubeRadius() + 0.001f >= vec_length(&m_pIniSet->ptCamPos.x)) {
if (m_pIniSet->nDrawMode != PP_2D_PLOT) {
// glCullFace(GL_BACK);
}
}

// if((m_pIniSet->bGlobeMode != WS_SOLID) && (m_pIniSet->bGlobeMode != WS_CODED)){

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glAlphaFunc(GL_GREATER, .01f);
glEnable(GL_ALPHA_TEST);

if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) {
glDisable(GL_CULL_FACE);
}

CColor24 col = m_pScene->m_cSpaceGlobeSkin2DViewColor;// m_pIniSet->GetGlobeSkinColor();
if (m_pIniSet->nDrawMode == PP_3D_PLOT) {
col = m_pScene->m_cSpaceGlobeSkinColor;
}

if (m_pIniSet->nDrawMode == PP_3D_VIEWPORT) {
col = m_pScene->m_cSpaceGlobeSkin3DViewColor;
}

float fGlobeTransp = m_pIniSet->fGlobeTrasparent + 0.1;
if (fGlobeTransp > 1.f) {
fGlobeTransp = 1.f;
}
glColor4f(col.R(), col.G(), col.B(), fGlobeTransp);

// glColor4f(col.R(), col.G(), col.B(), float(nTransp) / 100.f);
// }else{
// CColor24 col = m_pIniSet->GetGlobeSkinColor();
// glColor3f(col.R(), col.G(), col.B());
// }

int ix, jx;

for (jx = 0; jx < TranformGlobe.SizeX() — 1; jx++) {
for (ix = 0; ix < TranformGlobe.SizeY() — 1; ix++) {

point3d ptPos1 = TranformGlobe.e(jx, ix);
point3d ptPos2 = TranformGlobe.e(jx + 1, ix);
point3d ptPos3 = TranformGlobe.e(jx + 1, ix + 1);
point3d ptPos4 = TranformGlobe.e(jx, ix + 1);

if (!m_pIniSet->bAseExport) {
ptPos1 = m_pScene->ConvertPos2D(ptPos1);
ptPos2 = m_pScene->ConvertPos2D(ptPos2);
ptPos3 = m_pScene->ConvertPos2D(ptPos3);
ptPos4 = m_pScene->ConvertPos2D(ptPos4);
}

if (m_pIniSet->bCheckCarthoCylinderMode && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)) {
// glDisable(GL_CULL_FACE);

point3d vab, vac, vad;

sub_vectors(&vab.x, &ptPos1.x, &ptPos2.x);
sub_vectors(&vac.x, &ptPos1.x, &ptPos3.x);
sub_vectors(&vad.x, &ptPos1.x, &ptPos4.x);

if (vec_length(&vab.x) > (2000.f / (PP_SIZE_CARTOG_SCALE * m_pIniSet->nMeridians))) { continue; }
if (vec_length(&vac.x) > (2000.f / (PP_SIZE_CARTOG_SCALE * m_pIniSet->nMeridians))) { continue; }
if (vec_length(&vad.x) > (2000.f / (PP_SIZE_CARTOG_SCALE * m_pIniSet->nMeridians))) { continue; }
}

point3d vtZ = { 0.f, 0.f, 0.00095f };
if ((m_pIniSet->bCheckCarthoMode || m_pIniSet->bCheckCarthoFixedMode || m_pScene->IsCarthoMatrixRotated()) && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)) {
// transform_point(&vtZ, &vtZ, &m_pScene->m_mtCartho);
}
/*
if (m_pIniSet->nDrawMode != PP_2D_PLOT) {
add_vectors(&ptPos1.x, &ptPos1.x, &vtZ.x);
add_vectors(&ptPos2.x, &ptPos2.x, &vtZ.x);
add_vectors(&ptPos3.x, &ptPos3.x, &vtZ.x);
add_vectors(&ptPos4.x, &ptPos4.x, &vtZ.x);
}
*/

if (m_pIniSet->nViewMode != PP_CARTOGRAPHIC_PLOT) {
scale_vect(&ptPos1.x, 0.999f); // hack to draw Wires well looking.
scale_vect(&ptPos2.x, 0.999f);
scale_vect(&ptPos3.x, 0.999f);
scale_vect(&ptPos4.x, 0.999f);
}

if (m_pIniSet->nViewMode != PP_CARTOGRAPHIC_PLOT) {
if (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH_OFF) {
glBegin(GL_TRIANGLES);
glVertex3fv(&ptPos1.x);
glVertex3fv(&ptPos2.x);
glVertex3fv(&ptPos3.x);

glVertex3fv(&ptPos1.x);
glVertex3fv(&ptPos3.x);
glVertex3fv(&ptPos4.x);
glEnd();
}

if (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH_BRIGHT) {
glColor4f(1.f, 1.f, 1.f, m_pIniSet->fGlobeTrasparent);

glBindTexture(GL_TEXTURE_2D, m_nEarthBright);
glEnable(GL_TEXTURE_2D);

glBegin(GL_TRIANGLES);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), float(ix) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos1.x);

glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), float(ix) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos2.x);

glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), float(ix + 1) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos3.x);

glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), float(ix) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos1.x);

glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), float(ix + 1) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos3.x);

glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), float(ix + 1) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos4.x);
glEnd();
}

if (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH) {
glColor4f(1.f, 1.f, 1.f, m_pIniSet->fGlobeTrasparent);

glBindTexture(GL_TEXTURE_2D, m_nEarth);
glEnable(GL_TEXTURE_2D);

glBegin(GL_TRIANGLES);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), float(ix) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos1.x);

glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), float(ix) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos2.x);

glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), float(ix + 1) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos3.x);

glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), float(ix) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos1.x);

glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), float(ix + 1) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos3.x);

glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), float(ix + 1) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos4.x);
glEnd();
}
}
}
}

/* if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) {
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
glBegin(GL_QUADS);
glVertex3f(fMinX, fMinY, -0.01f);
glVertex3f(fMinX, fMaxY, -0.01f);
glVertex3f(fMaxX, fMaxY, -0.01f);
glVertex3f(fMaxX, fMinY, -0.01f);
glEnd();
}
else {
glBegin(GL_QUADS);
glVertex3f(fMinX, fMinY, 0.f);
glVertex3f(fMinX, fMaxY, 0.f);
glVertex3f(fMaxX, fMaxY, 0.f);
glVertex3f(fMaxX, fMinY, 0.f);
glEnd();
}
}
*/
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
// glCullFace(GL_BACK);
// glDisable(GL_CULL_FACE);
}

if ((m_pIniSet->bCheckCarthoMode || m_pIniSet->bCheckCarthoFixedMode || m_pIniSet->bCheckCarthoCylinderMode || m_pScene->IsCarthoMatrixRotated()) && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && !m_pIniSet->bCheckCarthoCylinderMode) {

// if ((m_pIniSet->bCheckCarthoMode || m_pIniSet->bCheckCarthoFixedMode || m_pScene->IsCarthoMatrixRotated()) && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && !m_pIniSet->bCheckCarthoCylinderMode) {
glPopMatrix();
}

glEnable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
}

#define F80C_GRAD 87.f / PP_SIZE_CARTOG_SCALE
#define F80M_GRAD 139.5967f / PP_SIZE_CARTOG_SCALE
#define F190C_GRAD 180.f / PP_SIZE_CARTOG_SCALE
#define F90M_GRAD 139.5967f / PP_SIZE_CARTOG_SCALE
void CMercatorGlobe::Map_Line_Draw(point3d *p1, point3d *p2, CColor24 *pCol1, CColor24 *pCol2)
{
// if (m_pIniSet->bGlobeMode == WS_INVISIBLE) { return; }
if (m_pIniSet->bGlobeSkinMode == WS_INVISIBLE && m_pIniSet->bGlobeMode == WS_TRANSPARENT) {
return;
}

glDisable(GL_LIGHTING);

if(m_pIniSet->nViewMode != PP_CARTOGRAPHIC_PLOT) {
// This part of code draw Globe in a space

if(m_pIniSet->nDrawMode == PP_2D_PLOT){
if((m_pIniSet->nViewMode == PP_GLOBE_PLOT) || (m_pIniSet->nViewMode == PP_FACTOR_PLOT)){
if(!m_pIniSet->bAseExport){
// *p1 = m_pScene->ConvertPos2D(*p1);
// *p2 = m_pScene->ConvertPos2D(*p2);
}
}
}

if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);

sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}else{
glBegin(GL_LINE_STRIP);
glVertex3fv(&p1->x);
glVertex3fv(&p2->x);

sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}
return;
}

if(m_pIniSet->bCheckCarthoCylinderMode && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)){

BOOL b2Line = FALSE;
point3d vtVec;
sub_vectors(&vtVec.x, &p1->x, &p2->x);
if(fabs(p1->x — p2->x) > (720.f / (PP_SIZE_CARTOG_SCALE * m_pIniSet->nMeridians)))
{
b2Line = TRUE;
}

if(b2Line){ return; }

if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}else{
glBegin(GL_LINE_STRIP);
glVertex3fv(&p1->x);
glVertex3fv(&p2->x);
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}
return;
}

if(m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP){
// This part of code draw Globe in the Quincuctial map
Quinc_Line_Draw(p1, p2, pCol1, pCol2);
return;
}

if(m_pIniSet->bAnimationMap){
// This part of code draw transformation of globe from a space into the map
if(fabs(p1->x — p2->x) > (100.f / PP_SIZE_CARTOG_SCALE)) return;
if((bFl_Point1 & FF_ON_MAP)!=(bFl_Point2 & FF_ON_MAP)){
if(p1->x < 0.f) return;
if(p2->x < 0.f) return;
}

if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}else{
glBegin(GL_LINE_STRIP);
glVertex3fv(&p1->x);
glVertex3fv(&p2->x);

sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);

glEnd();
}
return;
}

point3d p12, p21;
p21.x = p2->x;
p21.y = p2->y;
p21.z = p2->z;
p12.z = p1->z;

float f80 = F80C_GRAD;
if(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP) { f80 = F80M_GRAD; }
if(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_70) { f80 = F80M_GRAD; }
if(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_ENHANC){
f80 = 180.f / m_pScene->pixel_sz / PP_SIZE_CARTOG_SCALE;
}

BOOL b2Line = FALSE;
if(fabs(p1->x — p21.x) > (181.f / PP_SIZE_CARTOG_SCALE) )
{
b2Line = TRUE;
if(p21.x > 0.f) p21.x -= (360.f / PP_SIZE_CARTOG_SCALE);
else p21.x += (360.f / PP_SIZE_CARTOG_SCALE);
}

if(b2Line){
// if points of line is on different sides of map,
// then need to draw two line.
float f180 = 180.f / PP_SIZE_CARTOG_SCALE;
float f90 = 90.f / PP_SIZE_CARTOG_SCALE;
if((m_pIniSet->nViewMode2d == PP_MERCATOR_MAP)||(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_70)||(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_ENHANC))
{ f90 = F80M_GRAD; }
p12.x = p21.x;
p12.y = p21.y;

if(p21.x > f180){
p12.y = p21.y = p1->y + (p21.y — p1->y) * (f180 — p1->x) / (p21.x — p1->x);
p21.x = f180;
}

if(p21.x < -f180){
p12.y = p21.y = p1->y + (p21.y — p1->y) * (-f180 — p1->x) / (p21.x — p1->x);
p21.x = -f180;
}
p12.x = -p21.x;

if((fabs(p1->x — p21.x) < f180)&&(fabs(p1->y — p21.y) < f90)){
if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glVertex3fv(&p21.x);
*p2 = p21;
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = p21;
// arrLines.Append(sLine1);
glEnd();

}else{
glBegin(GL_LINE_STRIP);
glVertex3fv(&p1->x);
glVertex3fv(&p21.x);
*p2 = p21;

sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = p21;
// arrLines.Append(sLine1);

glEnd();
}
}

if((fabs(p2->x — p12.x) < f180)&&(fabs(p2->y — p12.y) < f90)){
if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
glVertex3fv(&p12.x);
*p1 = p12;

sLine sLine1;
sLine1.ptPos1 = *p2;
sLine1.ptPos2 = p12;
// arrLines.Append(sLine1);

glEnd();

}else{
glBegin(GL_LINE_STRIP);
glVertex3fv(&p2->x);
glVertex3fv(&p12.x);

*p1 = p12;

sLine sLine1;
sLine1.ptPos1 = *p2;
sLine1.ptPos2 = p12;
// arrLines.Append(sLine1);
glEnd();
}
}
}
else{
if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);

sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);

glEnd();
}else{
glBegin(GL_LINE_STRIP);
glVertex3fv(&p1->x);
glVertex3fv(&p2->x);
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}
}
}

void CMercatorGlobe::TransToMap(point3d *pPoint)
{

if(m_pIniSet->nViewMode != PP_CARTOGRAPHIC_PLOT) {
// This part of code draw Globe in a space

if(m_pIniSet->nDrawMode == PP_2D_PLOT){
if((m_pIniSet->nViewMode == PP_GLOBE_PLOT) || (m_pIniSet->nViewMode == PP_FACTOR_PLOT)){
return;
}
}
}

// transform_point(pPoint, pPoint, &m_pScene->m_mtCartho);

switch(m_pIniSet->nViewMode2d) {
case PP_CARTOGRAPH_MAP:
case PP_MERCATOR_MAP_70:
case PP_MERCATOR_MAP:
case PP_MERCATOR_MAP_ENHANC: TransToGeod(pPoint); break;
case PP_QUINCUNCIAL_MAP: TransToQuinc(pPoint); break;
}
}

#define FF_IS_CALC 128
#define FF_TR_EXT 64
#define FF_TR_X_Y 32
#define FF_TR_BOTTM 16
#define FF_TR_LEFT 8
void CMercatorGlobe::TransToQuinc(point3d *pPoint)
{
if(m_pIniSet->nViewMode != PP_CARTOGRAPHIC_PLOT) return;

// Transform from cartesian position to Quincunc position
float fX = pPoint->y;
float fY = pPoint->x;
float fZ = pPoint->z;// yes: zxy
float fP = sqrt(fX * fX + fY * fY);
float fFi, fGm = atan2(fY , fX);// (-pi..pi)
if((fY == 0.f)&&(fX == 0.f)) fGm = 0.f;// Formulas received from [1]
fFi = atan( fZ / fP );//(-pi/2..pi/2)
fFi = RadToDeg(fFi);// fFi and fGm is cartographic coordinates.
fGm = RadToDeg(fGm);// fFi (-90..90), fgm (-180..180)
bFl_Point2 = bFl_Point1; // kind of triangle of second point
bFl_Point1 = 0; // Clear flages of first point
// folding of map into the triangle:
if(fFi <= 0.f) {
bFl_Point1 |= FF_TR_EXT; //the point is on external triangles
fFi = 90.f + fFi;
}
else { fFi = 90.f — fFi; }

if(fGm <= 0.f) {
bFl_Point1 |= FF_TR_LEFT; //the point is on left triangles
fGm = -fGm;
}

if(fGm >= 90.f) {
bFl_Point1 |= FF_TR_BOTTM; //the point is on bottom triangles
fGm = 180.f — fGm;
}

if(fGm <= 45.f){
bFl_Point1 |= FF_TR_X_Y; // GetQiuncApr will return X and Y
fGm = 90.f — fGm;
}
// End of folding of map into the triangle
GetQiuncApr(fFi, fGm); //Transform in the point of triangle
float fQx, fQy;
// unrolling of map from the triangle:
if(bFl_Point1 & FF_TR_EXT){
if(bFl_Point1 & FF_TR_X_Y){
fQx = 1.f — fGm;
fQy = 1.f — fFi;
}
else{
fQx = 1.f — fFi;
fQy = 1.f — fGm;
}
}
else{
if(bFl_Point1 & FF_TR_X_Y){
fQx = fFi;
fQy = fGm;
}
else{
fQx = fGm;
fQy = fFi;
}
}

if(bFl_Point1 & FF_TR_BOTTM){ fQy = -fQy; }
if(bFl_Point1 & FF_TR_LEFT){ fQx = -fQx; }

// end of unrolling of map from the triangle
if(m_pIniSet->bAnimationMap){
// This part of code implemented for animation
float fMult = m_pScene->fAnimal_Angle / 360.f;
pPoint->y = fQy * 180.f / PP_SIZE_CARTOG_SCALE * (1 — fMult) +
fMult * pPoint->y;
pPoint->x = fQx * 180.f / PP_SIZE_CARTOG_SCALE * (1 — fMult) +
fMult * pPoint->x;
//f2Rad = (1 — fMult) * fRadius * 2.f + fMult * 180.f / PP_SIZE_CARTOG_SCALE;
pPoint->z = (1 — fMult) * m_pIniSet->nSpaceCubeSize + fMult * pPoint->z;

}
else{
pPoint->y = fQy * 180.f / PP_SIZE_CARTOG_SCALE;
pPoint->x = fQx * 180.f / PP_SIZE_CARTOG_SCALE;
pPoint->z = 0.f;
}

// bFl_Point1 = 0;
}

void CMercatorGlobe::GetQiuncApr(float &fFiX, float &fAlY)
{
// Quincuncipial map consist of 16 triangles.
// This procedure calculate coordinates of point in triangle,
// This triangle rotated around map on 45 grad
// Before call in this procedure, you need to define of this triangle.
if((fFiX > 90.f)||(fFiX < 0.f)){
AfxMessageBox("Quincipial not correct");
return; // Data is not correct
}
if((fAlY > 90.f)||(fAlY < 45.f)){
AfxMessageBox("Quincipial not correct");
return; // Data is not correct
}

if(fAlY > 89.999f){ float fF = 89.999f; }

float fKsi = tan(DegToRad(fAlY));
fKsi -= ( 1.f + log(1 / fKsi) );
float fMy = tan(DegToRad(fAlY)) / fKsi;
fFiX /= 90.f;
float fUm = exp( (fFiX — 1.f) * 3.f);
float fUm2 = exp( (fFiX — 1.f) * 6.f);
float fY90 = (fMy — 1 / fKsi) * fUm + (1.f — fUm) / 1.4142135f;

fAlY = fFiX * fY90 * (fUm + (1.f — fUm) * sin(DegToRad(fAlY)) );
fFiX = -log( 1.f — fAlY / fMy ) / fKsi;

return;
}

void CMercatorGlobe::Quinc_Line_Draw(point3d *p1, point3d *p2, CColor24 *pCol1, CColor24 *pCol2)
{
glDisable(GL_LIGHTING);

// bFl_Point1 = bFl_Point2 = 0;

if(bFl_Point1 != bFl_Point2){
if((bFl_Point1 & FF_TR_EXT)&(bFl_Point2 & FF_TR_EXT)){
if((bFl_Point1 & FF_TR_LEFT)==(bFl_Point2 & FF_TR_LEFT)){
if((bFl_Point1 & FF_TR_BOTTM)!=(bFl_Point2 & FF_TR_BOTTM)){
if((p1->y != 0.f)&&(p2->y != 0.f)){
if(m_pIniSet->bAnimationMap){
point3d p12, p21;
if(bFl_Point1 & FF_TR_LEFT){p12.x = p21.x = -180.f / PP_SIZE_CARTOG_SCALE; }
else{ p12.x = p21.x = 180.f / PP_SIZE_CARTOG_SCALE; }
float fm1 = (p21.x — p1->x) / (p21.x * 2 — p1->x — p2->x);
float fm2 = (p21.x — p2->x) / (p21.x * 2 — p1->x — p2->x);
p12.y = p1->y + (-p2->y — p1->y) * fm1;
p21.y = p2->y + (-p1->y — p2->y) * fm2;
p12.z = p21.z = 0.f;

if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glVertex3fv(&p12.x);
glEnd();

glBegin(GL_LINE_STRIP);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
glVertex3fv(&p21.x);
glEnd();

return;
}else{
glBegin(GL_LINES);
glVertex3fv(&p1->x);
glVertex3fv(&p12.x);
glEnd();
glBegin(GL_LINES);
glVertex3fv(&p2->x);
glVertex3fv(&p21.x);
glEnd();

return;
}
}
}
}
}
if((bFl_Point1 & FF_TR_BOTTM)==(bFl_Point2 & FF_TR_BOTTM)){
if((bFl_Point1 & FF_TR_LEFT)!=(bFl_Point2 & FF_TR_LEFT)){
if((p1->x != 0.f)&&(p2->x != 0.f)){
if(m_pIniSet->bAnimationMap){
point3d p12, p21;
if(bFl_Point1 & FF_TR_BOTTM){p12.y = p21.y = -180.f / PP_SIZE_CARTOG_SCALE; }
else{ p12.y = p21.y = 180.f / PP_SIZE_CARTOG_SCALE; }
float fm1 = (p21.y — p1->y) / (p21.y * 2 — p1->y — p2->y);
float fm2 = (p21.y — p2->y) / (p21.y * 2 — p1->y — p2->y);
p12.x = p1->x + (-p2->x — p1->x) * fm1;
p21.x = p2->x + (-p1->x — p2->x) * fm2;
p12.z = p21.z = 0.f;

if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glVertex3fv(&p12.x);
glEnd();

glBegin(GL_LINE_STRIP);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
glVertex3fv(&p21.x);
glEnd();

return;
}else{
glBegin(GL_LINES);
glVertex3fv(&p1->x);
glVertex3fv(&p12.x);
glEnd();
glBegin(GL_LINES);
glVertex3fv(&p2->x);
glVertex3fv(&p21.x);
glEnd();

return;
}
}
}
}
}
if((bFl_Point1 & FF_TR_BOTTM)!=(bFl_Point2 & FF_TR_BOTTM)){
if((bFl_Point1 & FF_TR_LEFT)!=(bFl_Point2 & FF_TR_LEFT)){
return;
}
}
} // end ext
} //end (bFl_Point1 != bFl_Point2)

point3d vtSub;
sub_vectors(&vtSub.x, &p2->x, &p1->x);
float fLen = vec_length(&vtSub.x);
if (fLen > 180.f / PP_SIZE_CARTOG_SCALE / 2.f) {
if (p2->x < 0.f && p2->y < 0.f && fabs(p2->x) < fabs(p2->y)) { // 1
p2->y = -180.f / PP_SIZE_CARTOG_SCALE;
p2->x = p1->x;
goto End;
}

if (p2->x < 0.f && p2->y < 0.f && fabs(p2->x) > fabs(p2->y)) { // 2
p2->x = -180.f / PP_SIZE_CARTOG_SCALE;
p2->y = p1->y;
goto End;
}

if (p2->x > 0.f && p2->y < 0.f && fabs(p2->x) > fabs(p2->y)) { // 3
p2->x = 180.f / PP_SIZE_CARTOG_SCALE;
p2->y = p1->y;
goto End;
}

if (p2->x > 0.f && p2->y > 0.f && fabs(p2->x) < fabs(p2->y)) { // 4
p2->y = 180.f / PP_SIZE_CARTOG_SCALE;
p2->x = p1->x;
goto End;
}

if (p2->x < 0.f && p2->y > 0.f && fabs(p2->x) > fabs(p2->y)) { // 5
p2->x = -180.f / PP_SIZE_CARTOG_SCALE;
p2->y = p1->y;
goto End;
}

if (p2->x < 0.f && p2->y > 0.f && fabs(p2->x) < fabs(p2->y)) { // 6
p2->y = 180.f / PP_SIZE_CARTOG_SCALE;
p2->x = p1->x;
goto End;
}

if (p2->x > 0.f && p2->y < 0.f && fabs(p2->x) < fabs(p2->y)) { // 7
p2->y = -180.f / PP_SIZE_CARTOG_SCALE;
p2->x = p1->x;
goto End;
}

if (p2->x > 0.f && p2->y > 0.f && fabs(p2->x) > fabs(p2->y)) { //8
p2->x = 180.f / PP_SIZE_CARTOG_SCALE;
p2->y = p1->y;
goto End;
}
}

End:
sub_vectors(&vtSub.x, &p2->x, &p1->x);
fLen = vec_length(&vtSub.x);
if (fLen >= 180.f / PP_SIZE_CARTOG_SCALE) { return; }

if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
glEnd();
}else{
glBegin(GL_LINES);
glVertex3fv(&p1->x);
glVertex3fv(&p2->x);
glEnd();
}
}

void CMercatorGlobe::CalcObjectProjectColor()
{
int ix, sz = m_pScene->m_parrObjs.Size();
for(ix = 0; ix < sz; ix++){
CObj3d *pObj = m_pScene->m_parrObjs.e(ix);
pObj->pcGlobeColor = NULL;

point3d ptPos11 = pObj->ptConstantPos;
norm_vect(&ptPos11.x);
scale_vect(&ptPos11.x, &ptPos11.x, m_pScene->GetGlobeSize());
point3d ptPos22 = {0.f, 0.f, 0.f};

point3d vtVect;
sub_vectors(&vtVect.x, &ptPos11.x, &ptPos22.x);

BOOL bFound = FALSE;
for(int kx = 0; kx < Globe.SizeX() — 1; kx++){
for(int mx = 0; mx < Globe.SizeY() — 1; mx++){
point3d ptPos1 = Globe.e(kx, mx);
point3d ptPos2 = Globe.e(kx + 1, mx);
point3d ptPos3 = Globe.e(kx + 1, mx + 1);
point3d ptPos4 = Globe.e(kx, mx + 1);

plane plPlane1, plPlane2;
comp_plane_eqn(&plPlane1.a, &ptPos1.x, &ptPos2.x, &ptPos3.x);
comp_plane_eqn(&plPlane2.a, &ptPos1.x, &ptPos3.x, &ptPos4.x);

point3d ptRes1, ptRes2, vtVect1, vtVect2;
cross_line_plane(vtVect, &plPlane1.a, ptPos11, ptRes1);
cross_line_plane(vtVect, &plPlane2.a, ptPos11, ptRes2);

sub_vectors(&vtVect1.x, &ptPos11.x, &ptRes1.x);
if(vec_length(&vtVect1.x) < m_pScene->GetGlobeSize()){
if(point_in_triangle(ptPos1, ptPos2, ptPos3, ptRes1)){
pObj->pcGlobeColor = &m_pIniSet->m_mtGlobeColors.e(kx, mx);
bFound = TRUE;
break;
}
}

sub_vectors(&vtVect2.x, &ptPos11.x, &ptRes2.x);
if(vec_length(&vtVect2.x) < m_pScene->GetGlobeSize()){
if(point_in_triangle(ptPos1, ptPos3, ptPos4, ptRes2)){
pObj->pcGlobeColor = &m_pIniSet->m_mtGlobeColors.e(kx + 1, mx + 1);
bFound = TRUE;
break;
}
}
} //mx
if(bFound){
break;
}
}// kx
}//
}

void CMercatorGlobe::CalcObjectProjectPoints(point3d ptCenter, float fMaxLength)
{
int ix, sz = m_pScene->m_parrObjs.Size();
for(ix = 0; ix < sz; ix++){
CObj3d *pObj = m_pScene->m_parrObjs.e(ix);

point3d ptPos11 = pObj->ptConstantPos;
norm_vect(&ptPos11.x);
scale_vect(&ptPos11.x, &ptPos11.x, m_pScene->GetGlobeSize());
point3d ptPos22 = {0.f, 0.f, 0.f};

point3d vtVect;
sub_vectors(&vtVect.x, &ptPos11.x, &ptPos22.x);

BOOL bFound = FALSE;
for(int kx = 0; kx < Globe.SizeX() — 1; kx++){
for(int mx = 0; mx < Globe.SizeY() — 1; mx++){
point3d ptPos1 = Globe.e(kx, mx);
point3d ptPos2 = Globe.e(kx + 1, mx);
point3d ptPos3 = Globe.e(kx + 1, mx + 1);
point3d ptPos4 = Globe.e(kx, mx + 1);

plane plPlane1, plPlane2;
comp_plane_eqn(&plPlane1.a, &ptPos1.x, &ptPos2.x, &ptPos3.x);
comp_plane_eqn(&plPlane2.a, &ptPos1.x, &ptPos3.x, &ptPos4.x);

point3d ptRes1, ptRes2, vtVect1, vtVect2;
cross_line_plane(vtVect, &plPlane1.a, ptPos11, ptRes1);
cross_line_plane(vtVect, &plPlane2.a, ptPos11, ptRes2);

sub_vectors(&vtVect1.x, &ptPos11.x, &ptRes1.x);
if(vec_length(&vtVect1.x) < m_pScene->GetGlobeSize()){
if(point_in_triangle(ptPos1, ptPos2, ptPos3, ptRes1)){
transform_point(&ptRes1, &ptRes1, &m_pScene->m_mtMatrix);
TransToMap(&ptRes1);

pObj->m_ptCylinder1 = TransformCylinderPoint(ptRes1, ptCenter, fMaxLength);

point3d ptP1 = TranformGlobe.e(kx, mx);
point3d ptP2 = TranformGlobe.e(kx + 1, mx);
point3d ptP3 = TranformGlobe.e(kx + 1, mx + 1);

comp_plane_eqn(&plPlane1.a, &ptP1.x, &ptP2.x, &ptP3.x);
norm_vect(&plPlane1.a);
scale_vect(&plPlane1.a, pObj->m_fCarthoLen);
add_vectors(&pObj->m_ptCylinder2.x, &pObj->m_ptCylinder1.x, &plPlane1.a);

if(m_pIniSet->nDrawMode != PP_2D_PLOT){
// transform_back_point(&pObj->m_ptCylinder1, &pObj->m_ptCylinder1, &m_pScene->m_mtCartho);
// transform_back_point(&pObj->m_ptCylinder2, &pObj->m_ptCylinder2, &m_pScene->m_mtCartho);

transform_back_point(&pObj->m_ptCylinder1, &pObj->m_ptCylinder1, &m_pIniSet->mtCylinderMode);
transform_back_point(&pObj->m_ptCylinder2, &pObj->m_ptCylinder2, &m_pIniSet->mtCylinderMode);
}

bFound = TRUE;
break;
}
}

sub_vectors(&vtVect2.x, &ptPos11.x, &ptRes2.x);
if(vec_length(&vtVect2.x) < m_pScene->GetGlobeSize()){
if(point_in_triangle(ptPos1, ptPos3, ptPos4, ptRes2)){
transform_point(&ptRes2, &ptRes2, &m_pScene->m_mtMatrix);
TransToMap(&ptRes2);

pObj->m_ptCylinder1 = TransformCylinderPoint(ptRes2, ptCenter, fMaxLength);

point3d ptP1 = TranformGlobe.e(kx, mx);
point3d ptP2 = TranformGlobe.e(kx + 1, mx + 1);
point3d ptP3 = TranformGlobe.e(kx, mx + 1);

comp_plane_eqn(&plPlane1.a, &ptP1.x, &ptP2.x, &ptP3.x);
norm_vect(&plPlane1.a);
scale_vect(&plPlane1.a, pObj->m_fCarthoLen);
add_vectors(&pObj->m_ptCylinder2.x, &pObj->m_ptCylinder1.x, &plPlane1.a);

if(m_pIniSet->nDrawMode != PP_2D_PLOT){
// transform_back_point(&pObj->m_ptCylinder1, &pObj->m_ptCylinder1, &m_pScene->m_mtCartho);
// transform_back_point(&pObj->m_ptCylinder2, &pObj->m_ptCylinder2, &m_pScene->m_mtCartho);

transform_back_point(&pObj->m_ptCylinder1, &pObj->m_ptCylinder1, &m_pIniSet->mtCylinderMode);
transform_back_point(&pObj->m_ptCylinder2, &pObj->m_ptCylinder2, &m_pIniSet->mtCylinderMode);
}

bFound = TRUE;
break;
}
}
} //mx
if(bFound){
break;
}
}// kx

// pObj->Transform();
// pObj->Draw();
}//
}

point3d CMercatorGlobe::TransformCylinderPoint(point3d &ptPos, point3d &ptCenter, float fMaxLength)
{
matrix mtMatr;
float fLen = (ptPos.x — ptCenter.x);
ident_matrix(&mtMatr);

float fDelta = fLen / fMaxLength;
float fDelta1 = fLen / fMaxLength;
rotate_matrix(&mtMatr, 0.f, PI_LB * fDelta, 0.f);

point3d ptVect = { 0.f, 0.f, — 1.f };
point3d ptPoint = { 0.f, 0.f, 0.f };

transform_point(&ptVect, &ptVect, &mtMatr);

add_vectors(&ptPoint.x, &ptPoint.x, &ptVect.x);

ptPos.x = ptPoint.x;
ptPos.z = -ptPoint.z;

return ptPos;
}

void CMercatorGlobe::CreateASEFile(FILE *pFile, int nMaterial)
{
/* for(int ix = 0; ix < arrTriangles.Size(); ix++){
sTriangle sTriangle1 = arrTriangles.e(ix);
point3d v[3];
v[0] = sTriangle1.ptPos1;
v[1] = sTriangle1.ptPos2;
v[2] = sTriangle1.ptPos3;

if(m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT){
transform_point(&v[0], &v[0], &m_pIniSet->mtAseExport);
transform_point(&v[1], &v[1], &m_pIniSet->mtAseExport);
transform_point(&v[2], &v[2], &m_pIniSet->mtAseExport);
}

face_t f[1] = {{0, 1, 2}};

char buff[MAX_PATH];
sprintf(buff, "Globe %d,", ix);

// m_pScene->SaveASEGeomObject(pFile, buff, v, 3, f, 1, nMaterial + ix);
}

int ijk = 1000289;
for(int ix = 0; ix < arrLines.Size(); ix ++, ijk++){

sLine sLine1 = arrLines.e(ix);

if(m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT){
transform_point(&sLine1.ptPos1, &sLine1.ptPos1, &m_pIniSet->mtAseExport);
transform_point(&sLine1.ptPos2, &sLine1.ptPos2, &m_pIniSet->mtAseExport);
}

fprintf(pFile, "*SHAPEOBJECT {\n\
*NODE_NAME \"Line2%d\"\n", ijk);
fprintf(pFile, " *NODE_TM {\n\
*NODE_NAME \"Line3%d\"\n", ijk);
fprintf(pFile, " *INHERIT_POS 0 0 0\n\
*INHERIT_ROT 0 0 0\n\
*INHERIT_SCL 0 0 0\n\
*TM_ROW0 1.0000 0.0000 0.0000\n\
*TM_ROW1 0.0000 -0.0000 1.0000\n\
*TM_ROW2 0.0000 -1.0000 -0.0000\n\
*TM_ROW3 -28.3525 0.0000 -13.4100\n\
*TM_POS -28.3525 0.0000 -13.4100\n\
*TM_ROTAXIS -1.0000 0.0000 0.0000\n\
*TM_ROTANGLE 1.5708\n\
*TM_SCALE 1.0000 1.0000 1.0000\n\
*TM_SCALEAXIS 0.0000 0.0000 0.0000\n\
*TM_SCALEAXISANG 0.0000\n\
}\n\
*SHAPE_LINECOUNT 1\n\
*SHAPE_LINE 0 {\n\
*SHAPE_VERTEXCOUNT 2\n\
*SHAPE_VERTEX_KNOT 0 %f %f %f\n", sLine1.ptPos1.x, sLine1.ptPos1.y, sLine1.ptPos1.z);
fprintf(pFile, " *SHAPE_VERTEX_KNOT 1 %f %f %f\n }\n}\n", sLine1.ptPos2.x, sLine1.ptPos2.y, sLine1.ptPos2.z);
}*/
}

void CMercatorGlobe::CreateASEMaterials(FILE *pFile, int nMaterial)
{/*
for(int ix = 0; ix < arrTriangles.Size(); ix++){
sTriangle sTriangle1 = arrTriangles.e(ix);
CColor24 col = sTriangle1.cCol;
float fTransp = sTriangle1.fTransp;
fprintf(pFile, " *MATERIAL %d {\n", ix + nMaterial);
fprintf(pFile, " *MATERIAL_NAME \"Material #%d\"\n", ix + nMaterial);
fprintf(pFile, " *MATERIAL_CLASS \"Multi/Sub-Object\"\n\
*MATERIAL_AMBIENT %f %f %f\n", col.R(), col.G(), col.B());
fprintf(pFile, " *MATERIAL_DIFFUSE %f %f %f\n", col.R(), col.G(), col.B());
fprintf(pFile, " *MATERIAL_SPECULAR 1.0000 1.0000 1.0000\n\
*MATERIAL_SHINE 0.5000\n\
*MATERIAL_SHINESTRENGTH 0.0000\n\
*MATERIAL_TRANSPARENCY %f\n", fTransp);
fprintf(pFile, " *MATERIAL_WIRESIZE 1.0000\n\
*NUMSUBMTLS 0\n\
}\n");
}
*/
}

https://falcoware.com/rus/ — Бесплатные Игры!!!
Re[13]: Падение доллара и цена шаровары
От: flаt  
Дата: 20.04.25 17:37
Оценка:
Здравствуйте, falcoware, Вы писали:

F>А тут что скажешь?


Многабукав. Засунь в PVS Studio, пусть проверит код. Ну и гопоту попроси, но там рискованно — может фигню сочинить про твой код, но я слышал, что ревью неплохо делает.
Re[14]: Падение доллара и цена шаровары
От: falcoware Россия https://falcoware.com/rus/
Дата: 20.04.25 17:50
Оценка:
Здравствуйте, flаt, Вы писали:

F>Многабукав. Засунь в PVS Studio, пусть проверит код. Ну и гопоту попроси, но там рискованно — может фигню сочинить про твой код, но я слышал, что ревью неплохо делает.


Боссы никому ничего не засовывают. Вернее засовывает, по самые помидоры!
https://falcoware.com/rus/ — Бесплатные Игры!!!
Re[13]: Падение доллара и цена шаровары
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 20.04.25 18:28
Оценка: +1
Здравствуйте, falcoware, Вы писали:

F>А тут что скажешь?


Если код оформлять в цитаты вместо специального тега для кода, то любой код будет выглядеть, как говнокод
Маньяк Робокряк колесит по городу
Re[14]: Падение доллара и цена шаровары
От: falcoware Россия https://falcoware.com/rus/
Дата: 20.04.25 18:37
Оценка: -1
Здравствуйте, Marty, Вы писали:


M>Если код оформлять в цитаты вместо специального тега для кода, то любой код будет выглядеть, как говнокод


САТРАПЫ!!! КАЧАЕМ ДВИГЛО!!!


www.falco3d.com!

¹ Угодно было Дарию поставить над царством сто двадцать сатрапов, чтобы они были во всем царстве,Даниил 6:1
© Библия Онлайн, 2003-2025.



¹ И взглянул я, и вот, Агнец стоит на горе Сионе, и с Ним сто сорок четыре тысячи, у которых имя Отца Его написано на челах. ² И услышал я голос с неба, как шум от множества вод и как звук сильного грома; и услышал голос как бы гуслистов, играющих на гуслях своих. ³ Они поют как бы новую песнь пред престолом и пред четырьмя животными и старцами; и никто не мог научиться сей песни, кроме сих ста сорока четырех тысяч, искупленных от земли. ⁴ Это те, которые не осквернились с женами, ибо они девственники; это те, которые следуют за Агнцем, куда бы Он ни пошел. Они искуплены из людей, как первенцы Богу и Агнцу, ⁵ и в устах их нет лукавства; они непорочны пред престолом Божиим.Откровение 14:1-5
© Библия Онлайн, 2003-2025.

https://falcoware.com/rus/ — Бесплатные Игры!!!
Re[15]: Падение доллара и цена шаровары
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 20.04.25 18:43
Оценка:
Здравствуйте, falcoware, Вы писали:

Спамеры будут гореть в аду.
Маньяк Робокряк колесит по городу
Re[16]: Падение доллара и цена шаровары
От: falcoware Россия https://falcoware.com/rus/
Дата: 20.04.25 18:46
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, falcoware, Вы писали:


M>Спамеры будут гореть в аду.


https://www.youtube.com/watch?v=m-TfYwLSMUE
https://falcoware.com/rus/ — Бесплатные Игры!!!
Re: Падение доллара и цена шаровары
От: Vld17 Россия  
Дата: 20.04.25 21:08
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Второй момент касательно курса рубля — он всегда определялся уровнем экспорта нефти и газа, как сейчас с этим?


Определяется в том числе и платежным балансом, а он по-прежнему положительный. Экспорт по итогам I кв '25 уменьшился до минимума за последние 2 года, но одновременно уменьшился и импорт.
Низким курсом доллара к рублю пытаются удержать инфляцию. Получается сами видите что.
Re: Падение доллара и цена шаровары
От: modev  
Дата: 22.04.25 02:33
Оценка: 2 (1)
Здравствуйте, Khimik, Вы писали:

K>Доллар падает, и мне непонятен механизм этого. Посмотрел видео иноагента Варламова:


K>https://youtu.be/5f1FM47Rb9E


K>То что падает курс доллара курс доллара по отношению к рублю — это именно доллар падает, или рубль укрепляется? Запад беднеет или Россия богатеет?


Посмотри на "индекс доллара" — это курс доллара к корзине из 6 валют (шв. франк, евро, йена и т.д.) Тут рыжий Донни еще старается Доллар сейчас рекордно ослаб к корзине.

K>Второй момент касательно курса рубля — он всегда определялся уровнем экспорта нефти и газа, как сейчас с этим?


Он определялся разницей экспорта и импорта. Она у России всегда положительная, и довольно сильно. Сейчас импорт-то тоже снизился. "Ставка работает" (тм) И там же еще движение капитала учитывается: сейчас практически полностью заблочены нерезиденты. Я помню, как раньше, когда шли выплаты крупных дивидендов Сбера и т.д., сразу ожидали падения рубля на несколько процентов, так как половина сберо-дивидендов сразу уходила за речку. Сейчас этого нет, дивы в рублях оседают на спец. счете типа С. Плюс куча олигархов, выводивших капитал, сейчас под санкциями, т.е. тут западные санкции в пользу рубля сыграли. В ноябре-2024 очередную кучу банков и особенно депозитариев (сделки с ценными бумагами) добавили в сдн, вот эти депозитарии активно участвовали в перестановке акций "из-за речки", тут тоже валюта утекала, а амеры своими санкциями прикрыли этот поток. Если раньше какой-нибудь топ-менеджер через дружественные страны выводил валюту и покупал расписки Новатэка (как пример) подешевке, заводил сюда, то в ноябре амеры внесли в санкции те депозитарии, которые в этом участвовали. Как в РФ, так и у всяких арабов. Ну и еще наши очередным указаом прикрыли лазейку с получением дивидендов от таких переставленных через друзей бумаг, они эти лазейки с 2022 прикрывают, вот в конце прошлого года очередную прикрыли. Смысл подобных операций пропал, значит, валюты утекает меньше.

За годы санкций (точнее, с июня 2022, когда отменили обязательную репатриацию валютной выручки) экспортеры накопили около 50 ярдов в долларовом эквиваленте в дружественных странах. Под ежемесячные налоговые платежи и другие рублевые затраты они брали рублевые кредиты (рост кредитования, рост прибылей банков, рост денежной массы), а не продавали тупо каждый месяц валюту. В какой-то момент это приостановили: либо "ставка 21% сработала", либо банковские лимиты сработали — ужесточили лимиты на кредитование, стали снижать выдачу кредитов таким образом. И экспортерам пришлось продавать из накопленной кубышки. Некоторые проф. участники считают, что дело именно в закрученных лимитах на банковское кредитование, а высокая ставка избыточна, но это оффтоп для данной темы. В данном случае нам важно то, что экспортеров стали меньше рублями кредитовать, им пришлось слить часть накопленной у друзей кубышки.

И еще важный фактор — открытая валютная позиция банков. Особенно ВТБ. На февраль 2022 года регулятор ЦБ серьезно облажался, допустив огромную открытую валютную позицию у такого крупнейшего банка как ВТБ. Пришлось исправлять. Есть мнение, что в валютных горках часть действий — именно управление такой аномальной открытой валютной позицией крупных банков.

С бюджетом это, конечно, будет проблемой. Но пока вот ЦБ с Минфином десяточку ярдов в месяц продают, это тоже в пользу рубля. "Бюджетное правило работает" (тм).
Отредактировано 22.04.2025 2:40 modev . Предыдущая версия .
Re[5]: Падение доллара и цена шаровары
От: Khimik  
Дата: 27.04.25 15:10
Оценка:
Здравствуйте, PeterOne, Вы писали:

PO>Да, рублевую денежную массу M2. Это открытая информация, ее регулярно раскрывает ЦБ на своем сайте.


PO>На 1 февраля 2022 М2 была 66 трл руб. А на 1 февраля 2025 уже 117 трлн руб. До 2022 темпы прироста М2 были около 8% в год, а сейчас около 20%

PO>Причем деньги видимо в основном идут в ВПК и людям на фронте.

Я попытался нагуглить эту информацию на сайте ЦБ, нашёл 117 триллионов за этот год, но пока не нашёл данные по 2022 году. Можете дать ссылку на архив ЦБ с этой цифрой?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Re[6]: Падение доллара и цена шаровары
От: PeterOne  
Дата: 27.04.25 16:19
Оценка: 2 (1)
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, PeterOne, Вы писали:


PO>>Да, рублевую денежную массу M2. Это открытая информация, ее регулярно раскрывает ЦБ на своем сайте.


PO>>На 1 февраля 2022 М2 была 66 трл руб. А на 1 февраля 2025 уже 117 трлн руб. До 2022 темпы прироста М2 были около 8% в год, а сейчас около 20%

PO>>Причем деньги видимо в основном идут в ВПК и людям на фронте.

K>Я попытался нагуглить эту информацию на сайте ЦБ, нашёл 117 триллионов за этот год, но пока не нашёл данные по 2022 году. Можете дать ссылку на архив ЦБ с этой цифрой?


117 трлн руб — это накопленная сумма всей денежной массы М2 (нарастающим итогом).
Т.е. за 3 года прирост +50 трлн руб, это добавлено денег в экономику.

https://ru.tradingview.com/symbols/ECONOMICS-RUM2/

https://www.cbr.ru/statistics/macro_itm/dkfs/sr_ma_estim/
Re[7]: Падение доллара и цена шаровары
От: Khimik  
Дата: 27.04.25 16:27
Оценка: :)
Здравствуйте, PeterOne, Вы писали:

K>>Я попытался нагуглить эту информацию на сайте ЦБ, нашёл 117 триллионов за этот год, но пока не нашёл данные по 2022 году. Можете дать ссылку на архив ЦБ с этой цифрой?


PO>117 трлн руб — это накопленная сумма всей денежной массы М2 (нарастающим итогом).

PO>Т.е. за 3 года прирост +50 трлн руб, это добавлено денег в экономику.

PO>https://ru.tradingview.com/symbols/ECONOMICS-RUM2/


PO>https://www.cbr.ru/statistics/macro_itm/dkfs/sr_ma_estim/


Спасибо, по первой ссылке это есть, но по второй я не нашёл (искал данные за 2022 год). Ну ладно, логично что власти эту инфу трут.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Re[7]: Падение доллара и цена шаровары
От: modev  
Дата: 09.05.25 08:20
Оценка:
PO>117 трлн руб — это накопленная сумма всей денежной массы М2 (нарастающим итогом).
PO>Т.е. за 3 года прирост +50 трлн руб, это добавлено денег в экономику.

До СВО валютных кредитов (всех) было около 490 млрд долларов, недавно стало 300 млрд. Т.е. 190 млрд долларов, пусть по курсу 80, кредитов перешли в рублевые, это +15 трлн к М2 за эти три года. Курс по минимум взял, было время и по 100 рублей конвертировали в рублевые кредиты.

Плюс выкупленное у тех уходящих, у кого за боле-менее вменяемую цену выкупили (Шелл за млрд долларов, Nokian Tyres за 300 млн евро и т.д.).

Так что правильнее смотреть с учетом текущей ситуации М2х* (с учетом валютной переоценки). tradingview ее не показывает, на сайте ЦБ все есть
https://www.cbr.ru/statistics/macro_itm/dkfs/monetary_agg/

Кредитование (главным образом экспортеров) только недавно ограничили, чего тянули — флеймовая тема.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.