📜  C程序,使用计算机图形学执行给定2D图像的反射

📅  最后修改于: 2021-05-28 04:35:28             🧑  作者: Mango

在本文中,我们将讨论如何使用计算机图形学使用逻辑而不是平移的直接矩阵公式进行旋转和平移,从而在C语言中执行反射。

目前已将此技术应用于作为三角形的对象,只要将(X n ,Y n )坐标适配到该对象中,该代码就可以应用于任何对象。

该技术的基本逻辑是,在任何给定的反射中,反射对象的横向反转与源对象之间的距离都与给定侧面相同。即,如果源对象距左侧10像素,则反射的对象距右侧10像素,并且顶面和底面也一样。

以现实生活为基础的示例

  • 如果人站在镜子前面,则该人的右手与镜子的右边界之间的距离将与该人的反射的左手与左边界之间的距离相同。
  • 为了方便通过程序显示上述技术,让我们在第二个图形象限处绘制源对象,但是可以在任何象限中对代码进行少量更改即可完成此操作。

上述技术的步骤

  • 通过提供坐标在第二个图形象限中创建一个对象。
  • 对于沿X轴的反射:
    • Y轴坐标将保持不变。
    • 通过计算源对象的X坐标与其沿X轴的最近表面之间的距离,获得横向反转的X轴坐标距离。
    • 使用从上述步骤获得的横向反转的X坐标绘制另一个对象,同时保持Y坐标不变。
    • 上面的步骤将生成源对象的镜像或反射。
    • 在这种情况下,反射的物体将在第1个象限来形成。
  • 对于沿Y轴的反射:
    • X轴坐标将保持不变。
    • 通过计算源对象的Y坐标与其沿Y轴的最近表面之间的距离,获得横向反转的Y轴坐标的距离。
    • 使用从上述步骤获得的横向反转的Y坐标绘制另一个对象,同时保持X坐标不变。
    • 上面的步骤将生成源对象的镜像或反射。
    • 在这种情况下,反射对象将在第三象限处形成。
  • 2c。对于沿原点的反射:
    • X轴和Y轴坐标将改变。
    • 通过计算源对象的Y坐标与其沿Y轴的最近表面之间的距离来获得横向反转的Y轴坐标距离。
    • 通过计算源对象的X坐标与其沿X轴的最近表面之间的距离,获得X轴横向反转的距离。
    • 使用从上述步骤获得的横向反转的X和Y坐标绘制另一个对象。
    • 上面的步骤将生成源对象的镜像或反射。
    • 这次,反射是关于原点的,因为X和Y坐标都发生了变化,从而将对象向内推。
    • 在这种情况下,反射的物体将在4象限而形成。

方法:

  1. 通过传递4个值作为line()的参数,在图形中画一条线作为Y轴,函数为line(getmaxx()/ 2,0,getmaxx()/ 2,getmaxy())
  2. 通过传递4个值作为line()的函数在line(0,getmaxy()/ 2,getmaxx(),getmaxy()/ 2)中在图形中绘制一条线作为X轴
  3. 使用line()函数通过设置变量中的参数绘制对象。
  4. 使用该技术的步骤3进行反射并沿原点绘制对象,然后将其红色以使其与其他对象区分开。
  5. 使用该技术的步骤1进行反射并沿X轴绘制对象,然后将其着色为青色,以将其与其他对象区分开。
  6. 使用该技术的步骤2进行反射并沿Y轴绘制对象,然后将其绿色以将其与其他对象区分开。

下面是上述方法的实现:

C
// C program for the above approach
  
#include 
#include 
#include 
  
// Driver Code
void main()
{
    // Initialize the drivers
    int gm, gd = DETECT, ax, x1 = 100;
    int x2 = 100, x3 = 200, y1 = 100;
    int y2 = 200, y3 = 100;
  
    // Add in your BGI folder path
    // like below initgraph(&gd, &gm,
    // "C:\\TURBOC3\\BGI");
    initgraph(&gd, &gm, "");
    cleardevice();
  
    // Draw the graph
    line(getmaxx() / 2, 0, getmaxx() / 2,
         getmaxy());
    line(0, getmaxy() / 2, getmaxx(),
         getmaxy() / 2);
  
    // Object initially at 2nd quadrant
    printf("Before Reflection Object"
           " in 2nd Quadrant");
  
    // Set the color
    setcolor(14);
    line(x1, y1, x2, y2);
    line(x2, y2, x3, y3);
    line(x3, y3, x1, y1);
    getch();
  
    // After reflection
    printf("\nAfter Reflection");
  
    // Reflection along origin i.e.,
    // in 4th quadrant
    setcolor(4);
    line(getmaxx() - x1, getmaxy() - y1,
         getmaxx() - x2, getmaxy() - y2);
  
    line(getmaxx() - x2, getmaxy() - y2,
         getmaxx() - x3, getmaxy() - y3);
  
    line(getmaxx() - x3, getmaxy() - y3,
         getmaxx() - x1, getmaxy() - y1);
  
    // Reflection along x-axis i.e.,
    // in 1st quadrant
    setcolor(3);
    line(getmaxx() - x1, y1,
         getmaxx() - x2, y2);
    line(getmaxx() - x2, y2,
         getmaxx() - x3, y3);
    line(getmaxx() - x3, y3,
         getmaxx() - x1, y1);
  
    // Reflection along y-axis i.e.,
    // in 3rd quadrant
    setcolor(2);
    line(x1, getmaxy() - y1, x2,
         getmaxy() - y2);
    line(x2, getmaxy() - y2, x3,
         getmaxy() - y3);
    line(x3, getmaxy() - y3, x1,
         getmaxy() - y1);
    getch();
  
    // Close the graphics
    closegraph();
}


输出:

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。