Падение доллара и цена шаровары
От: Khimik  
Дата: 19.04.25 15:07
Оценка: :)
Доллар падает, и мне непонятен механизм этого. Посмотрел видео иноагента Варламова:

https://youtu.be/5f1FM47Rb9E

То что падает курс доллара курс доллара по отношению к рублю — это именно доллар падает, или рубль укрепляется? Запад беднеет или Россия богатеет? Вопрос наверно всем понятен, и главный момент — если есть именно долларовая инфляция, наверно имеет смысл поднять цену за шаровару?
Я очень люблю фразу "инфляция это налог плохих правительств": когда большие дяди печатают деньги, чтобы стать ещё богаче, это разрушает экономику и приводит к исчезновению среднего класса; поэтому лучшим средством для простого человека спасти свои деньги становятся биткоины или золото. Вроде при Байдене был именно такой механизм инфляции — ФРС США печатала всё больше долларов. А сейчас какой механизм? Трамп печатает доллары? Второй момент касательно курса рубля — он всегда определялся уровнем экспорта нефти и газа, как сейчас с этим?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Re: Падение доллара и цена шаровары
От: falcoware Россия https://falcoware.com/rus/
Дата: 19.04.25 15:16
Оценка: -1
Здравствуйте, Khimik, Вы писали:

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


А может тебе сделать клона своего продукта? Выдавишь потенциальных конкурентов и цена продукта вырастит в два раза?
Если один закроется, второй выручит?

⁹ Лучше быть вдвоем, чем одному; тогда есть и у двоих доброе воздаяние за их старания: ¹⁰ один упадет — другой его поднимет, но когда один упадет, а другого нет — некому и поднять. ¹¹ Улягутся двое — и тепло им, а в одиночку — как согреться? ¹² С одиночкою сладят быстро, но двое против одного устоят, а уж тройная веревка оборвется не скоро.Экклезиаст 4:9-12
© Библия Онлайн, 2003-2025.

https://falcoware.com/rus/ — Бесплатные Игры!!!
Re: Падение доллара и цена шаровары
От: Morgan  
Дата: 19.04.25 15:17
Оценка:
да это просто панические распродажи доллара из-за торговой войны Трампа и Китая (огромные пошлины). К евро бакс упал до 1.14, что не раз уже бывало. Пишут, что бакс отскочит снова выше 100 рублей. Я в прошлом году не дождался, вложился в депозиты. И через несколько месяцев бакс был по 110. А теперь смотрю в личном кабинете налоговой, все депозиты им уже известны. Ни у кого не блокировали счета по 115-ФЗ?

Можете затариться электроникой, она серьезно подешевела на Али из-за курсов. К примеру крутой смартфон Poco M6 Pro с прошивкой MIUI / Android 13 всего за 13 тр. Очень шустрая модель практически без недостатков, отличный подарок хоть кому
Independent software developer
Re[2]: Падение доллара и цена шаровары
От: PeterOne  
Дата: 19.04.25 15:40
Оценка: +1
Прогнозы давать дело неблагодарное, но скорее всего текущее укрепление рубля временное. С учетом снижения цен на нефть, большую эмиссию денег (прирост денежной массы М2 на 19-20% каждый год последние 3 года) и огромные расходы на ВПК. Наша экономика все еще в значительной мере экспортно сырьевая.

Но есть большой риск фиксации курса ЦБ, по примеру Ирана.
По сути смотреть на реальный курс в этом случае придется будет по курсу наличного доллара и P2P расчетов через стейблкоины. А также курсы перевода валюты в банки стран СНГ.
Re[2]: Падение доллара и цена шаровары
От: Morgan  
Дата: 19.04.25 15:42
Оценка:
Здравствуйте, falcoware, Вы писали:

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


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


F>А может тебе сделать клона своего продукта? Выдавишь потенциальных конкурентов и цена продукта вырастит в два раза?

F>Если один закроется, второй выручит?

Я делал в начале шаровары 20 лет назад клон перекрашенный и продал, правда дёшево. А теперь не помню, как в mfc цвет фона и текста окон менять, может кто подскажет?
Independent software developer
Re[3]: Падение доллара и цена шаровары
От: falcoware Россия https://falcoware.com/rus/
Дата: 19.04.25 15:46
Оценка:
Здравствуйте, Morgan, Вы писали:


M>Я делал в начале шаровары 20 лет назад клон перекрашенный и продал, правда дёшево. А теперь не помню, как в mfc цвет фона и текста окон менять, может кто подскажет?


Фон вроде OnEraseBackground() текс окна SetWindowText ?
https://falcoware.com/rus/ — Бесплатные Игры!!!
Re[4]: Падение доллара и цена шаровары
От: Morgan  
Дата: 19.04.25 15:55
Оценка:
Здравствуйте, falcoware, Вы писали:

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



M>>Я делал в начале шаровары 20 лет назад клон перекрашенный и продал, правда дёшево. А теперь не помню, как в mfc цвет фона и текста окон менять, может кто подскажет?


F>Фон вроде OnEraseBackground() текс окна SetWindowText ?


Я думал WM_CTLCOLOR ?
Independent software developer
Re[5]: Падение доллара и цена шаровары
От: falcoware Россия https://falcoware.com/rus/
Дата: 19.04.25 16:01
Оценка:
Здравствуйте, Morgan, Вы писали:

M>Я думал WM_CTLCOLOR ?


Это если элементы диалога перекрасить хочешь.
https://falcoware.com/rus/ — Бесплатные Игры!!!
Re[6]: Падение доллара и цена шаровары
От: Morgan  
Дата: 19.04.25 16:05
Оценка:
Здравствуйте, falcoware, Вы писали:

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


M>>Я думал WM_CTLCOLOR ?


F>Это если элементы диалога перекрасить хочешь.


У меня именно диалоги...
Independent software developer
Re[7]: Падение доллара и цена шаровары
От: falcoware Россия https://falcoware.com/rus/
Дата: 19.04.25 16:09
Оценка:
Здравствуйте, Morgan, Вы писали:

M>У меня именно диалоги...


HBRUSH CTranspInlay::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

switch(pWnd->GetDlgCtrlID()){
case IDC_STATIC_SHADE_VALUE:
pDC->SetTextColor(RGB(255 * (1.f — pIniSet->fInlayTrasparent), 0, 0));
pDC->SetBkMode(TRANSPARENT);
break;
}
return hbr;
}

https://falcoware.com/rus/ — Бесплатные Игры!!!
Re[7]: Падение доллара и цена шаровары
От: sembel Fast Version Control System
Дата: 19.04.25 16:14
Оценка:
хм... открываем https://chat.deepseek.com

И спрашиваем: Как менять цвет текста и фона в MFC?
Re[3]: Падение доллара и цена шаровары
От: Khimik  
Дата: 19.04.25 17:10
Оценка:
Здравствуйте, PeterOne, Вы писали:

PO>Прогнозы давать дело неблагодарное, но скорее всего текущее укрепление рубля временное. С учетом снижения цен на нефть, большую эмиссию денег (прирост денежной массы М2 на 19-20% каждый год последние 3 года) и огромные расходы на ВПК. Наша экономика все еще в значительной мере экспортно сырьевая.


М2 вы имеете в виду рублёвую? А у вас какая-то инсайдерская информация? Логично что рубль печатается, и мне казалось даже не по 20% в год, а по 30%, судя по уровню инфляции.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Re[2]: Падение доллара и цена шаровары
От: Bill Baklushi СССР  
Дата: 19.04.25 17:57
Оценка: +1 -1 :)
Morgan:

M>Я в прошлом году не дождался, вложился в депозиты. И через несколько месяцев бакс был по 110.

А в соседней теме у него денег нету, чтобы заплатить подрядчику (с этого форума, между прочим), всё якобы жена отняла.
Неувязочка.
Re[4]: Падение доллара и цена шаровары
От: PeterOne  
Дата: 19.04.25 18:07
Оценка: 2 (1)
Здравствуйте, Khimik, Вы писали:

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


PO>>Прогнозы давать дело неблагодарное, но скорее всего текущее укрепление рубля временное. С учетом снижения цен на нефть, большую эмиссию денег (прирост денежной массы М2 на 19-20% каждый год последние 3 года) и огромные расходы на ВПК. Наша экономика все еще в значительной мере экспортно сырьевая.


K>М2 вы имеете в виду рублёвую? А у вас какая-то инсайдерская информация? Логично что рубль печатается, и мне казалось даже не по 20% в год, а по 30%, судя по уровню инфляции.


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

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

У американцев с 2022 года денежная масса $ не растет.

Курс $ сейчас сдерживается многими факторами. И еще отсутствие биржевых торгов с июня 2024, а торги идут где-то в "темном углу" через крупные банки. Курс ЦБ определяется непрозрачной процедурой, в отсутствие открытых торгов.

Еще нужно помнить про запертых нерезидентов в акциях и активах, которые в случае окончания конфликта могут захотеть все продать и купить валюту для перевода из РФ.

Все очень сложно. Но все может сложится самым непредсказуемым образом. Возможен и курс по 50 руб и курс под 150 руб. Штормить еще долго будет.
Re[8]: Падение доллара и цена шаровары
От: Unhandled_Exception Россия  
Дата: 19.04.25 18:45
Оценка:
Здравствуйте, sembel, Вы писали:

S>хм... открываем https://chat.deepseek.com


S>И спрашиваем: Как менять цвет текста и фона в MFC?


Не надо. Пусть обсудят тут.
Re[9]: Падение доллара и цена шаровары
От: Morgan  
Дата: 20.04.25 00:45
Оценка:
Здравствуйте, Unhandled_Exception, Вы писали:

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


S>>хм... открываем https://chat.deepseek.com


S>>И спрашиваем: Как менять цвет текста и фона в MFC?


U_E>Не надо. Пусть обсудят тут.


И на самом деле, прога Perplexity даёт ответ:

В MFC для изменения цвета фона и текста обычно обрабатывают сообщение WM_CTLCOLOR, переопределяя функцию OnCtlColor в вашем диалоговом окне или контроле. Пример для диалогового окна:

cpp
HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
pDC->SetTextColor(RGB(255, 255, 255)); // цвет текста
pDC->SetBkColor(RGB(0, 0, 128)); // цвет фона
static HBRUSH hBrush = ::CreateSolidBrush(RGB(0, 0, 128));
return hBrush;
}
Не забудьте объявить virtual HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); и добавить ON_WM_CTLCOLOR() в message map.

Для изменения цвета кнопки CMFCButton можно использовать методы:

SetFaceColor(COLORREF crFace, BOOL bRedraw=TRUE) — задает цвет фона кнопки.

SetTextColor(COLORREF clrText) — задает цвет текста кнопки.

Если нужно менять цвет текста при выводе через CDC (например, в методах OnPaint), используйте:

CDC::SetTextColor(COLORREF color) — установить цвет текста.

CDC::SetBkColor(COLORREF color) — установить цвет фона текста.

CDC::SetBkMode(OPAQUE или TRANSPARENT) — режим отрисовки фона текста.

Таким образом, для изменения цвета фона и текста в MFC:

Для диалогов и контролов: переопределяйте OnCtlColor.

Для кнопок CMFCButton: используйте SetFaceColor и SetTextColor.

Для произвольного рисования текста: используйте методы CDC.

Это стандартные и рекомендуемые способы изменения цветов в MFC
Independent software developer
Re[10]: Падение доллара и цена шаровары
От: falcoware Россия https://falcoware.com/rus/
Дата: 20.04.25 01:12
Оценка: -1
Здравствуйте, Morgan, Вы писали:

А как тебе такой код?:

// CFalcoGrid.cpp: файл реализации
// CFalcoGrid.cpp: файл реализации
//

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

#include "Scene.h"

// Диалоговое окно CFalcoGrid

IMPLEMENT_DYNAMIC(CFalcoGrid, CDialogEx)

CFalcoGrid::CFalcoGrid(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_DIALOG_GRID, pParent)
{
g_nColummnGrid = g_nRowsGrid = 0;

m_bFactor = FALSE;
m_bColumn = FALSE;
m_bRowMatrix = FALSE;
m_bSingular = FALSE;
}

CFalcoGrid::~CFalcoGrid()
{
}

void CFalcoGrid::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CFalcoGrid, CDialogEx)
ON_WM_SIZE()
ON_WM_GETMINMAXINFO()
ON_WM_PAINT()
ON_WM_ACTIVATE()
ON_WM_SETFOCUS()
ON_WM_TIMER()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

#define VS_NUM_GRIDS 15

void(*functionPtrGrid)(char*, int);

extern "C" __declspec(dllimport) void CreateGrid(HWND & hgrid, HINSTANCE hInstance, HWND hWnd, int nSizeX, int nSizeY, double* pMem, char** pArrStrColumns, char** pArrStrRows, void* pFunction, BYTE * pCategoricalColArray, BYTE * pCategoricalRowArray, int nIndex, int nDecimals, int nOffset);
extern "C" __declspec(dllimport) void SetCellItem(int x, int y, char* pStr, float fValue);
extern "C" __declspec(dllimport) void SetCellItemString(int x, int y, char* pStr);
extern "C" __declspec(dllimport)void GetCellItem(int x, int y, char*& pStr);
extern "C" __declspec(dllimport)void SetPointers(double* pMem, char** pArrStrColumns, char** pArrStrRows);
extern "C" __declspec(dllimport)void SetFontGrid(HFONT hFont);
extern "C" __declspec(dllimport)void SetHeaderString(int nIndex);

#define WIDTHBYTES(bits) (((bits) + 31)/32 * 4)

void CFalcoGrid::FillGrid()
{
// SetHeaderString1(m_nIndex);

CString s;
s.Format("%d", m_nIndex);
// AfxMessageBox(s);

if (!IsWindowVisible()) { return; }

if (::IsWindow(g_hgrid)) {
::DestroyWindow(g_hgrid);
/* CreateGrid(g_hgrid, AfxGetInstanceHandle(), m_hWnd, g_nColummnGrid, g_nRowsGrid, (double*)g_mtEmptyGrid, (char**)g_pStrArrColumnsGrid, (char**)g_pStrArrRowsGrid, functionPtrGrid, g_pCategoricalColArrayGrid, g_pCategoricalRowArrayGrid, m_nIndex, m_pScene->m_nDecimalsForGrids);

CRect rcRect;
::GetClientRect(g_hgrid, &rcRect);
CDC* pDC = CWnd::FromHandle(g_hgrid)->GetDC();

m_cImage.Create(rcRect.Width(), rcRect.Height(), 32);
HDC imageHDC = m_cImage.GetDC();
::BitBlt(imageHDC, 0, 0, rcRect.Width(), rcRect.Height(), pDC->GetSafeHdc(), 0, 0, SRCCOPY);
ReleaseDC(pDC);

return;*/
}

// Remove old.
for (int xx2 = 0; xx2 < g_nColummnGrid; xx2++) {
delete[]g_pStrArrColumnsGrid[xx2];
}

for (int xx1 = 0; xx1 < g_nRowsGrid; xx1++) {
delete []g_pStrArrRowsGrid[xx1];
}

if (g_nColummnGrid && g_nRowsGrid) {
delete[]g_pCategoricalColArrayGrid;
delete[]g_pCategoricalRowArrayGrid;
// delete[]g_mtEmptyGrid;

delete[]g_pStrArrRowsGrid;
delete[]g_pStrArrColumnsGrid;
}

int nSzX = m_pData->SizeX();
int nSzY = m_pData->SizeY();

g_nColummnGrid = nSzX;
g_nRowsGrid = nSzY;

if (m_bFactor) {
g_nColummnGrid = nSzX = m_pData->SizeX();
g_nRowsGrid = nSzY = m_pData->SizeY();
if (m_bColumn) {
g_nRowsGrid = nSzY = m_pScene->m_matrCAL.SizeX();
}
}

if (m_bRowMatrix) {
g_nColummnGrid = nSzX = m_pData->SizeX();
g_nRowsGrid = nSzY = m_pData->SizeY();
}

if (!nSzX || !nSzY) {
return;
}

g_pStrArrColumnsGrid = new char* [sizeof(char*) * nSzX];
g_pStrArrRowsGrid = new char* [sizeof(char*) * nSzY];

int nColumns = 0;

if (m_bFactor) {
for (int ix = 0; ix < nSzX; ix++) {
char buff[100];

if (m_bSingular) {
sprintf(buff, "Vector %d", ix + 1);
}
else {
sprintf(buff, "Factor %d", ix + 1);
}

int nLen = strlen(buff);
char* pPointer = (char*)new char[sizeof(char) * (nLen + 1)];

strcpy((char*)pPointer, buff);
*(g_pStrArrColumnsGrid + ix) = pPointer;

}
if (m_bColumn) {
for (int ix = 0; ix < nSzY; ix++) {
CObj3d* pObj = m_pScene->m_parrObjs.e(ix);

char* pData = pObj->GetName();

int nLen = strlen(pData);
char* pPointer = (char*)new char[sizeof(char) * (nLen + 1)];

strcpy((char*)pPointer, pData);

*(g_pStrArrRowsGrid + ix) = pPointer;
}
}else {
for (int ix = 0; ix < nSzY; ix++) {
CObj3d* pObj = m_pScene->m_parrObjs.e(ix + m_pScene->GetSizeColumns());

char* pData = pObj->GetName();

int nLen = strlen(pData);
char* pPointer = (char*)new char[sizeof(char) * (nLen + 1)];

strcpy((char*)pPointer, pData);
*(g_pStrArrRowsGrid + ix) = pPointer;
}
}
}
else {
for (int ix = 0; ix < m_pScene->m_parrObjs.Size(); ix++) {
CObj3d* pObj = m_pScene->m_parrObjs.e(ix);

char* pData = pObj->GetName();
int nLen = strlen(pData);

char* pPointer = (char*)new char[sizeof(char) * (nLen + 1)];

strcpy((char*)pPointer, pData);

if (pObj->m_nType == PP_CUBE_TYPE) {
if (m_bRowMatrix) {
*(g_pStrArrRowsGrid + ix) = pPointer;
}
else {
*(g_pStrArrColumnsGrid + ix) = pPointer;
}
nColumns = ix;
}
else {
if (m_bRowMatrix) {
*(g_pStrArrColumnsGrid + ix — m_pScene->m_matrCAL.SizeX()) = pPointer;
}
else {
*(g_pStrArrRowsGrid + ix — m_pScene->m_matrCAL.SizeX()) = pPointer;
}
}
}
}

for (int ix = 0; ix < nSzX; ix++) {
// AfxMessageBox(*(g_pStrArrColumnsGrid + ix));
}
for (int ix = 0; ix < nSzY; ix++) {
// AfxMessageBox(*(g_pStrArrRowsGrid + ix));
}

g_mtEmptyGrid = new double[(nSzX + 1) * (nSzY + 1)];
// ZeroMemory(g_mtEmptyGrid, (nSzX) * (nSzY) * sizeof(double));

// GlobalLock(g_mtEmpty);
double* pTable = (double*)g_mtEmptyGrid;

for (int iy1 = 0; iy1 < nSzY; iy1++) {
for (int ix1 = 0; ix1 < nSzX; ix1++) {
pTable[nSzX * (iy1) + ix1] = m_pData->e(ix1, iy1);
}
}

functionPtrGrid = NULL;

g_pCategoricalColArrayGrid = new BYTE[nSzX + 1];
g_pCategoricalRowArrayGrid = new BYTE[nSzY + 1];

ZeroMemory(g_pCategoricalColArrayGrid, nSzX + 1);
ZeroMemory(g_pCategoricalRowArrayGrid, nSzY + 1);

// AfxMessageBox("OK");

int nOffset = 0;
if (m_nIndex == 2 || m_nIndex == 9) { // reexpression.
if (m_pScene->m_Settings.m_nInversion) {
nOffset = 1;
}
if (m_pScene->m_Settings.m_bMinusSignInvert) {
nOffset = 2;
}
if (m_pScene->m_Settings.m_nDataReExpression) {
if (m_pScene->m_Settings.m_nLogBase == 1) {
nOffset = 3;
}
if (m_pScene->m_Settings.m_nLogBase == 0) {
nOffset = 4;
}
}
}
if (m_nIndex == 3 || m_nIndex == 10) { // Closure
nOffset = m_pScene->m_Settings.m_nClosure;
}
if (m_nIndex == 4 || m_nIndex == 11) { // Centering.
nOffset = m_pScene->m_Settings.m_nCentering;
}
if (m_nIndex == 5 || m_nIndex == 12) { // Normalization.
nOffset = m_pScene->m_Settings.m_nNormalization;
}

CreateGrid(g_hgrid, AfxGetInstanceHandle(), m_hWnd, nSzX, nSzY, (double*)g_mtEmptyGrid, (char**)g_pStrArrColumnsGrid, (char**)g_pStrArrRowsGrid, functionPtrGrid, g_pCategoricalColArrayGrid, g_pCategoricalRowArrayGrid, m_nIndex, m_pScene->m_nDecimalsForGrids, nOffset);
g_phgrid2Grid = &g_hgrid;
g_hWndGrid = m_hWnd;

CRect rcRect;
::GetClientRect(g_hgrid, &rcRect);
CDC* pDC = CWnd::FromHandle(g_hgrid)->GetDC();

m_cImage.Create(rcRect.Width(), rcRect.Height(), 32);
HDC imageHDC = m_cImage.GetDC();
::BitBlt(imageHDC, 0, 0, rcRect.Width(), rcRect.Height(), pDC->GetSafeHdc(), 0, 0, SRCCOPY);
ReleaseDC(pDC);

delete g_mtEmptyGrid;
}

void CFalcoGrid::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);

// TODO: добавьте свой код обработчика сообщений
::MoveWindow(g_hgrid, 0, 0, cx, cy, TRUE);
}

BOOL CFalcoGrid::OnInitDialog()
{
CDialogEx::OnInitDialog();

SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE); // Set big icon
SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), FALSE); // Set small icon

CenterWindow();

SetTimer(0, 100, 0);

return TRUE; // return TRUE unless you set the focus to a control
// Исключение: страница свойств OCX должна возвращать значение FALSE
}

void CFalcoGrid::SetFontGrid1(HFONT hFont)
{
SetFontGrid(hFont);
FillGrid();
}

void CFalcoGrid::SetHeaderString1(int nIndex)
{
m_nIndex = nIndex;
SetHeaderString(nIndex);
}

void CFalcoGrid::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
if (m_pScene->m_bCascadedMode) {
// lpMMI->ptMaxTrackSize.x = m_pScene->m_rcCascaded.Width();
// lpMMI->ptMaxTrackSize.y = m_pScene->m_rcCascaded.Height();
}
CDialogEx::OnGetMinMaxInfo(lpMMI);
}


void CFalcoGrid::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: добавьте свой код обработчика сообщений
// Не вызывать CDialogEx::OnPaint() для сообщений рисования

if (GetActiveWindow() != this) {
CWnd* pWnd = CWnd::FromHandle(g_hgrid);
if (pWnd) {
pWnd->ShowWindow(SW_HIDE);
}

m_cImage.BitBlt(dc.m_hDC, 0, 0);
}
}

#include "CDataView.h"

BOOL g_bOnce = FALSE;
void CFalcoGrid::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
g_bOnce = TRUE;

if (::IsWindow(g_hgrid)) {
if (m_pScene && m_pScene->m_pDataView){
CWnd* pWnd = CWnd::FromHandle(m_pScene->m_pDataView->g_hgrid2);
if (pWnd) {
pWnd->ShowWindow(SW_HIDE);
}
}
}

