Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как нарисовать график функции в СИ (compiler - bcc OR lcc)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Дана функция, например f(x) = (1+(sin(x))^1/3)^1/3
Нужно пострить ее график, по точкам, масштабируя на весь экран, с оставленными полями по 1 см сверху/снизу/справа/слева, с координатной осью (просто крест, без стрелок) по центру, в зависимости от введенных координат - допустим (-3;3) мастабировать на весь экран, как и допустим с координатами (-10;10). Как?

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 18:44 11-02-2003
Mickey_from_nsk

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Номана сказано. Теперь детали. Как надо рисовать? в какой ОС, какими средствами?
Можно много всякого наворотить. От простенького окошка с графиком, если задача - просто посмотреть, что это такое, до целого графикового процессора с интерпретацией формул.  
Короче, в чем задача то?

Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 08:52 12-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mickey_from_nsk
окон не надо, это лишнее. чистый дос, вывод на экран, во весь экран. код сишный

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 18:25 12-02-2003
Mickey_from_nsk

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так чего ж тебе надо? Теорию? или уже все готовое?

Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 10:43 13-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mickey_from_nsk
график кстати такой: f(x) = tg(x) -- тангенс
--
Я не представляю как сделать масшабирование и как в принципе вывести на экран график (по точкам - в цикле - изменяя x на, допустим, 0.01). Но как это выглядит программно. Можно идеи, можно код, буду только рад!

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 21:19 13-02-2003
rew



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
вот когда писал по этому поводу

Код:
 
#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
//#define bgipath "a:\\bgi"
#define bgipath "d:\\borlandc\\bgi"
class axes
{
   private:
int xcent,ycent,xend,yend;
float x,xt,y,yt,a,b,c;
void init();
   public:
int x0,y0;//nachalo otnositel`no (0,0) ekrana
int xmin,ymin;//nachlo okna otnositelno (x0,y0)
int xmax,ymax;//konec""""""""""""""""
int bc,gc,fc;//border color,grid color,fill color
int gstp;//zoomgrid step
int grdstp;  //grid step
float fstp;  //func step
float zoom; //zoom
int ax;//show grid on/off
 
//axes4(int x0,int y0,int xmin,int ymin,int xmax,int ymax,int bc,int gc,int fc,int ax);//constructor
//axes(int,int,int,int,int,int,int,int,int,int,int,int);
 
axes()
{
  x0=y0=20;
  xmin=-120;xmax=120;
  ymin=-100;ymax=100;
  bc=12;
  gc=10;
  fc=7;
  zoom=1;
  grdstp=1;
  fstp=zoom/10.0;
  gstp=1/fstp*grdstp;
  ax=1;
  a=1;
  b=16;
  c=8;
}                         //end of constructor   */
void draw_grid();
void draw_function();
void clear();
};                                //end of class
 
 
void graphit (char *path)
{
   int gd, gm , err ;
   gd = 9 ;
   gm = 2 ;
 
   initgraph (&gd, &gm, path);
 
 
   err = graphresult();
   /* an error occurred */
   if (err != grOk)
   {
      printf("Graphics error: %s\n", grapherrormsg(err));
      printf("Press any key to halt:");
      getch();
      exit(1);
   }
}
void axes::init()
{
     xcent=x0-xmin;
     ycent=y0+ymax;
     xend=xcent+xmax;
     yend=ycent-ymin;
     fstp=zoom/1.0;
     gstp=18/fstp*3.141592*grdstp;
 
}
void axes::clear()
{
   init();
   setfillstyle(1,0);
   bar(x0,y0,xend,yend);
}
void axes::draw_grid()
{
     init();
     if(xend>639)  //??????
xend=639;  //??????
     if(yend>479)  //??????
yend=479;  //??????
     setcolor(bc);
     rectangle(x0,y0,xend,yend);
     setcolor(fc);
     if(ycent>y0&&ycent<yend)
line(x0,ycent,xend,ycent);
else
   {
   setcolor(fc-2);
   if(ycent<=y0)
line(x0,y0,xend,y0);
else
    line(x0,yend,xend,yend);
}
     setcolor(fc);
     if(xcent>x0&&xcent<xend)
line(xcent,y0,xcent,yend);
else
   {
   setcolor(fc-2);
   if(xcent<=x0)
line(x0,y0,x0,yend);
else
    line(xend,y0,xend,yend);
}
     if(gstp<2)
gstp=0;
     if(gstp&&ax)
       {
       for(x=-xmin%gstp+x0;x<xend;x+=gstp)
 for(y=ymax%gstp+y0;y<yend;y+=gstp)
    if(x>x0&&y>y0)
putpixel(x,y,gc);
       }
}
 
void axes::draw_function()
{
    int sign;
    init();
    for(x=xmin,xt=xmin*fstp;x<=xmax;x++,xt+=fstp)
       {
y=sin((3.141592/180)*xt)*180/3.141592;//a*pow(xt,2)+b*xt+c;
yt=sin((3.141592/180)*(xt+fstp))*180/3.141592;//a*pow((xt+fstp),2)+b*(xt+fstp)+c;
sign=y<yt?1:-1;
while(y*sign<yt*sign)
{
 if(y/fstp>ymin&&y/fstp<ymax)
   {
   putpixel(x+xcent,ycent-y/fstp,4);
   //delay(1);
   }
  y+=sign*fstp;
}
       }
}
 
void main()
{
   char ch=' ';
   float zom[2]={10,10};
   int i,up[2]={100,100},down[2]={-100,-100},left[2]={-100,-100},right[2]={100,100},step[2]={1,1},pres=0,grdstp[2]={1,1};
   axes m[2];//(10,50,-100,-60,120,130,10,14,4,3,1);
   graphit (bgipath) ;
   m[1].x0=300;
   m[1].y0=50;
   m[0].x0=50;
   m[0].y0=50;
   for(i=0;i<2;i++)
       {
       m[i].xmin=left[i];
       m[i].xmax=right[i];
       m[i].ymin=down[i];
       m[i].ymax=up[i];
       m[i].zoom=zom[i];
       m[i].draw_grid();
       m[i].draw_function();
       }
 
   while(ch!='q')
    {
      ch=getch();
      switch(ch)
{
case 'e':up[pres]-=step[pres];down[pres]-=step[pres];break;
case 'x':up[pres]+=step[pres];down[pres]+=step[pres];break;
case 'd':left[pres]-=step[pres];right[pres]-=step[pres];break;
case 's':left[pres]+=step[pres];right[pres]+=step[pres];break;
case '6':zom[pres]+=.1;break;
case '5':if(zom[pres]>0.1)zom[pres]-=.1;break;
case '7':if(step[pres]) step[pres]--;break;
case '8':step[pres]++;break;
case 'h':up[pres]=100;down[pres]=-100;left[pres]=-100;right[pres]=100;break;
case '1':pres=0;break;
case '2':pres=1;break;
case 'o':if(grdstp[pres]>1)grdstp[pres]--;break;
case 'p':grdstp[pres]++;
}
      m[pres].grdstp=grdstp[pres];
      m[pres].xmin=left[pres];
      m[pres].xmax=right[pres];
      m[pres].ymin=down[pres];
      m[pres].ymax=up[pres];
      m[pres].zoom=zom[pres];
      m[pres].clear();
      m[pres].draw_grid();
      m[pres].draw_function();
   }
     getch();
}
 

на борланд си под досом даже работало, рисовало синус, можно было двигать и зумить, правда это "с++", но переделать под просто си не сложно по моему

Всего записей: 442 | Зарегистр. 09-09-2001 | Отправлено: 22:06 13-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rew
у меня не пашет, хотя путь к bgi указал правильно. компилит, но ошибки при линковании.
Как избавиться от классов?

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 22:16 13-02-2003 | Исправлено: zam, 22:18 13-02-2003
rew



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
у меня 3й борланд в нем нужно зайти в options->linker->libraries и отметить graphics library
как избавиться от класов? тебе вероятней всего нужны будут 2 функции, это draw_function() она рисует сам график и draw_grid() она рисует сетку и "окно" весь "основной код" находится в них. они тянут много переменных, но там вроде подписано что делает каждый из них и их можно сделать глобальными
 
Добавлено
вот вариант на си с тебя пиво

Код:
 
