Различия между версиями 1 и 6 (по 5 версиям)
Версия 1 от 2015-01-16 22:28:42
Размер: 502
Редактор: FrBrGeorge
Комментарий:
Версия 6 от 2015-01-17 00:41:45
Размер: 1733
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 3: Строка 3:
При работе с растровой графикой очень частая операция — масштабирование объектов. Суть операции в том, чтобы точку в диапазоне от ''A,,0,,'' до ''B,,0,,'' превратить в точку в диапазоне от ''A,,1,,'' до ''B,,1,,'' с соблюдением пропорций:
{{drawing:A0x0b0A1X1B1}}
== Масштабирование ==
При работе с растровой графикой очень частая операция — масштабирование объектов. Суть операции в том, чтобы число ''X,,0,,'' в диапазоне от ''A,,0,,'' до ''B,,0,,'' превратить в число ''X,,1,,'' в диапазоне от ''A,,1,,'' до ''B,,1,,'' с соблюдением пропорций:

{{attachment:a0b0xa1b1.png}}

Значение ''X,,0,,'' сначала надо ''нормализовать'': перевести из диапазона ''A,,0,,…B,,0,,'' в диапазон ''0…1''. Для чего из ''X,,0,,'' надо вычесть нижнюю границу диапазона ''A,,0,,'' и поделить результат на длину диапазона ''B,,0,,-A,,0,,'': {{{X=(X0-A0)/(B0-A0)}}}

Затем перевести в новый диапазон ''A,,1,,…B,,1,,'' теми же операциями в обратном порядке. Получаем функцию переноса с масштабированием `scale()`:
{{{#!python
def scale(A0,B0,A1,B1,x):
  return float(X0-A0)/(B0-A0)*(B1-A1)+A1
}}}

Проверим, как это выглядит с помощью Черепашки:
{{{#!python
def AxB(A,B,x,y):
  up()
  goto(A,y)
  down()
  stamp()
  goto(x,y)
  stamp()
  goto(B,y)
  stamp()
  up()

A0,B0,X0 = -50,120,81
AxB(A0,B0,X0,40)
# Теперь масштабируем X0
A1,B1 = -100,200
X1 = scale(A0,B0,A1,B1,X0)
AxB(A1,B1,X1,-40)
}}}

== Поворот ==

'''TODO'''

Перенос, масштабирование и вращение

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

При работе с растровой графикой очень частая операция — масштабирование объектов. Суть операции в том, чтобы число X0 в диапазоне от A0 до B0 превратить в число X1 в диапазоне от A1 до B1 с соблюдением пропорций:

a0b0xa1b1.png

Значение X0 сначала надо нормализовать: перевести из диапазона A0…B0 в диапазон 0…1. Для чего из X0 надо вычесть нижнюю границу диапазона A0 и поделить результат на длину диапазона B0-A0: X=(X0-A0)/(B0-A0)

Затем перевести в новый диапазон A1…B1 теми же операциями в обратном порядке. Получаем функцию переноса с масштабированием scale():

   1 def scale(A0,B0,A1,B1,x):
   2   return float(X0-A0)/(B0-A0)*(B1-A1)+A1

Проверим, как это выглядит с помощью Черепашки:

   1 def AxB(A,B,x,y):
   2   up()
   3   goto(A,y)
   4   down()
   5   stamp()
   6   goto(x,y)
   7   stamp()
   8   goto(B,y)
   9   stamp()
  10   up()
  11 
  12 A0,B0,X0 = -50,120,81
  13 AxB(A0,B0,X0,40)
  14 # Теперь масштабируем X0
  15 A1,B1 = -100,200
  16 X1 = scale(A0,B0,A1,B1,X0)
  17 AxB(A1,B1,X1,-40)

Поворот

TODO

FrBrGeorge/PythonScaleAndRotate (последним исправлял пользователь FrBrGeorge 2015-01-18 20:42:33)