CDialogEx::OnActivate(nState, pWndOther, bMinimized);
}


void CFalcoGrid::OnSetFocus(CWnd* pOldWnd)
{
CDialogEx::OnSetFocus(pOldWnd);

// TODO: добавьте свой код обработчика сообщений
// FillGrid();
}

void CFalcoGrid::OnTimer(UINT_PTR nIDEvent)
{
// TODO: добавьте свой код обработчика сообщений или вызов стандартного
if (GetActiveWindow() == this && g_bOnce) {
g_bOnce = FALSE;
FillGrid();

CRect rcRect;
::GetClientRect(g_hgrid, &rcRect);
CDC* pDC = CWnd::FromHandle(g_hgrid)->GetDC();

m_cImage.Create(rcRect.Width(), rcRect.Height(), 32);
HDC imageHDC = m_cImage.GetDC();
::BitBlt(imageHDC, 0, 0, rcRect.Width(), rcRect.Height(), pDC->GetSafeHdc(), 0, 0, SRCCOPY);
ReleaseDC(pDC);
m_cImage.ReleaseDC();
}

CDialogEx::OnTimer(nIDEvent);
}


BOOL CFalcoGrid::PreTranslateMessage(MSG* pMsg)
{
// TODO: добавьте специализированный код или вызов базового класса
if (IsWindowVisible())
{
// SetHeaderString1(m_nIndex);
}

return CDialogEx::PreTranslateMessage(pMsg);
}

void CFalcoGrid::OnLButtonDown(UINT nFlags, CPoint point)
{
CDialogEx::OnLButtonDown(nFlags, point);
}

https://falcoware.com/rus/ — Бесплатные Игры!!!
Re[3]: Падение доллара и цена шаровары
От: Morgan  
Дата: 20.04.25 01:30
Оценка:
Здравствуйте, Bill Baklushi, Вы писали:

BB>Morgan:


M>>Я в прошлом году не дождался, вложился в депозиты. И через несколько месяцев бакс был по 110.

BB>А в соседней теме у него денег нету, чтобы заплатить подрядчику (с этого форума, между прочим), всё якобы жена отняла.
BB>Неувязочка.

Я ему платил 30 тр, просто ему мало было. За несколько дней работы. Об этом он умалчивает публично.
Independent software developer
Re[4]: Падение доллара и цена шаровары
От: PeterOne  
Дата: 20.04.25 06:52
Оценка: +1
Некоторые пользователи знают о таком понятии как оффтопик? Этот топик изначально был совсем о другой теме (курс доллара).
Отредактировано 20.04.2025 6:52 PeterOne . Предыдущая версия .
Re[5]: Падение доллара и цена шаровары
От: Morgan  
Дата: 20.04.25 07:53
Оценка:
Здравствуйте, PeterOne, Вы писали:

PO>Некоторые пользователи знают о таком понятии как оффтопик? Этот топик изначально был совсем о другой теме (курс доллара).


У курса доллара обычная коррекция

См график на Макс.
https://www.google.com/search?q=usd+rub&amp;oq=usd+rub&amp;gs_lcrp=EgZjaHJvbWUyFAgAEEUYORhGGIMBGIICGLEDGIAEMgcIARAAGIAEMgcIAhAAGIAEMgcIAxAAGIAEMgcIBBAAGIAEMgcIBRAAGIAEMgcIBhAAGIAEMgcIBxAAGIAEMgcICBAAGIAEMgcICRAAGIAEMgcIChAAGIAEMgcICxAAGIAEMgcIDBAAGIAEMgcIDRAAGIAEMgcIDhAAGIAE0gEHMzkyajBqN6gCFLACAfEFW3XETv_xmkU&amp;client=ms-android-xiaomi-terr1-rso2&amp;sourceid=chrome-mobile&amp;ie=UTF-8&amp;sei=26cEaPDsIruxwPAPh6e1yAw
Independent software developer
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...
Пока на собственное сообщение не было ответов, его можно удалить.