#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
//#define bgipath "a:\\bgi"
#define bgipath "d:\\borlandc\\bgi"
int xcent,ycent,xend,yend;
float x,xt,y,yt;
int x0=20,y0=20;//nachalo otnositel`no (0,0) ekrana
int xmin=-120,ymin=-100;//nachlo okna otnositelno (x0,y0)
int xmax=120,ymax=100;//konec""""""""""""""""
int bc=12,gc=10,fc=7;//border color,grid color,fill color
int grdstp=1;  //grid step
float zoom=1; //zoom
float fstp=zoom/10.0;  //func step
int gstp=1/fstp*grdstp;//zoomgrid step
int ax=1;//show grid on/off
 
 
 
void graphit (char *path)
{
   int gd, gm , err ;
   gd = 9 ;
   gm = 2 ;
 
   initgraph (&gd, &gm, path);
 
 
   err = graphresult();
   /* an error occurred */
   if (err != grOk)
   {
      printf("Graphics error: %s\n", grapherrormsg(err));
      printf("Press any key to halt:");
      getch();
      exit(1);
   }
}
void init()
{
     xcent=x0-xmin;
     ycent=y0+ymax;
     xend=xcent+xmax;
     yend=ycent-ymin;
     fstp=zoom/1.0;
     gstp=18/fstp*3.141592*grdstp;
 
}
void clear()
{
   init();
   setfillstyle(1,0);
   bar(x0,y0,xend,yend);
}
void draw_grid()
{
     init();
     if(xend>639)  //??????
xend=639;  //??????
     if(yend>479)  //??????
yend=479;  //??????
     setcolor(bc);
     rectangle(x0,y0,xend,yend);
     setcolor(fc);
     if(ycent>y0&&ycent<yend)
line(x0,ycent,xend,ycent);
else
   {
   setcolor(fc-2);
   if(ycent<=y0)
line(x0,y0,xend,y0);
else
    line(x0,yend,xend,yend);
}
     setcolor(fc);
     if(xcent>x0&&xcent<xend)
line(xcent,y0,xcent,yend);
else
   {
   setcolor(fc-2);
   if(xcent<=x0)
line(x0,y0,x0,yend);
else
    line(xend,y0,xend,yend);
}
     if(gstp<2)
gstp=0;
     if(gstp&&ax)
       {
       for(x=-xmin%gstp+x0;x<xend;x+=gstp)
 for(y=ymax%gstp+y0;y<yend;y+=gstp)
    if(x>x0&&y>y0)
putpixel(x,y,gc);
       }
}
 
void draw_function()
{
    int sign;
    init();
    for(x=xmin,xt=xmin*fstp;x<=xmax;x++,xt+=fstp)
       {
y=sin((3.141592/180)*xt)*180/3.141592;//a*pow(xt,2)+b*xt+c;
yt=sin((3.141592/180)*(xt+fstp))*180/3.141592;//a*pow((xt+fstp),2)+b*(xt+fstp)+c;
sign=y<yt?1:-1;
while(y*sign<yt*sign)
{
 if(y/fstp>ymin&&y/fstp<ymax)
   {
   putpixel(x+xcent,ycent-y/fstp,4);
   //delay(1);
   }
  y+=sign*fstp;
}
       }
}
 
void main()
{
   char ch=' ';
   int step=1;
//   axes m[2];//(10,50,-100,-60,120,130,10,14,4,3,1);
   graphit (bgipath) ;
   x0=300;
   y0=50;
 
       xmin=-100;//left[-100];
       xmax=100;//right[i];
       ymin=-100;//down[i];
       ymax=100;//up[i];
       zoom=10;//zom[i];
       draw_grid();
       draw_function();
 
 
   while((ch=getch())!='q')
    {
      switch(ch)
{
case 'e':ymax-=step;ymin-=step;break;
case 'x':ymax+=step;ymin+=step;break;
case 'd':xmin-=step;xmax-=step;break;
case 's':xmin+=step;xmax+=step;break;
case '6':zoom+=.1;break;
case '5':if(zoom>0.1)zoom-=.1;break;
case '7':if(step) step--;break;
case '8':step++;break;
case 'h':ymax=100;ymin=-100;xmin=-100;xmax=100;break;
case 'o':if(grdstp>1)grdstp--;break;
  case 'p':grdstp++;
}
 
      clear();
      draw_grid();
      draw_function();
   }
   getch();
}
 

Всего записей: 442 | Зарегистр. 09-09-2001 | Отправлено: 22:28 13-02-2003 | Исправлено: rew, 22:29 13-02-2003
Mickey_from_nsk

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
К данному тексту я бы еще добавил пару замечаний из собственного опыта.
1 Шаг сетки и начало ее отсчета может выбираться исходя из минимума длины координаты. То есть, вместо того, чтобы тупо брать, например, левый край сетки - -0.3334, затем с шагом 0.12321 рисовать засечки (или сетку), можно сделать первую засечку в точке -0.3, а шаг выбрать 0.1. Это делается достаточно просто.
xstep=10^((float)((int)log10(xmax-xmin)))/nsteps, где xmin и xmax - реальные края оси координат, nsteps - число отрисовок сетки. Далее, если ось координат входит в видимую область, рисуем от нее вправо и влево, иначе - по той же формуле находим самую левую засечку и рисуем относительно нее.
2. Шаг отрисовки функции лучше вычислять исходя из количества видимых пикселов на экране. Это чтобы лишнее не рисовать.

Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 08:21 14-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rew
Большое СПАСИБО. В коде я пока не разбирался, пишу сейчас совсем другое (определение CRC, контрольных сумм).
 
Как сделать не точки на осях, а черточки - засечки с подписями цифр под ними?
Как нарисовать функцию ln(1+x)?

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 01:32 17-02-2003 | Исправлено: zam, 02:14 17-02-2003
rew



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
полоски...

Код:
 
for(x=-xmin%gstp+x0;x<xend;x+=gstp){
line(x,ycent-5,x,ycent+5);
}
 

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

Код:
 
void draw_function()
{
    int sign;
    init();
    for(x=xmin,xt=xmin*fstp;x<=xmax;x++,xt+=fstp)
       {
if(xt<=0){
        continue;
}
y=log(xt+1);//sin((3.141592/180)*xt)*180/3.141592;//a*pow(xt,2)+b*xt+c;
yt=log(xt+fstp+1);//sin((3.141592/180)*(xt+fstp))*180/3.141592;//a*pow((xt+fstp),2)+b*(xt+fstp)+c;
sign=y<yt?1:-1;
while(y*sign<yt*sign)
 {
  if(y/fstp>ymin&&y/fstp<ymax)
    {
    putpixel(x+xcent,ycent-y/fstp,4);
    //delay(1);
    }
   y+=sign*fstp;
 }
       }
}
 
void main()
{
char ch=' ';
int step=1;
fstp=zoom/10.0;
gstp=1/fstp*grdstp;
graphit (bgipath) ;
x0=20;
y0=50;
xmin=-300;//left[-100];
xmax=300;//right[i];
ymin=-200;//down[i];
ymax=200;//up[i];
zoom=10;//zom[i];
draw_grid();
draw_function();
while((ch=getch())!='q')
{
switch(ch)
{
case 'e':ymax-=step;ymin-=step;break;
case 'x':ymax+=step;ymin+=step;break;
case 'd':xmin-=step;xmax-=step;break;
case 's':xmin+=step;xmax+=step;break;
case '6':zoom+=.1;break;
case '5':if(zoom>0.1)zoom-=.1;break;
case '7':if(step) step--;break;
case '8':step++;break;
case 'h':ymax=100;ymin=-100;xmin=-100;xmax=100;break;
case 'o':if(grdstp>1)grdstp--;break;
case 'p':grdstp++;
}
clear();
draw_grid();
draw_function();
}
}
 


----------
плох тот error который не мечтает стать general`ом

Всего записей: 442 | Зарегистр. 09-09-2001 | Отправлено: 05:08 17-02-2003 | Исправлено: rew, 05:11 17-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Получается график функции sqrt(x). Т.е от нуля отсчет и как положено, хотя логарифмическая ф-ия равна нулю в точке 1. Что не так?

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 21:27 17-02-2003
rew



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
угу нужно писать  

Код:
if(xt+1<=0){  
        continue;  
}  
 

а то оно начинает рисовать с момента когда х=0, а не с х=-1

----------
плох тот error который не мечтает стать general`ом

Всего записей: 442 | Зарегистр. 09-09-2001 | Отправлено: 23:27 17-02-2003 | Исправлено: rew, 23:31 17-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rew
Однако график получается правильным в случае:  

Код:
 
  void draw_function(void) {
    int sign;
 
    init();
 
    for(x=xmin,xt=xmin*fstp; x<=xmax; x++,xt+=fstp) {
      if(xt-1<=0)
        continue;
 
      y = log(xt-1);
      yt = log(xt+fstp-1);
 

 
 
Добавлено
rew
В каком коде рисуются координатные оси?

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 02:41 18-02-2003
rew



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
zam
может быть я на точность для всех функций не претендую - для синуса и параболы, то что мне нужно было отобразить, вроде работало нормально  
 
 
Добавлено

Код:
 
if(ycent>y0&&ycent<yend)  
   line(x0,ycent,xend,ycent); //если горизонтальная ось "находится" в окне
else  
{  
   setcolor(fc-2);  
   if(ycent<=y0)  
      line(x0,y0,xend,y0); //если "выше" окна верхняя грань "окна" помечается другим цветом
   else  
      line(x0,yend,xend,yend);// если "ниже" окна помечается нижняя грань
}  
setcolor(fc);  
if(xcent>x0&&xcent<xend)  
   line(xcent,y0,xcent,yend); //аналогично вертикальная ось
else  
{  
   setcolor(fc-2);  
   if(xcent<=x0)  
      line(x0,y0,x0,yend);  
   else  
      line(xend,y0,xend,yend);  
}  
 


----------
плох тот error который не мечтает стать general`ом

Всего записей: 442 | Зарегистр. 09-09-2001 | Отправлено: 02:48 18-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rew

Код:
 
void draw_function(void) {
 
  int sign;  
 
  init();  
 
  for(x=xmin+jmp,xt=xmin*fstp; x<=xmax-jmp; x++,xt+=fstp) {
    y = sin((3.141592/180)*xt)*180/3.141592;    
    yt = sin((3.141592/180)*(xt+fstp))*180/3.141592;
    sign = y < yt ? 1 : -1;
 
    while(y*sign<yt*sign) {  
      if(y/fstp>ymin && y/fstp<ymax) {  
        putpixel(x+xcent,ycent-y/fstp,4);  
  //delay(1);  
      }  
       
      y += sign*fstp;  
    }  
  }
}
 
 
Возникает вопрос: зачем y и yt как они связаны и можно ли обойтись одной?

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 00:11 19-02-2003
rew



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
zam
фактически там чертится ветикальная линия с (x+xcent,y,x+xcent,yt) но почему я не написал просто line(x+xcent,y,x+xcent,yt) а сделал "вручную", чтоб если линия вылазит за пределы "окна" ее не рисовало

----------
плох тот error который не мечтает стать general`ом

Всего записей: 442 | Зарегистр. 09-09-2001 | Отправлено: 00:35 19-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rew
У тебя при масштабировании ('5') получается отличный от рядового зума эффект. График движется относительно вертикальной и горизонтальной осей. Это все таки не зум. Знаешь, как изменить алгоритм?
 
Линии лучше рисовать от центра, иначе отрезки с учетом осей будут различны:в
как я сделал:

Код:
 
for(x=xcent;x<xend-jmp;x+=gstp+10) // vertical lines
  line(x,ycent-3,x,ycent+3);
for(x=xcent; x>x0+jmp; x-=gstp+10)
  line(x,ycent-3,x,ycent+3);
for(y=ycent;y<yend-jmp;y+=gstp+10) // horizontal lines
  line(xcent-3,y,xcent+3,y);
for(y=ycent;y>y0+jmp;y-=gstp+10)
  line(xcent-3,y,xcent+3,y);
 

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 00:49 19-02-2003 | Исправлено: zam, 01:02 19-02-2003
rew



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
zam
непонял

----------
плох тот error который не мечтает стать general`ом

Всего записей: 442 | Зарегистр. 09-09-2001 | Отправлено: 01:03 19-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zam
Не знаю только (ты знаешь?) как с учетом этого к каждой черточке привязать номер? Причем делать так, чтобы выводить в строгом соответствии -- сколько черточек, столько и чисел.
 
Добавлено
rew
в смысле отчет вести от точки пересечения координат (xcent, ycent)

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 01:05 19-02-2003
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как нарисовать график функции в СИ (compiler - bcc OR lcc)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru