Transformación 2D en Gráficos por Computador | Set 1 (Escalado de Objetos)

Podemos usar una array de 2 × 2 para cambiar o transformar un vector 2D

Este tipo de operación, que toma un 2-vector y produce otro 2-vector mediante una simple multiplicación de arrays, es una transformación lineal.

C

// C program to demonstrate scaling of abjects
#include<stdio.h>
#include<graphics.h>
 
// Matrix Multiplication to find new Coordinates.
// s[][] is scaling matrix. p[][] is to store
// points that needs to be scaled.
// p[0][0] is x coordinate of point.
// p[1][0] is y coordinate of given point.
void findNewCoordinate(int s[][2], int p[][1])
{
    int temp[2][1] = { 0 };
 
    for (int i = 0; i < 2; i++)
        for (int j = 0; j < 1; j++)
            for (int k = 0; k < 2; k++)
                temp[i][j] += (s[i][k] * p[k][j]);
 
    p[0][0] = temp[0][0];
    p[1][0] = temp[1][0];
}
 
// Scaling the Polygon
void scale(int x[], int y[], int sx, int sy)
{
    // Triangle before Scaling
    line(x[0], y[0], x[1], y[1]);
    line(x[1], y[1], x[2], y[2]);
    line(x[2], y[2], x[0], y[0]);
 
    // Initializing the Scaling Matrix.
    int s[2][2] = { sx, 0, 0, sy };
    int p[2][1];
 
    // Scaling the triangle
    for (int i = 0; i < 3; i++)
    {
        p[0][0] = x[i];
        p[1][0] = y[i];
 
        findNewCoordinate(s, p);
 
        x[i] = p[0][0];
        y[i] = p[1][0];
    }
 
    // Triangle after Scaling
    line(x[0], y[0], x[1], y[1]);
    line(x[1], y[1], x[2], y[2]);
    line(x[2], y[2], x[0], y[0]);
}
 
// Driven Program
int main()
{
    int x[] = { 100, 200, 300 };
    int y[] = { 200, 100, 200 };
    int sx = 2, sy = 2;
 
    int gd, gm;
    detectgraph(&gd, &gm);
    initgraph(&gd, &gm," ");
 
    scale(x, y, sx,sy);
    getch();
 
    return 0;
}

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *