2D-преобразование в компьютерной графике | Набор 1 (Масштабирование объектов)

Опубликовано: 19 Января, 2022

Масштабирующее преобразование изменяет размер объекта. В процессе масштабирования мы либо сжимаем, либо расширяем размер объекта.
Операция масштабирования может быть достигнута путем умножения каждой координаты вершины (x, y) многоугольника на коэффициент масштабирования s x и s y, чтобы получить преобразованные координаты как (x ', y').
Итак, x '= x * s x и y' = y * s y .
Коэффициент масштабирования s x , s y масштабирует объект по осям X и Y соответственно. Итак, приведенное выше уравнение можно представить в матричной форме:

Или P '= S. п
Процесс масштабирования:

Примечание. Если коэффициент масштабирования S меньше 1, мы уменьшаем размер объекта. Если коэффициент масштабирования S больше 1, мы увеличиваем размер объекта.

Алгоритм:

 1. Создайте матрицу масштабирования 2x2 S как:
   S x 0
   0 S y
2. Для каждой точки многоугольника.
   (i) Составьте матрицу P размером 2x1, где P [0] [0] равно 
       к координате x точки и P [1] [0] 
       равно координате y точки.
   (ii) Умножаем матрицу масштабирования S на точку 
        матрица P для получения новой координаты.
3. Нарисуйте многоугольник в новых координатах.

Below is C implementation:

// 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;
}

Выход:

Автор статьи - Анудж Чаухан . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью на сайте deposit.geeksforgeeks.org или отправить свою статью по электронной почте: grant@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .

Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.