как чередовать цвета в круге, чтобы круг выглядел как вращающийся? - PullRequest
0 голосов
/ 06 февраля 2020

Ожидаемый результат должен быть таким, чтобы цвета также меняли свое положение:

img

Ожидаемый результат -:

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

, хотя мой код написан в кодовых блоках в c / c ++, я буду рад получить ответы в любые другие языки программирования.

мой текущий код

#include<graphics.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<string.h>
#include<iostream>

using namespace std;
void vvcircle(float xk,float yk,float radius);


int i=0;

int main()
{
float xk,yk,radius;

    int gdriver=DETECT,gmode,errorcode;
    initgraph(&gdriver,&gmode,"C:\\TURBOC3\\BGI");
   // cout<<"enter the value of x, y and radius of circle"<<endl;
    //cin>>xk>>yk>>radius;


    vvcircle(200,200,100);

    getch();
    closegraph();
    return 0;
}

void vvcircle(float xk,float yk,float radius)
{
    int color[60]={0,1,2,3,4,5,6,7,8,9};
    while(radius>0)
    {

    float xo,yo;
    float P;
    xo=0.0;
    yo=radius;
P=1-radius;


///   vvcircle(200,200,100);

for(;xo<=yo;)
{



     putpixel(xo+xk,yo+yk,1);

     putpixel(yo+xk,xo+yk,1);


     putpixel(-yo+xk,xo+yk,2);


     putpixel(xo+xk,-yo+yk,2);


     putpixel(-yo+xk,-xo+yk,4);

          putpixel(-xo+xk,-yo+yk,4);

     putpixel(yo+xk,-xo+yk,4);

     putpixel(-xo+xk,+yo+yk,4);



    if(P<0)
    {

        xo=xo+1;
        yo=yo;
        P=P+2*xo+1;

    }
    else
    {

        xo=xo+1;
        yo=yo-1;
        P=P+(2*xo)-(2*yo)+1;
       //  putpixel(xo,yo,WHITE);

    }


}
radius=radius-1;

    }
}

Текущий вывод -:

я получаю много концентрических c кругов с цветами. но я хочу переместить цвета так, чтобы казалось, что круг движется, и он не достигнут.

1 Ответ

0 голосов
/ 07 февраля 2020

Как примерно так:

#include <math.h>
void my_circle(int xc,int yc,int r,float a) // center(x,y), radius, animation angle [rad]
    {
    const int n=4;          // segments count
    int x,sx,xx,x0,x1,rr=r*r,
        y,sy,yy,y0,y1,i,
        dx[n+1],dy[n+1],    // segments edges direction vectors
        c[n]={5,1,2,3};     // segments colors
    float da=2.0*M_PI/float(n);
    // BBOX
    x0=xc-r; x1=xc+r;
    y0=yc-r; y1=yc+r;
    // compute segments
    for (i=0;i<=n;i++,a+=da)
        {
        dx[i]=100.0*cos(a);
        dy[i]=100.0*sin(a);
        }
    // all pixels in BBOX
    for (sx=x0,x=sx-xc;sx<=x1;sx++,x++){ xx=x*x;
     for (sy=y0,y=sy-yc;sy<=y1;sy++,y++){ yy=y*y;
        // outside circle?
        if (xx+yy>rr) continue;
        // compute segment
        for (i=0;i<n;i++)
         if ((x*dy[i  ])-(y*dx[i  ])>=0)
          if ((x*dy[i+1])-(y*dx[i+1])<=0)
           break;
        // render
        putpixel(sx,sy,c[i]);
        }}
    }

Он просто пропускает oop через все пиксели вписанного квадрата в ваш круг, определяет, находится ли пиксель внутри, а затем определяет, в каком сегменте он находится, и окрашивает его с цветом сегментов.

Сегменты описываются векторами направления от центра круга к краям сегментов. Таким образом, если пиксель находится внутри, это означает, что его CW к одному краю и CCW к другому, поэтому при 2D-проверке координаты z перекрестного произведения между вектором к пикселю и векторами к краям покажет, находится ли пиксель или нет ...

Как вы можете видеть, я не использовал математику с плавающей запятой при ее рендеринге, она нужна только для вычисления векторов краев сегментов перед рендерингом ...

Я использовал стандартную палитру VGA с 256 цветами (не уверен то, что использует BGI, я ожидаю, 16 кол.), поэтому цвета могут быть разными на вашей платформе. Предварительный просмотр:

preview

Шум вызван моим инструментом захвата GIF сглаживание самого рендеринга является чистым ...

Не забудьте повторно вызывать my_circle с изменяющимся углом ...

PS. Я закодировал это в BDS2006 без BGI, поэтому в другом компиляторе может быть небольшая синтаксическая проблема, связанная с особенностями используемого языка ...

Я подделал putpixel с этим:

void putpixel(int x,int y,BYTE c)
    {
    static const DWORD pal[256]=
        {
        0x00000000,0x000000A8,0x0000A800,0x0000A8A8,0x00A80000,0x00A800A8,0x00A85400,0x00A8A8A8,
        0x00545454,0x005454FC,0x0054FC54,0x0054FCFC,0x00FC5454,0x00FC54FC,0x00FCFC54,0x00FCFCFC,
        0x00000000,0x00101010,0x00202020,0x00343434,0x00444444,0x00545454,0x00646464,0x00747474,
        0x00888888,0x00989898,0x00A8A8A8,0x00B8B8B8,0x00C8C8C8,0x00DCDCDC,0x00ECECEC,0x00FCFCFC,
        0x000000FC,0x004000FC,0x008000FC,0x00BC00FC,0x00FC00FC,0x00FC00BC,0x00FC0080,0x00FC0040,
        0x00FC0000,0x00FC4000,0x00FC8000,0x00FCBC00,0x00FCFC00,0x00BCFC00,0x0080FC00,0x0040FC00,
        0x0000FC00,0x0000FC40,0x0000FC80,0x0000FCBC,0x0000FCFC,0x0000BCFC,0x000080FC,0x000040FC,
        0x008080FC,0x009C80FC,0x00BC80FC,0x00DC80FC,0x00FC80FC,0x00FC80DC,0x00FC80BC,0x00FC809C,
        0x00FC8080,0x00FC9C80,0x00FCBC80,0x00FCDC80,0x00FCFC80,0x00DCFC80,0x00BCFC80,0x009CFC80,
        0x0080FC80,0x0080FC9C,0x0080FCBC,0x0080FCDC,0x0080FCFC,0x0080DCFC,0x0080BCFC,0x00809CFC,
        0x00B8B8FC,0x00C8B8FC,0x00DCB8FC,0x00ECB8FC,0x00FCB8FC,0x00FCB8EC,0x00FCB8DC,0x00FCB8C8,
        0x00FCB8B8,0x00FCC8B8,0x00FCDCB8,0x00FCECB8,0x00FCFCB8,0x00ECFCB8,0x00DCFCB8,0x00C8FCB8,
        0x00B8FCB8,0x00B8FCC8,0x00B8FCDC,0x00B8FCEC,0x00B8FCFC,0x00B8ECFC,0x00B8DCFC,0x00B8C8FC,
        0x00000070,0x001C0070,0x00380070,0x00540070,0x00700070,0x00700054,0x00700038,0x0070001C,
        0x00700000,0x00701C00,0x00703800,0x00705400,0x00707000,0x00547000,0x00387000,0x001C7000,
        0x00007000,0x0000701C,0x00007038,0x00007054,0x00007070,0x00005470,0x00003870,0x00001C70,
        0x00383870,0x00443870,0x00543870,0x00603870,0x00703870,0x00703860,0x00703854,0x00703844,
        0x00703838,0x00704438,0x00705438,0x00706038,0x00707038,0x00607038,0x00547038,0x00447038,
        0x00387038,0x00387044,0x00387054,0x00387060,0x00387070,0x00386070,0x00385470,0x00384470,
        0x00505070,0x00585070,0x00605070,0x00685070,0x00705070,0x00705068,0x00705060,0x00705058,
        0x00705050,0x00705850,0x00706050,0x00706850,0x00707050,0x00687050,0x00607050,0x00587050,
        0x00507050,0x00507058,0x00507060,0x00507068,0x00507070,0x00506870,0x00506070,0x00505870,
        0x00000040,0x00100040,0x00200040,0x00300040,0x00400040,0x00400030,0x00400020,0x00400010,
        0x00400000,0x00401000,0x00402000,0x00403000,0x00404000,0x00304000,0x00204000,0x00104000,
        0x00004000,0x00004010,0x00004020,0x00004030,0x00004040,0x00003040,0x00002040,0x00001040,
        0x00202040,0x00282040,0x00302040,0x00382040,0x00402040,0x00402038,0x00402030,0x00402028,
        0x00402020,0x00402820,0x00403020,0x00403820,0x00404020,0x00384020,0x00304020,0x00284020,
        0x00204020,0x00204028,0x00204030,0x00204038,0x00204040,0x00203840,0x00203040,0x00202840,
        0x002C2C40,0x00302C40,0x00342C40,0x003C2C40,0x00402C40,0x00402C3C,0x00402C34,0x00402C30,
        0x00402C2C,0x0040302C,0x0040342C,0x00403C2C,0x0040402C,0x003C402C,0x0034402C,0x0030402C,
        0x002C402C,0x002C4030,0x002C4034,0x002C403C,0x002C4040,0x002C3C40,0x002C3440,0x002C3040,
        0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
        };
    if ((x<0)||(x>=Main->xs)) return;
    if ((y<0)||(y>=Main->ys)) return;
    Main->pyx[y][x]=pal[c];
    }

Где Main->xs, Main->ys мое разрешение окна и Main->pyx - прямой пиксельный доступ к холсту для получения дополнительной информации, см .:

...