Масштабирование изображений

Scale.gif

Промасштабировать и построить на экране фигуру, заданную в файле списком координат ее вершин.

Рассмотрим преобразования на плоскости - перенос и масштабирование,
Перенос
Точку на плоскости можно перенести в новые позиции путем добавления к координатам этих точек констант переноса.
х' = х + Dx
у' = у + Dy

Определяем векторы строки
Р=[х,у]
Р'=[х',у']
T=[Dx,Dy]

Сдвиг точки в векторной форме
[x',y']=[x,y]+[Dx,Dy]

Или более кратко
Р' =Р+Т

Объект можно перенести, применяя это выражение к каждой точке объекта. Однако для отрезка достаточно применить этот процесс только к его концевым точкам. Это справедливо и для масштабирования.

Масштабирование
Для масштабирования объекта каждую точку необходимо растянуть в Sx раз по оси х и в Sy раз по оси у.
х' = х * Sx у' = у * Sy

Определяя
[Sx 0 ] = S
[0 Sy ]

или P'=P * S

Отметим, что маштабирование производится относительно начала координат.

Если Sx != Sy неоднородное масштабирование.

Если Sx = Sy однородное масштабирование. (масштабирование с сохранением пропорций)

type
  RPoint = record
   x, y : Double;        // Мировые координаты точки
   draw : boolean;     // Параметр, указывает рисовать ли в эту точку линию
  end;
 
// Построение треугольника
procedure TForm1.btnTreugClick(Sender: TObject);
var
  Point : Rpoint;
  f     : file of RPoint;
begin
  AssignFile( f, 'plot.dat');   // Открываем файл для записи
  Rewrite(f);
 
  Point.x := 0;    // Координаты первой точки
  Point.y := 0;
  Point.draw := false; // Параметр, указывает рисовать ли в эту точку линию
  write( f , point);   // Записать в файл
 
  Point.x := 10;   // Координаты второй точки
  Point.y := 10;
  Point.draw := true;  // Рисовать линию из предыдущей точки
  write( f , point);   // Записать в файл
 
  Point.x := 10;    // Координаты третьей точки
  Point.y := 0;
  Point.draw := true; // Рисовать линию из предыдущей точки
  write( f , point);  // Записать в файл
 
  Point.x := 0;      // Координаты первой точки
  Point.y := 0;
  Point.draw := true; // Рисовать линию из предыдущей точки
  write( f , point);  // Записать в файл
 
  CloseFile(f);
end;
 
 
// Расчет коэффициентов масштабирования и построение изображения
procedure TForm1.btnDrawClick(Sender: TObject);
var
  Point : Rpoint;
  f     : file of RPoint;
  Xmin, Xmax, Ymin, Ymax : real;
  SXmin, SXmax, SYmin, SYmax : integer;
  ScaleX, ScaleY : real;
  sx, sy : integer;
begin
  AssignFile( f, 'plot.dat'); // Читаем данные из файла
  reset (f);
  Xmin:=1e10; Ymin:=1e10;
  Xmax:=-Xmin; Ymax:=-Ymin;
 
  while not eof(f) do begin   // Находим минимум и максимум по Х и по Y
    read( f, Point);          // в мировых координатах
    if Point.x < Xmin then Xmin := Point.x;
    if Point.x > Xmax then Xmax := Point.x;
    if Point.y < Ymin then Ymin := Point.y;
    if Point.y > Ymax then Ymax := Point.y;
  end;
  CloseFile(f);
 
  SXmin := 0; SXmax := PaintBox1.Width-1;   // Минимум и максимум
  SYmin := 0; SYmax := PaintBox1.Height-1;  // в экранных координатах
 
  ScaleX := (SXmax - SXmin) / (Xmax - Xmin); // Коэффициенты масштабирования
  ScaleY := (SYmax - SYmin) / (Ymax - Ymin);
 
  if chbProportion.Checked then    // Сохранение пропорций
    if (ScaleX < ScaleY) then
      ScaleY := ScaleX
    else
      ScaleX := ScaleY;
 
  reset(f);
  while not eof(f) do begin // Построение изображение с учетом масштаба и сдвига
    read( f, Point);
    sx := SXmin + round(ScaleX * (Point.x - Xmin));
    sy := SYmax - (SYmin + round(ScaleY * (Point.y - Ymin)));
    if Point.draw then
      PaintBox1.Canvas.LineTo( sx, sy)
    else
      PaintBox1.Canvas.MoveTo( sx, sy);
  end;
  CloseFile(f);
end;

Ключевые слова: 
масштабирование, масштаб, перенос, сдвиг
ВложениеРазмер
Программа масштабирования178.12 кб