Программирование (общая "болталка")

Всё, что касается программирования на старых языках или для старых систем

Re: Программирование (общая "болталка")

Сообщение uav » 04 фев 2024, 13:08

clihlt писал(а):Вы имеете ввиду по цветовой палитре?

clihlt, да. Ну и во втором случае про Марс есть в описании. Понятно, что это процедурная графика, а не попытка моделировать реальный рельеф.
Последний раз редактировалось uav 04 фев 2024, 13:08, всего редактировалось 1 раз.
Аватара пользователя
uav
Мастер Даунгрейда
 
Сообщения: 1933
Зарегистрирован: 22 дек 2008, 14:21

Re: Программирование (общая "болталка")

Сообщение longhorn_gnu » 26 фев 2024, 19:37

Мой друг (KovshKomeij) написал парсер Midi, который конвертирует музыку в чиптюн для Turbo C++ в DOS на Python. Вот сорсы. Нужна для него библиотека mido. По сути это полезный пример того, что кодить под старые ОСи можно и сегодня довольно удобно.
Вложения
main.py.tar.gz
(565 байт) Скачиваний: 31
Последний раз редактировалось longhorn_gnu 26 фев 2024, 19:40, всего редактировалось 1 раз.
Software is like sex: it's better when it's free.
Изображение
Аватара пользователя
longhorn_gnu
Мастер Даунгрейда
 
Сообщения: 750
Зарегистрирован: 05 июн 2023, 08:32
Железо: Intel Core I5, встройка на 256 мб и 8 гб ОЗУ

Фигуры Лиссажу

Сообщение rvg » 04 мар 2024, 20:54

Программа рисует фигуры Лиссажу - замкнутые траектории, прочерчиваемые точкой, совершающей одновременно два гармонических колебания в двух взаимно перпендикулярных направлениях.
Ранее - программа была размещена (мной) на одном из форумов. Нарисовано по формулам, средствами Windows API, такого варианта в сети - нет! Из-за многочисленных вычислений программа работает с притормаживанием.
 Развернуть: Lissajous.cpp
Код: Выделить всё
/* Lissajous.cpp
*
* Фигуры Лиссажу - замкнутые траектории, прочерчиваемые
* точкой, совершающей одновременно два гармонических
* колебания в двух взаимно перпендикулярных направлениях. */

#include <math.h>
#include <windows.h>
#ifndef   M_PI
const double M_PI=3.14159265358979323846;
#endif
char* GAppname="Фигуры Лиссажу";
HWND g_hwndStatic[3]; /* Четыре хэндла рамки "static". */

void DrawFigure_1(HWND hWnd) {
   RECT rect;
   HDC hDC=GetDC(g_hwndStatic[0]);
   GetClientRect(g_hwndStatic[0],&rect);
   HPEN hPen=CreatePen(PS_SOLID,3,RGB(0,0,255));
   HGDIOBJ gdi=SelectObject(hDC,hPen);
   double t=0;
   int x=static_cast<int>((-90.5*sin(3*t)+rect.right/2));
   int y=static_cast<int>((90.5*cos(t)-1.3*cos(2*t)-0.6*cos(3*t)-0.2*cos(4*t)+rect.bottom/2));
   MoveToEx(hDC,x,y,NULL);
   for(double p=0;p<M_PI*10;p+=M_PI/36) {
      for(t=0;t<2*M_PI;t+=M_PI/500) {
         x=static_cast<int>((90.5*sin(3*t)+rect.right/2));
         y=static_cast<int>((90.5*cos(t)-1.3*cos(2*t)-0.6*cos(3*t)-0.2*cos(4*t)+rect.bottom/2));
         LineTo(hDC,x,y);
      }
   }
   SelectObject(hDC,gdi);
   //SetBkColor(hDC,GetSysColor(COLOR_WINDOW));/* Можно назначить цвет фона. */
   //SetBkColor(hDC,GetSysColor(COLOR_BTNFACE));/* Можно назначить цвет фона. */
   SetBkMode(hDC,TRANSPARENT);
   DrawText(hDC,/* Формула по которой строится фигура. */
   " x=5 sin3t,\r\ny=4 cos(t)-1.3 cos(2t)-0.6 cos(3t)-0.2 cos(4t)",
   -1,&rect,DT_EXTERNALLEADING|DT_NOPREFIX|DT_WORDBREAK);
   ReleaseDC(g_hwndStatic[0],hDC);
   DeleteObject(gdi);
   ValidateRect(hWnd,NULL);
}

