<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://sfsys.ru/index.php?action=history&amp;feed=atom&amp;title=Picture.TransformPicture</id>
	<title>Picture.TransformPicture - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://sfsys.ru/index.php?action=history&amp;feed=atom&amp;title=Picture.TransformPicture"/>
	<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=Picture.TransformPicture&amp;action=history"/>
	<updated>2026-04-04T15:27:33Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.1</generator>
	<entry>
		<id>http://sfsys.ru/index.php?title=Picture.TransformPicture&amp;diff=1770&amp;oldid=prev</id>
		<title>Admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=Picture.TransformPicture&amp;diff=1770&amp;oldid=prev"/>
		<updated>2021-02-07T06:52:23Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 06:52, 7 February 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://sfsys.ru/index.php?title=Picture.TransformPicture&amp;diff=1769&amp;oldid=prev</id>
		<title>Admin at 06:52, 13 December 2020</title>
		<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=Picture.TransformPicture&amp;diff=1769&amp;oldid=prev"/>
		<updated>2020-12-13T06:52:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{infobox function&lt;br /&gt;
|name=TransformPicture&lt;br /&gt;
|object=[[Картинка]]&lt;br /&gt;
|caption=Изменение картинки&lt;br /&gt;
|type=1&lt;br /&gt;
|status=2&lt;br /&gt;
|db=0&lt;br /&gt;
|exception=Невозможно превратить в число, неверные параметры.&lt;br /&gt;
|visual=0}}&lt;br /&gt;
{{HeadLinks|&lt;br /&gt;
* [[Main_Page|Начальная страница]]&lt;br /&gt;
* [[Общее_описание_языка|Общее описание]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Картинка]]}}&lt;br /&gt;
Функция натягивает текущую картинку на заданный выпуклый четырехугольник картинки-приемника. Функция также позволяет указать алгоритм масштабирования и коэффициент альфа-сопряжения. Исходная картинка не изменяется. Координаты точек начинаются с единицы, координата X растет по направлению вправо, координата Y растет по направлению вниз. Для четырехугольника задаются 4 точки, определяющие его вершины. Первая точка всегда соответствует верхней левой точке исходной картинки, последующие координаты могут быть заданы как по часовой стрелке, так и против часовой стрелки (таким образом координаты четырехугольника могут задавать поворот, но не могут задавать разворот вокруг любой из осей). Четырехугольник не должен самопересекаться и не должен быть вырожден (две или более точки имеют одинаковые координаты). С помощью функции можно осуществлять поворот или изменение размера исходной картинки, однако, функции [[Picture.Rotate|Rotate]] и [[Picture.Resize|Resize]] работают значительно быстрее, поэтому, рекомендуется их использование в случае более простых преобразований поворота или изменения размера.&lt;br /&gt;
&lt;br /&gt;
== Синтаксис ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{{Grey|Picture.}}'''TransformPicture'''(''&amp;lt;Картинка-приемник (PICTURE)&amp;gt;'',''&amp;lt;Координата X в приемнике верхней левой точки источника (INT)&amp;gt;'',''&amp;lt;Координата Y в приемнике верхней левой точки источника (INT)&amp;gt;'',''&amp;lt;Координата X в приемнике верхней правой точки источника (INT)&amp;gt;'',''&amp;lt;Координата Y в приемнике верхней правой точки источника (INT)&amp;gt;'',''&amp;lt;Координата X в приемнике нижней правой точки источника (INT)&amp;gt;'',''&amp;lt;Координата Y в приемнике нижней правой точки источника (INT)&amp;gt;'',''&amp;lt;Координата X в приемнике нижней левой точки источника (INT)&amp;gt;'',''&amp;lt;Координата Y в приемнике нижней левой точки источника (INT)&amp;gt;''{{Optional|,&amp;lt;Операция рисования (INT)&amp;gt;{{Default|{{Eq}}0}},&amp;lt;Алгоритм масштабирования (INT)&amp;gt;{{Default|{{Eq}}0}},&amp;lt;Коэффициент альфа-сопряжения (INT)&amp;gt;{{Default|{{Eq}}1000}}}})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Аргументы ====&lt;br /&gt;
* &amp;lt;code&amp;gt;''&amp;lt;Картинка-приемник (PICTURE)&amp;gt;''&amp;lt;/code&amp;gt; - Картинка, куда будет выведена трансформированная текущая картинка.&lt;br /&gt;
* &amp;lt;code&amp;gt;''&amp;lt;Координата X в приемнике верхней левой точки источника (INT)&amp;gt;'',''&amp;lt;Координата Y в приемнике верхней левой точки источника (INT)&amp;gt;''&amp;lt;/code&amp;gt; - Аргументы задают координату первой точки четырехугольника. Первая точка является основной и определяет поворот картинки-результата. Первая точка результата будет всегда соответствовать верхней левой точки картинки-источника.&lt;br /&gt;
* &amp;lt;code&amp;gt;''&amp;lt;Координата X в приемнике верхней правой точки источника (INT)&amp;gt;'',''&amp;lt;Координата Y в приемнике верхней правой точки источника (INT)&amp;gt;''&amp;lt;/code&amp;gt; - Аргументы задают координату второй точки четырехугольника. Вторая точка также может быть задана против часовой стрелки (нижняя левая точка источника).&lt;br /&gt;
* &amp;lt;code&amp;gt;''&amp;lt;Координата X в приемнике нижней правой точки источника (INT)&amp;gt;'',''&amp;lt;Координата Y в приемнике нижней правой точки источника (INT)&amp;gt;''&amp;lt;/code&amp;gt; - Аргументы задают координату третьей точки четырехугольника. &lt;br /&gt;
* &amp;lt;code&amp;gt;''&amp;lt;Координата X в приемнике нижней левой точки источника (INT)&amp;gt;'',''&amp;lt;Координата Y в приемнике нижней левой точки источника (INT)&amp;gt;''&amp;lt;/code&amp;gt; - Аргументы задают координату четвертой точки четырехугольника. Четвертая точка также может быть задана против часовой стрелки (верхняя правая точка источника).&lt;br /&gt;
* &amp;lt;code&amp;gt;''&amp;lt;Операция рисования (INT)&amp;gt;''&amp;lt;/code&amp;gt; - {{Optional}} Аргумент задает режим (операцию) рисования. Нужно понимать, что прозрачность или сглаживание совместно с режимами, отличными от &amp;quot;копирования&amp;quot;, могут привести неожиданным результатам (однако, не запрещены). Возможны следующие значения аргумента:&lt;br /&gt;
** '''0''' (по умолчанию) -- &amp;quot;копирование&amp;quot; точки в картинку результат (с учетом прозрачности).&lt;br /&gt;
** '''1''' -- операция дизъюнкции (''OR'').&lt;br /&gt;
** '''2''' -- операция исключающего или (''XOR'').&lt;br /&gt;
** '''3''' -- операция конъюнкции (''AND'').&lt;br /&gt;
** '''4''' -- операция сложения (''ADD''). Значение каждого из трех каналов (R,G и B) точки результата добавляется к значению каждого из трех каналов исходной точки, если результат сложения превышает 255, он уменьшается до 255.&lt;br /&gt;
** '''5''' -- операция вычитания (''SUB''). Значение каждого из трех каналов (R,G и B) точки результата отнимается от значения каждого из трех каналов исходной точки, если результат вычитания меньше 0, он увеличивается до 0.&lt;br /&gt;
* &amp;lt;code&amp;gt;''&amp;lt;Алгоритм масштабирования (INT)&amp;gt;''&amp;lt;/code&amp;gt; - {{Optional}} Алгоритм масштабирования во время операции. Возможные следующие значения:&lt;br /&gt;
** '''0''' (по умолчанию) - Без сглаживания. Самый быстрый режим, однако для текста и точных объектов создает неприглядный результат.&lt;br /&gt;
** '''1''' - Метод ближайшего соседа (Nearest neighbor). Медленнее первого режима, однако создает почти такой же неприглядный результат.&lt;br /&gt;
** '''2''' - Метод билинейной фильтрации (Bilinear). Режим создает гладкую картинку, однако работает медленнее, чем первые два режима.&lt;br /&gt;
** '''3''' - Метод бикубической фильтрации (Bicubic). Режим создает гладкую картинку, при этом границы объектов (или текста) более выражены по сравнению с билинейной фильтрацией (меньше ощущаемое размытие). Режим работает значительно медленнее билинейной фильтрации и может создавать цветовые артефакты (неверные цвета, которые отсутствовали в оригинальном изображении) на границах резкого изменения цветов&lt;br /&gt;
* &amp;lt;code&amp;gt;''&amp;lt;Коэффициент альфа-сопряжения (INT)&amp;gt;''&amp;lt;/code&amp;gt; - {{Optional}} Рисуемая картинка становится полупрозрачной, оставляя частично видимыми цвета, которые были под ней до ее рисования. Программа использует целочисленную нотация для указания коэффициента альфа. Сопряжение не используется при коэффициенте равном 1000 (по умолчанию), при 500 рисуемая картинка получает половину интенсивности, при 0, рисуемая картинка не видна. При использовании коэффициента не равного 1000, скорость рисования будет снижена.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
[[image:TransformPicture_Example1.png|thumb|right|Исходная картинка, сгенерированная примером]]&lt;br /&gt;
[[image:TransformPicture_Example2.png|thumb|right|Картинка-результат работы примера (в текущей реализации функции [[Random]]]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Данный пример всегда будет выдавать одинаковую картинку (см. рисунок)&lt;br /&gt;
//Чтобы картинка всегда была разная, необходимо заменить randomize(3); на randomize;&lt;br /&gt;
&lt;br /&gt;
  //a -&amp;gt; c-d&lt;br /&gt;
  Function IfPointBelogsToLine(ax,ay,cx,cy,dx,dy)&lt;br /&gt;
    Exit _And((ax-cx)*(dy-cy)-(ay-cy)*(dx-cx)=0,&lt;br /&gt;
      Min(cx,dx)&amp;lt;=ax,Max(cx,dx)&amp;gt;=ax,&lt;br /&gt;
      Min(cy,dy)&amp;lt;=ay,Max(cy,dy)&amp;gt;=ay);&lt;br /&gt;
  EndFunction&lt;br /&gt;
  &lt;br /&gt;
  //a-b, c-d&lt;br /&gt;
  Function IfLineSegmentsIntersect(ax,ay,bx,by,cx,cy,dx,dy)&lt;br /&gt;
    If _And(ax=bx,ay=by) Then&lt;br /&gt;
      Exit IfPointBelogsToLine(ax,ay,cx,cy,dx,dy);&lt;br /&gt;
    EndIf;&lt;br /&gt;
  &lt;br /&gt;
    k:=(by-ay)*(dx-cx)-(bx-ax)*(dy-cy);&lt;br /&gt;
  &lt;br /&gt;
    If k=0 Then&lt;br /&gt;
      If _And(ay-by=0,cy-dy=0,ay=cy) Then&lt;br /&gt;
        If _And(Min(ax,bx)&amp;lt;=Max(cx,dx),Max(ax,bx)&amp;gt;=Min(cx,dx)) Then&lt;br /&gt;
          Exit 1;&lt;br /&gt;
        EndIf;&lt;br /&gt;
      ElseIf _And(ax-bx=0,cx-dx=0,ax=cx) Then&lt;br /&gt;
        If _And(Min(ay,by)&amp;lt;=Max(cy,dy),Max(ay,by)&amp;gt;=Min(cy,dy)) Then&lt;br /&gt;
          Exit 1;&lt;br /&gt;
        EndIf;&lt;br /&gt;
      EndIf;&lt;br /&gt;
      Exit 0;&lt;br /&gt;
    EndIf;&lt;br /&gt;
  &lt;br /&gt;
    r:=((ax-cx)*(dy-cy)-(ay-cy)*(dx-cx))/k;&lt;br /&gt;
    s:=((ax-cx)*(by-ay)-(ay-cy)*(bx-ax))/k;&lt;br /&gt;
  &lt;br /&gt;
    Exit _And(r&amp;gt;=0,r&amp;lt;=1,s&amp;gt;=0,s&amp;lt;=1);&lt;br /&gt;
  EndFunction&lt;br /&gt;
&lt;br /&gt;
randomize(3);&lt;br /&gt;
&lt;br /&gt;
//Генерируем исходную картинку&lt;br /&gt;
aPic:=Picture.Create(400,400);&lt;br /&gt;
aPic.Rectangle(1,1,200,200,,_CLR_RED);&lt;br /&gt;
aPic.Rectangle(201,1,400,200,,_CLR_BLUE);&lt;br /&gt;
aPic.Rectangle(1,201,200,400,,_CLR_GREEN);&lt;br /&gt;
aPic.Rectangle(201,201,400,400,,_CLR_YELLOW);&lt;br /&gt;
aPic.Text(6,6,&amp;quot;1&amp;quot;,&amp;quot;Tahoma|40|B|&amp;quot;+DecToBase(_CLR_YELLOW,16),,,,3);&lt;br /&gt;
aPic.Text(206,6,&amp;quot;2&amp;quot;,&amp;quot;Tahoma|40|B|&amp;quot;+DecToBase(_CLR_GREEN,16),,,,3);&lt;br /&gt;
aPic.Text(6,206,&amp;quot;3&amp;quot;,&amp;quot;Tahoma|40|B|&amp;quot;+DecToBase(_CLR_BLUE,16),,,,3);&lt;br /&gt;
aPic.Text(206,206,&amp;quot;4&amp;quot;,&amp;quot;Tahoma|40|B|&amp;quot;+DecToBase(_CLR_RED,16),,,,3);&lt;br /&gt;
aPic.Rectangle(5,5,aPic.Width-5,aPic.Height-5,_CLR_RED);&lt;br /&gt;
aPic.Save(&amp;quot;c:\Transform1&amp;quot;,&amp;quot;png&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Случайным образом находим четырехугольник трансформации&lt;br /&gt;
Repeat&lt;br /&gt;
  ax=random(1000);ay:=random(1000);&lt;br /&gt;
  cx:=random(1000);cy:=random(1000);&lt;br /&gt;
  bx:=random(1000);by:=random(1000);&lt;br /&gt;
  dx:=random(1000);dy:=random(1000);&lt;br /&gt;
Until IfLineSegmentsIntersect(ax,ay,dx,dy,bx,by,cx,cy);&lt;br /&gt;
&lt;br /&gt;
//Трансформируем картинку и выводим ее на белом фоне&lt;br /&gt;
aPic2:=Picture.Create(1000,1000,_CLR_WHITE);&lt;br /&gt;
aPic.TransformPicture(aPic2,ax,ay,bx,by,dx,dy,cx,cy,2);&lt;br /&gt;
&lt;br /&gt;
//Добавляем номера точек&lt;br /&gt;
aPic2.Text(ax,ay,&amp;quot;1&amp;quot;,,1,,_CLR_WHITE,3);&lt;br /&gt;
aPic2.Text(bx,by,&amp;quot;2&amp;quot;,,1,,_CLR_WHITE,3);&lt;br /&gt;
aPic2.Text(cx,cy,&amp;quot;3&amp;quot;,,1,,_CLR_WHITE,3);&lt;br /&gt;
aPic2.Text(dx,dy,&amp;quot;4&amp;quot;,,1,,_CLR_WHITE,3);&lt;br /&gt;
aPic2.Save(&amp;quot;c:\Transform2&amp;quot;,&amp;quot;png&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
</feed>