Size: 510
Comment:
|
Size: 1645
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 3: | Line 3: |
При работе с растровой графикой очень частая операция — масштабирование объектов. Суть операции в том, чтобы точку в диапазоне от ''A,,0,,'' до ''B,,0,,'' превратить в точку в диапазоне от ''A,,1,,'' до ''B,,1,,'' с соблюдением пропорций: | При работе с растровой графикой очень частая операция — масштабирование объектов. Суть операции в том, чтобы точку ''X,,0,,'' в диапазоне от ''A,,0,,'' до ''B,,0,,'' превратить в точку ''X,,1,,'' в диапазоне от ''A,,1,,'' до ''B,,1,,'' с соблюдением пропорций: |
Line 5: | Line 5: |
{{drawing:A0x0b0A1X1B1.adraw}} | {{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) }}} |
Перенос, масштабирование и вращение
При работе с растровой графикой очень частая операция — масштабирование объектов. Суть операции в том, чтобы точку X0 в диапазоне от A0 до B0 превратить в точку X1 в диапазоне от A1 до B1 с соблюдением пропорций:
Значение X0 сначала надо нормализовать: перевести из диапазона A0…B0 в диапазон 0…1. Для чего из X0 надо вычесть нижнюю границу диапазона A0 и поделить результат на длину диапазона B0-A0: X=(X0-A0)/(B0-A0)
Затем перевести в новый диапазон A1…B1 теми же операциями в обратном порядке. Получаем функцию переноса с масштабированием scale(): {{{!python def scale(A0,B0,A1,B1,x):
- return float(X0-A0)/(B0-A0)*(B1-A1)+A1
}}}
Проверим, как это выглядит с помощью Черепашки: