Промасштабировать и построить на экране фигуру, заданную в файле списком координат ее вершин. Рассмотрим преобразования на плоскости - перенос и масштабирование, Определяем векторы строки Сдвиг точки в векторной форме Или более кратко Объект можно перенести, применяя это выражение к каждой точке объекта. Однако для отрезка достаточно применить этот процесс только к его концевым точкам. Это справедливо и для масштабирования. Масштабирование Определяя или 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;
Ключевые слова:
масштабирование, масштаб, перенос, сдвиг
|
|||||||