![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Bokul |
![]()
Сообщение
#1
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Подскажите, пожалуйста, алгоритм масштабирования рисунков. Рисунок представляет собой двумерный массив, каждый елемент которого определяет цвет соответствующего пикселя на рисунке.
Сообщение отредактировано: Bokul - 22.08.2006 5:46 -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
![]() ![]() |
klem4 |
![]()
Сообщение
#2
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Вот, реализовал свою идею
![]() Управление W - увеличить, S - уменьшить {$mode objfpc}
uses Crt, WinCrt, Graph;
type
TCoordinate = LongInt;
const
mx : TCoordinate = 0;
my : TCoordinate = 0;
cx : TCoordinate = 0;
cy : TCoordinate = 0;
type
TColor = 0..15;
TInfo = TColor;
TRastr = array of array of TInfo;
TImage = Object
src, rslt : TRastr; // исходная и конечная матрицы
sx, sy : Integer; // размеры исходной матрицы
x1, y1, x2, y2 : TCoordinate; // координаты захвата изображения
zoom : Integer; // текущее состояние картинки (0 - исходное состояние)
constructor Init(x_1, y_1, x_2, y_2 : TCoordinate);
destructor Done;
(*
захват изображения,
(x_1, y_1) - левая верхняя точка
(x_2, y_2) - правая нижняя точка
*)
procedure GetSourceRastr; // заполнение исходной матрицы
procedure GetResultRastr(up : boolean); // получение рузультирующей матрицы
procedure ShowCentre;
end;
constructor TImage.Init(x_1, y_1, x_2, y_2 : TCoordinate);
begin
x1 := x_1;
y1 := y_1;
x2 := x_2;
y2 := y_2;
sx := x2 - x1 + 1;
sy := y2 - y1 + 1;
SetLength(src, sx, sy);
zoom := 0;
end;
destructor TImage.Done;
begin
SetLength(src, 0, 0);
SetLength(rslt, 0, 0);
end;
procedure TImage.GetSourceRastr;
var
x, y : TCoordinate;
begin
for x := 0 to sx - 1 do
for y := 0 to sy - 1 do
src[x, y] := GetPixel(x + x1, y + y1);
end;
procedure TImage.GetResultRastr(up : boolean);
var
x, y, rx, ry : TCoordinate;
scale : integer;
begin
case up of
true : scale := +2;
false : scale := -2;
end;
if scale + zoom < 0 then exit; // уменьшить меньше исходного нельзя
zoom := zoom + scale;
if up then begin
SetLength(rslt, sx * 2, sy * 2);
for x := 0 to sx - 1 do
for y := 0 to sx - 1 do
for rx := 2 * x to 2 * x + 1 do
for ry := 2 * y to 2 * y + 1 do
rslt[rx, ry] := src[x, y];
sx := sx * 2;
sy := sy * 2;
SetLength(src, 0, 0);
SetLength(src, sx , sy);
src := rslt;
end else begin
SetLength(rslt, sx div 2, sy div 2);
x := 0;
rx := 0;
while (x <= sx - 1) do begin
y := 0;
ry := 0;
while (y <= sy - 1) do begin
rslt[rx, ry] := src[x, y];
inc(y, 2);
inc(ry);
end;
inc(x, 2);
inc(rx);
end;
sx := sx div 2;
sy := sy div 2;
SetLength(src, 0, 0);
SetLength(src, sx, sy);
src := rslt;
end;
end;
procedure TImage.ShowCentre;
var
x, y : TCoordinate;
begin
for x := 0 to sx - 1 do
for y := 0 to sy - 1 do
PutPixel(x + cx - sx div 2, y + cy - sy div 2, src[x, y]);
end;
procedure GrInit;
var
gd, gm, ge : SmallInt;
begin
gd := Detect;
InitGraph(gd, gm, '');
ge := GraphResult;
if ge <> grOk then begin
writeln('GraphError : ', GraphErrorMsg(ge));
readkey;
Halt(1);
end;
mx := GetMaxX;
my := GetMaxY;
cx := mx div 2;
cy := my div 2;
end;
var
Image : TImage;
ch : char;
begin
clrscr;
GrInit;
// рисуем что-то ...
SetFillStyle(1, BLUE);
SetColor(RED);
//Rectangle(cx - 10, cy - 10, cx + 10, cy + 10);
Bar3D(cx - 10, cy - 10, cx + 10, cy + 10, 7, true);
FloodFill(cx, cy, RED);
SetColor(YELLOW);
Circle(cx, cy, 5);
// нарисовали
Image.Init(cx - 50, cy - 50, cx + 50, cy + 50); // захватываем область
Image.GetSourceRastr; // получаем исходную матирцу
repeat
ch := readkey;
case ch of
'w','W' : Image.GetResultRastr(true); // увеличение
's','S' : Image.GetResultRastr(false); // уменьшение
end;
ClearDevice;
Image.ShowCentre; // показвыаем
until ch = #27; // если ESC то выход
Image.Done;
Readkey;
CloseGraph;
end.
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
![]() ![]() |
![]() |
Текстовая версия | 8.08.2025 8:17 |