void DrawFigure_2(HWND hWnd) {
   RECT rect;
   HDC hDC=GetDC(g_hwndStatic[1]);
   GetClientRect(g_hwndStatic[1],&rect);
   HPEN hPen=CreatePen(PS_SOLID,2,RGB(255,0,0));
   HGDIOBJ gdi=SelectObject(hDC,hPen);
   double t=0;
   int x=static_cast<int>((-80.5*sin(t)+rect.right/2));
   int y=static_cast<int>((80.5*cos(3*t)+rect.bottom/2));
   MoveToEx(hDC,x,y,NULL);
   for(double p=0;p<M_PI*10;p+=M_PI/36) {
      for(t=0;t<2*M_PI;t+=M_PI/500) {
         x=static_cast<int>((80.5*sin(t)+rect.right/2));
         y=static_cast<int>((80.5*cos(3*t)+rect.bottom/2));
         LineTo(hDC,x,y);
      }
   }
   SelectObject(hDC,gdi);
   //SetBkColor(hDC,GetSysColor(COLOR_WINDOW));
   //SetBkColor(hDC,GetSysColor(COLOR_BTNFACE));
   SetBkMode(hDC,TRANSPARENT);
   DrawText(hDC," x=sin(t), y=cos(3t)",/* Формула по которой строится фигура. */
   -1,&rect,DT_EXTERNALLEADING|DT_NOPREFIX|DT_WORDBREAK);
   ReleaseDC(g_hwndStatic[1],hDC);
   DeleteObject(gdi);
   ValidateRect(hWnd,NULL);
}

void DrawFigure_3(HWND hWnd) {
   RECT rect;
   HDC hDC=GetDC(g_hwndStatic[2]);
   GetClientRect(g_hwndStatic[2],&rect);
   HPEN hPen=CreatePen(PS_SOLID,2,RGB(153,0,0));
   HGDIOBJ gdi=SelectObject(hDC,hPen);
   double t=0;
   int x=static_cast<int>((80.5*2*cos(t)+rect.right/2));
   int y=static_cast<int>((80.5*cos(t+4)+rect.bottom/2));
   MoveToEx(hDC,x,y,NULL);
   for(double p=0;p<M_PI*10;p+=M_PI/36) {
      for(t=0;t<2*M_PI;t+=M_PI/500) {
         x=static_cast<int>((80.5*2*cos(t)+rect.right/2));
         y=static_cast<int>((80.5*cos(t+4)+rect.bottom/2));
         LineTo(hDC,x,y);
      }
   }
   SelectObject(hDC,gdi);
   //SetBkColor(hDC,GetSysColor(COLOR_WINDOW));
   //SetBkColor(hDC,GetSysColor(COLOR_BTNFACE));
   SetBkMode(hDC,TRANSPARENT);
   DrawText(hDC," x=2 cos(t), y=cos(t+4)",/* Формула по которой строится фигура. */
   -1,&rect,DT_EXTERNALLEADING|DT_NOPREFIX|DT_WORDBREAK);
   ReleaseDC(g_hwndStatic[2],hDC);
   DeleteObject(gdi);
   ValidateRect(hWnd,NULL);
}

void DrawLogo(HWND hWnd) {
   RECT rect;
   HDC hDC=GetDC(g_hwndStatic[3]);
   GetClientRect(g_hwndStatic[3],&rect);
   HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,"Logo.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);
   /*if(!hBitmap) // Можно разместить рисунок в ресурсах программы.
      hBitmap=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP1));*/
   if(hBitmap) {
      HDC hdcMem=CreateCompatibleDC(hDC);
      SelectObject(hdcMem,hBitmap);
      BITMAP bmp;
      GetObject(hBitmap,sizeof(BITMAP),&bmp);
      StretchBlt(hDC,0,0,rect.right-rect.left,rect.bottom-rect.top-2,hdcMem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
      DeleteObject(hBitmap);
      ReleaseDC(hWnd,hdcMem);
   } /* End "if hBitmap" */
   ReleaseDC(g_hwndStatic[3],hDC);
   ValidateRect(hWnd,NULL);
}

void OnPaint(HWND hWnd) {
   PAINTSTRUCT ps;
   BeginPaint(hWnd,&ps);
   DrawFigure_1(hWnd);
   DrawFigure_2(hWnd);
   DrawFigure_3(hWnd);
   DrawLogo(hWnd);
   //ValidateRect(hWnd,NULL);
   EndPaint(hWnd,&ps);
}

LRESULT CALLBACK StaticProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
   /* Эта подпрограмма для четвертой рамки.
   При нажатии отправимся на сайт Old-Dos.ru (только раз, нечего дидосить :-) ) */
   WNDPROC Wndproc=(WNDPROC)(LONG)GetWindowLong(hWnd,GWL_USERDATA);
   if(Wndproc) {
   switch(uMsg) {
      /*case WM_PAINT: {
         //
         // Вообще - можно рисовать здесь, вместо функции DrawLogo().
         //
         PAINTSTRUCT ps;
         HDC hDC=BeginPaint(hWnd,&ps);
         EndPaint(hWnd,&ps);
      }
      break;*/
      case WM_LBUTTONDOWN: {
         static BOOL bOpen;
         if(!bOpen) {
            ShellExecute(0,"open",/* Open URL. */
            "http://old-dos.ru",NULL,NULL,SW_SHOWNORMAL);
            bOpen=TRUE;
         }
      }
      break;
      case WM_NCDESTROY:
      SetWindowLong(hWnd,GWL_WNDPROC,(LONG)Wndproc);
      SetWindowLong(hWnd,GWL_USERDATA,0);
      break;
      } /* End "uMsg" */
#if _MSC_VER
      return CallWindowProc(Wndproc,hWnd,uMsg,wParam,lParam);
#else
/* Borland C++ */
      return CallWindowProc((int(__stdcall*)())Wndproc,hWnd,uMsg,wParam,lParam);
#endif
   } /* End "if(Wndproc)" */
   return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

void OnWindowPosChanging(WINDOWPOS FAR* lpwp) {
   /* Deferring 4 child controls. */
   HDWP hDWP=BeginDeferWindowPos(4);
   if(!hDWP) return;
   HWND hWnd=lpwp->hwnd;
   RECT rect;
   GetClientRect(hWnd,&rect);
   int cx=rect.right;
   int cy=rect.bottom;
   hDWP=DeferWindowPos(hDWP,g_hwndStatic[0]
      /*GetDlgItem(hWnd,IDC_PANE1)*/,
   NULL,
   2,
   2,
   cx/2,
   cy/2,
   SWP_NOZORDER | SWP_NOREDRAW);

   hDWP=DeferWindowPos(hDWP,g_hwndStatic[1]
      /*GetDlgItem(hWnd,IDC_PANE2)*/,
   NULL,
   2,
   cy/2,
   cx/2,
   cy/2,
   SWP_NOZORDER | SWP_NOREDRAW);

   hDWP=DeferWindowPos(hDWP,g_hwndStatic[2]
      /*GetDlgItem(hWnd,IDC_PANE3)*/,
   NULL,
   rect.right/2,
   2,
   rect.right/2,
   rect.bottom/2,
   SWP_NOZORDER | SWP_NOREDRAW);

   hDWP=DeferWindowPos(hDWP,g_hwndStatic[3]
      /*GetDlgItem(hWnd,IDC_PANE4)*/,
   NULL,
   rect.right/2,
   rect.bottom/2,
   rect.right/2,
   rect.bottom/2,
   SWP_NOZORDER | SWP_NOREDRAW);

   EndDeferWindowPos(hDWP);
   InvalidateRect(hWnd,NULL,TRUE);
}

void mb(char* svStr) {
   UINT uType=MB_OK | MB_ICONINFORMATION |
   MB_SETFOREGROUND | MB_SYSTEMMODAL;
   int n=0;
   if(strstr(svStr,"Failed") || strstr(svStr,"Error"))
   ++n;
   if(n) {
      uType &=~MB_ICONINFORMATION;
      uType |=MB_ICONWARNING;
   }
   MessageBox(GetActiveWindow(),svStr,GAppname,uType);
   if(n) ExitProcess(n);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
   LRESULT retval=0;
   switch(uMsg) {
   case WM_CREATE: {
      LPCREATESTRUCT lpCreateStruct=reinterpret_cast<LPCREATESTRUCT>(lParam);
      for(int i=0;i<4;++i) {
         g_hwndStatic[i]=CreateWindowEx(0,"static",NULL,
         SS_NOTIFY|WS_CHILD|WS_VISIBLE|WS_BORDER,
         0,0,0,0,hWnd,(HMENU)(UINT)i,
         lpCreateStruct->hInstance,LPVOID(0));
         if(!g_hwndStatic[i]) mb("Failed create static.");

         SetWindowLong(g_hwndStatic[3],GWL_USERDATA,
         GetWindowLong(g_hwndStatic[3],GWL_WNDPROC));
         SetWindowLong(g_hwndStatic[3],GWL_WNDPROC,(LONG)StaticProc);
      }
   }
   return TRUE;
   
   case WM_WINDOWPOSCHANGING:
   case WM_WINDOWPOSCHANGED: {
      LPWINDOWPOS lpwp=reinterpret_cast<LPWINDOWPOS>(lParam);
      if(!(lpwp->flags & SWP_NOSIZE) || IsWindowVisible(hWnd))
         OnWindowPosChanging(lpwp);
   }
   return TRUE;

   case WM_PAINT:
      OnPaint(hWnd);
      break;
   case WM_CLOSE:
      DestroyWindow(hWnd);
      break;
   case WM_DESTROY:
      PostQuitMessage(0);
      break;
   default:
      retval=DefWindowProc(hWnd,uMsg,wParam,lParam);
   } /* End "uMsg" */
   return retval;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) {
   WNDCLASSEX wcex={sizeof(WNDCLASSEX),
   CS_VREDRAW | CS_HREDRAW,WndProc,
   0,0,hInstance,
   /*LoadIcon(hInstance,MAKEINTRESOURCE(IDR_MAINFRAME)),*/
   LoadIcon(NULL,IDI_APPLICATION),
   LoadCursor(NULL,IDC_ARROW),
   (HBRUSH)(COLOR_BTNFACE+1),
   /*(HBRUSH)(COLOR_WINDOW+1),*/
   NULL,"wnd_lissajous",NULL,};
   ATOM Atom=RegisterClassEx(&wcex);
   if(!Atom) {
      Atom=RegisterClass((LPWNDCLASS)&wcex.style);
      if(!Atom) mb("Cannot register class");
   }
   /* Style window default. */
   DWORD dwExStyle=WS_EX_WINDOWEDGE;
   //DWORD dwExStyle=WS_EX_CLIENTEDGE;
   DWORD dwStyle=WS_OVERLAPPEDWINDOW;
   /* Style window no change blocking maximize.
   DWORD dwExStyle=WS_EX_WINDOWEDGE;
   DWORD dwStyle=WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX;*/
   /* Window position default.
   HWND hWnd=CreateWindowEx(dwExStyle,
   MAKEINTATOM(Atom),GAppname,dwStyle,
   CW_USEDEFAULT,0,CW_USEDEFAULT,0,
   HWND_DESKTOP,NULL,hInstance,NULL);*/
   /* Window position center desktop. */
   int nWidth=800;
   int nHeight=600;
   HWND hWnd=CreateWindowEx(dwExStyle,
   MAKEINTATOM(Atom),GAppname,dwStyle,
   ((GetSystemMetrics(SM_CXSCREEN)-nWidth)/2),
   ((GetSystemMetrics(SM_CYSCREEN)-nHeight)/2),
   nWidth,nHeight,HWND_DESKTOP,NULL,hInstance,NULL);
   if(!hWnd) mb("Cannot create window");
   ShowWindow(hWnd,nCmdShow);
   UpdateWindow(hWnd);
   MSG msg;
   while(GetMessage(&msg,NULL,0,0)) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   return (int)msg.wParam;
}
Вложения
Lissajous.zip
(34.38 Кб) Скачиваний: 26
prew_Lissajous.png
prew_Lissajous.png (47.25 Кб) Просмотров: 573
Последний раз редактировалось rvg 05 мар 2024, 10:08, всего редактировалось 1 раз.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 435
Зарегистрирован: 18 июл 2023, 14:12

Re: Программирование (общая "болталка")

Сообщение aarsen2020@yandex.ru » 27 мар 2024, 12:54

https://hi-aga.ru/ - новый сайт по ЯП Forth.

Начать изучать программирование на языке Forth настолько просто, что материал данного сайта можно использовать для детей, не говоря уже обучение, этому прекрасному виду человеческой деятельности, для школьников, абитуриентов и студентов.
aarsen2020@yandex.ru
Новичок
 
Сообщения: 4
Зарегистрирован: 27 мар 2024, 12:47

Re: Программирование (общая "болталка")

Сообщение oldpcfan82 » 29 мар 2024, 11:41

Здравствуйте, извиняюсь если не по теме. Я хочу программировать на PureBasic под платформу AMIGA см. тут в самом низу, есть бесплатная версия для AMIGA. Когда скачиваешь программу, там расширения файла lzx. Скачал я ещё эмулятор амиги WinUAE, но эмулятор WinUAE что-то не запускается, требует какие-то образы, которых у меня нет. Добавляю в эмулятор какие-то образы, а они не запускаются. Эмулятор WinUAE тоже не хочет PureBasic.lzx грузить. Когда запустишь PureBasic, должно так выглядеть https://i.imgur.com/MqSF01r.png. Есть один соотечественник, он тоже программирует на PureBasic см. https://www.youtube.com/watch?v=oouxu5XdOno. Смотрю тут http://guide.abime.net/gguides/winuaea.htm, делаю как там нарисовано, а не запускется ничего.
Последний раз редактировалось oldpcfan82 29 мар 2024, 11:43, всего редактировалось 2 раз(а).
Аватара пользователя
oldpcfan82
Мастер Даунгрейда
 
Сообщения: 140
Зарегистрирован: 01 окт 2023, 22:57

Re: Программирование (общая "болталка")

Сообщение uav » 29 мар 2024, 15:20

Сам эмулятор-то я запустил, вот портативная версия с нужными ROM'ами и образом HDD:
http://downgradefiles.pdp-11.ru/downloa ... ab49ea6acc
(Осторожно, при распаковке займёт больше 600 МБ!)
Запускать через winuae.bat
А вот PureBasic не пошёл почему-то, т.е. я подключил LZX (это архив такой), установка запустилась и прошла нормально, а вот при попытке запуска уже установленного или вылетает, или ошибку какую-то пишет.
Может, ему другая версия ОС нужна или другая эмулируемая модель компьютера.
Пока не разбирался, времени сейчас нет, нужно 46-й номер журнала доделывать...
Последний раз редактировалось uav 29 мар 2024, 15:21, всего редактировалось 1 раз.
Аватара пользователя
uav
Мастер Даунгрейда
 
Сообщения: 1933
Зарегистрирован: 22 дек 2008, 14:21

Re: Программирование (общая "болталка")

Сообщение oldpcfan82 » 30 мар 2024, 07:06

Спасибо!
Аватара пользователя
oldpcfan82
Мастер Даунгрейда
 
Сообщения: 140
Зарегистрирован: 01 окт 2023, 22:57

Пред.

Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1