📜  在C ++图形中绘制在圆上旋转的椭圆

📅  最后修改于: 2021-05-31 20:59:51             🧑  作者: Mango

graphics.h库用于在程序中包含并促进图形操作。 graphics.h函数可用于绘制不同的形状,以不同的字体显示文本,更改颜色等等。使用graphics.h的功能,您可以制作图形程序,动画,项目和游戏。您可以绘制圆,线,矩形,条形图和许多其他几何图形。您可以使用可用功能更改其颜色并填充它们。

方法:
想法是将角度(椭圆要滑动通过的角度)减小一个整数值,并使用它们的周长之比来计算圆的半径所扫过的相应角度。

如何在屏幕上显示幻灯片:

  1. 在白色的计算点上绘制椭圆。
  2. 引入一些函数延迟(以毫秒为单位)。
  3. 通过使用黑色在同一点绘制椭圆来擦除上一个椭圆。
  4. 从步骤1开始重复。

下面是上述问题的C++表示形式

// C++ program to draw an Ellipse
// rotating over a Circle using graphics
  
#include 
#include 
#include 
#include 
#include 
#include 
  
using namespace std;
  
// Ellipse drawing function
void drawEllipse(int xc, int yc, int a, int b,
                 float alpha, int color)
{
    float t = 3.14 / 180;
    alpha = 360 - alpha;
    setcolor(color);
    int theta;
  
    // Filling each pixel corresponding
    // to every angle from 0 to 360
    for (int i = 0; i < 360; i += 1) {
        theta = i;
        int x = a * cos(t * theta) * cos(t * alpha)
                + b * sin(t * theta) * sin(t * alpha);
  
        int y = b * sin(t * theta) * cos(t * alpha)
                - a * cos(t * theta) * sin(t * alpha);
  
        putpixel(xc + x, yc - y, color);
    }
}
  
// Function to calculate the position
// of ellipse after each rotation
void slidePattern(int xc, int yc, int r, int a, int b,
                  int alpha, float p, int color)
{
    setcolor(color);
    float t = 3.14 / 180;
    float t1, t2, d;
    float angle = (p * alpha);
  
    // Calculation for center of Ellipse
    t1 = cos(t * fmod(angle, 360));
    t2 = sin(t * fmod(angle, 360));
    t1 *= t1;
    t2 *= t2;
    t1 = t1 / (a * a);
    t2 = t2 / (b * b);
    d = sqrt(t1 + t2);
    d = 1 / d;
  
    int draw_x = xc + (r + d) * cos(t * alpha);
    int draw_y = yc - (r + d) * sin(t * alpha);
    int draw_ang = angle + alpha;
  
    drawEllipse(draw_x, draw_y, a,
                b, draw_ang, color);
}
  
// Function to increment the angle
// of rotation
void ellipseovercircle(int xc, int yc,
                       int r, int a, int b)
{
    float theta = 0;
    double h, p1;
  
    // Calculating the ratio of
    // perimeters of Ellipse and Circle
    h = (a * a) + (b * b);
    h /= 2;
    p1 = sqrt(h);
    p1 /= r;
    p1 = 1 / (p1);
  
    // by decreasing theta we can
    // move Ellipse clockwise
    for (;; theta -= 1) {
  
        // Draw Ellipse at new location
        // using White color
        slidePattern(xc, yc, r, a, b,
                     theta, p1, WHITE);
  
        circle(xc, yc, r); // Drawing Circle
        delay(25); // Introducing delay
  
        // Erase the existing Ellipse
        slidePattern(xc, yc, r, a, b,
                     theta, p1, BLACK);
    }
}
  
// Driver code
int main()
{
    // Initialize graphics function
    int gd = DETECT, gm;
    initgraph(&gd, &gm, "");
  
    // maximum X-coordinate for the window
    int maxx = getmaxx();
  
    // maximum Y-coordinate for the window
    int maxy = getmaxy();
  
    // Start drawing from the mid of the screen
    ellipseovercircle(maxx / 2, maxy / 2,
                      100, 40, 28);
  
  
    closegraph();
    return 0;
}

输出:

输出视频:

想要从精选的最佳视频中学习并解决问题,请查看有关从基础到高级C++的C++基础课程以及有关语言和STL的C++ STL课程。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”