Зміст p>
Вступ 3 p>
Технічні параметри 4 p>
Можливості системи. 4 p>
Апаратне забезпечення. 4 p>
Програмне забезпечення. 4 p>
Опис структури системи та принципи її роботи 5 p>
Опис методу 6 p>
Опис програми 7 p>
Структура бази для зберігання еталонних символів 9 p>
Текст програми 12 p>
Введення p>
В даний час, із зростанням числа персональних комп'ютерів, величезнакількість інформації вводиться з паперових носіїв на магнітні дискикомп'ютерів. Зрозуміло це дуже стомлююча робота. І було б непоганомати у своєму розпорядженні програмний засіб, який був би здатнийсприймати вхідний зображення документу, яке взагалі кажучи єкартинкою, і перетворювати його в текст, відкидаючи при цьому всі зайвідеталі зображення
(Такі як лінії розмітки, обрамлення тощо). P>
Це питання хвилює багато фірм з розробки програмного забезпеченняі зараз у світі розроблено кілька програм для розпізнаваннямашинописного тексту. Але це тільки початковий етап на шляху вирішення даноїзавдання. Дані програмні продукти розпізнають текст з досить великоюймовірністю помилки за умови неякісного зображення. Про те, щоброзпізнавати рукописний текст поки навіть не доводиться й говорити. p>
Метою розробки даної програмної системи є детальне вивченняданого питання і створення алгоритму, що дозволяє перетворюватиграфічне зображення у текст. Єдина відмінність даної системи відрозроблених раніше це те, що розпізнавати належить ієрогліфи. Ці знакимають істотну відмінність від звичної нам кирилиці та латинських символів.
Вже одне те, що вони складаються з безлічі різних візерунків відкидає ідеюбудувати розпізнавання на апроксімірованіі зображення символу з допомогоюбудь-якої функції. Хоча тут можна спробувати використовувати фрактальніперетворення, за допомогою яких можна описати будь-як завгодно складнезображення. Але теорія, що описує застосування даних перетвореньє комерційною таємницею і є недоступною.
Технічні параметри p>
Можливості системи. P>
Система забезпечує введення сканованого зображення тексту зграфічного файла, записаного в одному з форматів: PCX, BMP, WMF, JPEG,
GIF. Розмір зображення не повинен перевищувати 3000 х 3000 пікселів. Режимсканування повинен бути вибраний так, щоб розміри окремого символу
(ієрогліфа) не перевищував 30 пікселів і був не менш 5 пікселів. Допускаєтьсянахил рядків до горизонталі не більше ніж на 6 °. Відстань між окремимирядками тексту не повинно бути менше 1/5 максимальної висоти ієрогліфа.
Система забезпечує поділ введеного тексту на окремі рядки і наокремі символи. Результатом роботи є візуальне розділення текстуна рядки і символи, а також текстовий файл, що містить координати кожноговиділеного символу тексту в порядку виділення. При поділі символівсистема використовує правило накреслення ієрогліфів, відповідно до якогоокремий ієрогліф вписується в більш-менш правильний квадрат.
Отже, не гарантується, що тексти, накреслення символів яких невідповідають даному правилу, будуть розбиватися на символи коректно. p>
Також як доповнення до обробки зображення система здатнавиділяти окремо вертикальні і горизонтальні лінії. Дана можливістьможе бути використана для аналізу зображення по окремих лініях. p>
Зроблені пробні експерименти по Афінах перетворень. Ціперетворення в майбутньому обіцяють дати багато корисного в галузі обробкизображень. p>
Апаратне забезпечення. P>
Для роботи системи необхідно: p>
1. IBM - сумісний персональний комп'ютер з процесором не нижче p>
Intel80486sx33, об'ємом оперативної пам'яті не менше 4 Мб. P>
2. Сканер будь-якого типу. P>
Програмне забезпечення. P>
1. Операційна оболонка Windows 95, або Windows NT або Windows версії p>
3.1 або 3.11 в комплекті з MS-DOS версії не нижче 3.30. P>
2. Програмне забезпечення для сканера, що забезпечує можливість збереження сканованого зображення в одному з форматів PCX, JPG, p>
BMP, WMF. P>
Опис структури системи та принципи її роботи p>
У якості середовища для розробки даної системи обрана операційнаоболонка Microsoft Windows. Це обумовлено тим, що Windows підтримуєроботу з графічними зображеннями на рівні розробника додатків. Тимсамим з роботи виключається питання про кодування своїх коштів по роботі зграфікою. Природно швидкість роботи системи зі стандартними графічнимизасобами багато нижче, ніж безпосередній запис в відеопам'ять, але наданому етапі роботи питання впирається не в швидкість. p>
Для розробки системи була обрана середовище програмування Borland
Delphi виробництва фірми Borland International ® USA, California. Delphiявляє собою середовище, що підтримує візуальне проектуваннядодатків для Windows. При цьому інтерфейс користувача створюється шляхомкомбінування та редагування стандартних компонентів (форм (вікон), меню,полів вводу, статичних текстів, списків різної форми, екранних кнопоктощо), наявних в стандартній бібліотеці візуального конструктора. Середавізуального програмування обрана тому, що вона забезпечуєможливість максимально простого, швидкого і якісного створеннястандартних фрагментів програми [1]. p>
У порівнянні з іншими системами візуального програмування (Visual
FoxPro, DBase for Windows, Microsoft Visual Basic, Microsoft Visual C + +,
Gupta SQLWindows і пр.) Delphi має наступні переваги. P>
. Всі перераховані вище системи є інтерпретаторами, тобто для виконання створених в них програм потрібне завантаження модуля інтерпретатора мови, або псевдокомпіляторамі, які формують програму у вигляді EXE-модуля, що містить псевдокод програми p>
(певним чином закодований текст) і модуль інтерпретації, що виконує цей псевдокод. У Delphi ™ результатом створення проекту є програма на мові Object Pascal ™, який компілюється компілятором Borland Pascal 8.0 ™ в EXE - модуль, або DLL - бібліотеку. EXE - модуль містить процесорний код і може бути запущений безпосередньо з Windows ™. DLL-бібліотеку може використовувати будь-який Windows ™ - додаток, в тому числі написане на іншій мові. P>
Дійсна компіляція забезпечує значно більшу швидкодію і дає виграш по пам'яті і дискового простору (якщо враховувати ресурси, що споживаються модулем інтерпретації в інтерпретують системах). p>
. На відміну від ряду систем (Visual FoxPro ™, DBase for Windows ™, p>
Microsoft ® Visual Basic ™) Delphi ™ забезпечує можливість візуального конструювання не тільки інтерфейсу, але і ряду стандартних модулів програми, не відображаються на екрані. Крім того, Delphi ™ має стандартні засоби створення власних екранних і невидимих компонентів, що дозволяє необмежено розширювати набір об'єктів, використання яких можливе в будь-якому проекті і нічим не відрізняється від використання стандартних об'єктів бібліотеки Delphi ™. P>
. У Delphi ™ доступні тексти програми, породженою візуальним конструктором, причому зміни в них не впливають на можливість подальшої обробки їх конструктором. Це дає можливість здійснювати необхідну корекцію роботи об'єктів програми, якщо вона не забезпечується візуальним конструктором. P>
Таким чином, Delphi задовольняє вимогам зручності, швидкості таякості розробки. Крім того, використання мови Pascal дозволяєзабезпечити прийнятну швидкість виконання перетворень, що вимагаютьвеликого обсягу обчислень за рахунок дійсної компіляції та можливостібезпосередньої роботи з пам'яттю комп'ютера. p>
Спочатку планувалося створити алгоритм кодування символу,який би дозволяв здійснюються його однозначну ідентифікацію (рис. 1). p>
рис. 1 p>
Так в ньому планувалося білі пікселі кодувати 0, а чорні - 1 ірозглядати їх не як окремі а групою, тобто група білих пікселів --це 0, далі група чорних - 1 і т.д. В результаті, символ, укладений упрямокутну (рис. 1) рамку дає наступний код: p>
010 01010 p>
01010 0101010 p>
010 01010 p>
01010 0101010 p >
010 01010 p>
01010 0101 p>
010 010 p>
01010 p>
0101 p>
01 p>
010 p>
Але на практиці виявилося, що цей спосіб не підходить для розв'язуваноїзавдання, тому що він дуже сильно прив'язаний до накресленню символу. При змінірозміру символу або при трохи відмінному накресленні його код змінюєтьсядуже істотно. При збільшенні розміру символу з'являються додатковірядки, а значить і додаткові символи коду. Отже однозначнедекодування символу за даних обставин не представляєтьсяможливим. p>
Але цей досвід не пройшов даремно. Були зроблені відповідні висновки, асаме: p>
. Не можна прив'язуватися до накресленню символу, тобто до окремі пікселі. p>
. Треба аналізувати зображення не по пікселях, а по окремих елементах, таких як лінії, кружальця, крючечкі. P>
. Альтернативою попереднього висновку є визначення щільності зображення в окремих її частинах. P>
Опис методу p>
У розробляється системі використовується саме третій метод, тобтовизначення щільності зображення в окремих її частинах. p>
Його суть полягає в наступному:
. Спочатку на всьому зображенні виділяється область, що обмежує окремий символ.
. Потім ця область ділиться на 9 рівних частин (рис. 2). P>
рис. 2 p>
. У кожному з 9 квадратів підраховується число чорних пікселів і ділиться на площу даного квадрата, тобто визначається щільність заповнення в кожному квадраті.
. Всі 9 певних щільностей перетворюються у формат Х. ХХХ і далі в рядок типу Х. Х. ХХХ ХХХ ХХХ Х. Х. Х. ХХХ ХХХ ХХХ Х. Х. Х. ХХХ ХХХ p>
Х. ХХХ. p>
Перетворення в рядок здійснюється для більш зручного зберігання данихв базі даних (структура бази описана в додатку), тому що це набагатозручніше, ніж робити в базі 9 полів для зберігання 9 значень щільності. p>
Декодування символу проводиться аналогічним чином, тількиотримані дані порівнюються зі значеннями збереженими в базі даних. p>
Опис програми p>
Всі операції здійснюються за допомогою головного меню програми.
Головне меню складається з наступних пунктів: p>
1) Файл p>
. Відкрити файл
Відкривається вікно вибору файлу. Можливі маски для вибору (BMP, PCX, JPG p>
).
Якщо вибраний файл є правильним графічним файлом, то збережене в ньому зображення виводиться у вікно програми.
. Виділити лінії p>
Перед користувачем з'являється діалогове вікно, в якому йому надається можливість вибрати які лінії виділяти (вертикальні або горизонтальні).
1) Операції p>
. Очистити p>
Той файл, який був відкритий відкривається знову і всі лінії, що з'явилися в процесі роботи видаляються. P>
. Визначити щільність (навчання)
Цей пункт меню призначений для навчання системи. У вікні повинен знаходиться еталонний текст. За допомогою "мишки" виділяється потрібний символ і вибирається даний пункт. Слідом за цим користувачу надається можливість вказати унікальний код для вибраного символу. Певна щільність і код записуються в базу даних. P>
. Розпізнати p>
Цей пункт протилежний попередньому. За допомогою "мишки" виділяється потрібний символ і вибирається даний пункт. Відбувається визначення щільності вибраного символу і далі в базі здійснюється пошук запису, у якій поле з еталонної рядком більше схоже з щільністю виділеного символу. P>
Порівняння відбувається наступним чином: p>
Визначається і складаються між собою різниці між густиною еталонного і виділеного символами для кожного квадрата. Той еталонний символ, у якого отримана сума виявиться найменшою вважається еквівалентом для виділеного.
1) Перетворення p>
Ці перетворення є експериментальними і не є метою поставленого завдання. Отримані результати при більш глибокому дослідженні можуть бути в подальшому використані для обробки зображень. P>
. Афіною перетворення p>
. Візерунки p>
Ці два пункти будують зображення користуючись Афінами перетвореннями з різними коефіцієнтами. Залежно від цих коефіцієнтів зображення виходять різними. P>
. Лист папороті p>
Знову ж таки грунтуючись на Афіни перетвореннях будується лист папороті. Дане перетворення має величезне практичне значення, так як відносно складне зображення (лист папороті) будується за допомогою однієї формули.
1) Вихід
Вихід з програми. P>
Додаток p>
Структура бази для зберігання еталонних символів p>
| Код символу | Еталонна рядок |
| | | P>
Код символу - однозначно ідентифікує що зберігається символ. Так як в базізберігаються еталони ієрогліфів, для яких в російському алфавіті немає прикладунакреслення, то для заміни розпізнаного символу потрібно ще зберігати і йогоеталонне зображення. Але оскільки метою даної роботи є не замінарозпізнаних символів на еталонні, а лише співвідношення з еталоном, то дляекономії дискового простору вирішено зберігати не еталонне зображеннясимволу, а тільки його унікальний код, за допомогою якого можна однозначноідентифікувати символ. p>
Еталонна рядок - рядок, що містить в собі всі 9 щільностейвиділеної області. p>
p>
p>
Текст програми p>
($ I CdBase.inc)
($ I CdComp.inc)unit Main; p>
interface p>
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, Reg_imag, Menus, Options, CmplSign , DBTables, DB; p>
type
TMainForm = class (TForm) p>
MainMenu: TMainMenu; p>
N1: TMenuItem; p>
N2: TMenuItem; p>
Image: TMultiImage; p>
N3: TMenuItem; p>
NFileOpen: TMenuItem; p>
OpenDialog: TOpenDialog;
NSelect: TMenuItem; p>
N4: TMenuItem; p>
N5: TMenuItem; p>
N6: TMenuItem; p>
N7: TMenuItem; p>
Onemore1: TMenuItem; p>
N8: TMenuItem; p>
N9: TMenuItem; p>
DataTable: TTable; p>
N10: TMenuItem; p>
DataTableOpis: TStringField; p>
DataTableID: TFloatField; procedure N2Click (Sender: TObject); procedure NFileOpenClick (Sender: TObject); procedure NSelectClick ( Sender: TObject); procedure FormCreate (Sender: TObject); procedure ImageMouseDown (Sender: TObject; Button: TMouseButton; p>
Shift: TShiftState; X, Y: Integer); procedure ImageMouseUp (Sender: TObject; Button : TMouseButton; p>
Shift: TShiftState; X, Y: Integer); procedure ImageMouseMove (Sender: TObject; Shift: TShiftState; X, p>
Y: Integer); procedure N4Click (Sender : TObject); procedure N7Click (Sender: TObject); procedure Onemore1Click (Sender: TObject); procedure N8Click (Sender: TObject); procedure N9Click (Sender: TObject); procedure N5Click (Sender: TObject); procedure N10Click (Sender: TObject ); private p>
DetectRectX, DetectRectY: real; (Кут, під яким виділяти лінії) xStart, xEnd, yStart, yEnd: word; p>
BegSelect: boolean; procedure DefGradient (var Gx , Gy: real; x, y: word); procedure SetRect; procedure DefPlotn; procedure AfinConvert; procedure OneMore; procedure Mandel; procedure Paporotnik; function GetDensity: string; public p>
(Public declarations) end;
var
MainForm: TMainForm; p>
implementation
($ R *. DFM) p>
procedure TMainForm.N2Click (Sender: TObject);begin
Application.Terminate;end; p>
procedure TMainForm.NFileOpenClick (Sender: TObject);begin if OpenDialog.Execute then begin p>
Image.ImageName: = OpenDialog.FileName; p>
NSelect.Enabled: = True; end else NSelect.Enabled: = False;end; p>
procedure TMainForm.NSelectClick (Sender: TObject);var
Result: word;begin
OptionForm: = nil; try p>
OptionForm: = TOptionForm.Create (Self); with OptionForm do begin p>
RectXEdit.Text: = FloatToStr (DetectRectX); p>
RectYEdit.Text: = FloatToStr (DetectRectY); p>
X1Edit.Text: = IntToStr (xStart); p>
X2Edit.Text: = IntToStr (xEnd);
Y1Edit.Text: = IntToStr (yStart); p>
Y2Edit.Text: = IntToStr (yEnd); p>
Result: = ShowModal; p> < p> DetectRectX: = StrToInt (RectXEdit.Text); p>
DetectRectY: = StrToInt (RectYEdit.Text); xStart: = StrToInt (X1Edit.Text); xEnd: = StrToInt (X2Edit.Text); yStart : = StrToInt (Y1Edit.Text); yEnd: = StrToInt (Y2Edit.Text); end; (with) finally p>
OptionForm.Free; end; (try) if Result = mrOK then SetRect;end; p>
(Визначення градієнтів Gx Gy і в точці [x, y])procedure TMainForm.DefGradient (var Gx, Gy: real; x, y: word);var a, b, c, d, e, g, h, i: byte;begin with Image.Canvas do begin if Pixels [x-1, y-1] = clBlack then a: = 0 else a: = 1; if Pixels [x, y-1] = clBlack then b: = 0 else b: = 1; if Pixels [x +1, y-1] = clBlack then c: = 0 else c: = 1; if Pixels [x-1, y] = clBlack then d: = 0 else d: = 1; if Pixels [x 1, y] = clBlack then e: = 0 else e: = 1; if Pixels [x-1, y 1] = clBlack then g: = 0 else g: = 1; if Pixels [x, y 1] = clBlack then h: = 0 else h: = 1; if Pixels [x +1, y +1] = clBlack then i: = 0 else i: = 1; p>
(Градієнт по X) p>
Gx: = g + 2 * h + i - a - 2 * b - c; if Gx <0 then Gx: = 0; if Gx = 0 then Gx: = 0.000001;
(Градієнт по Y) p>
Gy: = c + 2 * e + i - a - 2 * d - g; if Gy <0 then Gy: = 0;end; (with Image)end; p>
procedure TMainForm.SetRect;var x, y: word;
Gx, Gy, Qx, Qy: real;
OutF: TextFile;
S1, S2: string;begin
AssignFile (OutF, 'tangs.000');
Rewrite (OutF);
(Скануємо все зображення) with Image.Canvas do begin for y: = yStart 1 to yEnd-1 do begin for x: = xStart 1 to xEnd-1 do begin p>
DefGradient (Gx, Gy, x, y); (Визначити градієнт в точці [x, y]) p>
( if Gx + Gy> 0 then Pixels [x, y 200]: = clRed;) p>
Qx: = ArcTan (Gy/Gx); p>
Qx: = Round (Qx * 180/Pi); p>
(Qx: = Round (90 * Gx/4); p>
Qy: = Round (90 * Gy/4 );} p>
Str (Qx: 2:0, S1);
(Str (Qy: 2:0, S2);) p>
Write (OutF, S1 + ( '' + S2 +) '|'); p>
(if (Q = Pi/3) then Pixels [x, y 200]: = clRed;) if (Qx> (DetectRectX) 80) and (Qx <100) (and (Q>
DetectRect * Pi/180)) then p>
Pixels [x, y 200]: = clRed; end; (for x) p>
WriteLn (OutF, 'End Line'); end; (for y) end; (with Image.Canvas)
CloseFile (OutF);end; p>
procedure TMainForm.DefPlotn;var i, j, x, y, dx, dy, Range, x1, y1: word;
Count: word;begin x: = xStart; y: = yStart; dx: = Round ((xEnd-xStart +1) div 3); dy: = Round ((yEnd-yStart +1) div 3); x1: = x; y1: = y;
(Три квадрата по вертикалі) for i: = 1 to 3 do begin if i = 2 then Range: = (yEnd-yStart +1) - 2 * dy else Range: = dy; p>
(Три квадрата по горизонталі) for j: = 1 to 3 do begin if j = 2 then Range: = (xEnd-xStart +1) - 2 * dx else Range: = dx; p>
(Скануємо всередині квадрата по y) for y: = y1 to y1 + Range do begin p>
(Скануємо всередині квадрата по x) for x: = x1 to x1 + Range do begin p>
(Підраховуємо число не білих пікселів) if Image.Canvas.Pixels [x, y] clWhite then Inc (Count); end; (for x) end; (for y) x1: = x1 + dx; (Наступний квадрат по горизонталі) end; (for j) y1: = y1 + dy; (Наступний квадрат по вертикалі) end; (for i)end; p>
procedure TMainForm.FormCreate (Sender: TObject);begin
OpenDialog.FileName: = 'c: delphimydirdiplompictpict1.bmp';
Image.ImageName: = OpenDialog.FileName;end; p>
procedure TMainForm.ImageMouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);begin if Button = mbRight then begin p>
Image.ImageName: = OpenDialog.FileName; p>
Exit; end;
BegSelect: = True; with Image.Canvas do begin p>
Pen.Mode: = pmXor; p>
Pen.Color: = clGreen; p>
Pen.Style: = psDot; p>
Brush.Style : = bsClear; xStart: = X; yStart: = Y; xEnd: = X; yEnd: = Y; end; (with)end; p>
procedure TMainForm.ImageMouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);begin
BegSelect: = False; with Image.Canvas do begin p>
Pen.Mode: = pmCopy; p>
Pen.Color: = clBlack; p>
Pen.Style: = psSolid; p>
Brush.Style: = bsSolid; end; (with)end; p>
procedure TMainForm.ImageMouseMove (Sender: TObject; Shift: TShiftState; X,
Y: Integer);begin if not BegSelect then Exit; with Image.Canvas do begin p>
Rectangle (xStart, yStart, xEnd, yEnd); xEnd: = X; yEnd: = Y; p>
Rectangle ( xStart, yStart, xEnd, yEnd); end; (with)end; p>
procedure TMainForm.N4Click (Sender: TObject);begin
Image.ImageName: = OpenDialog.FileName;end; p>
(Афіною перетворення)procedure TMainForm.AfinConvert;var dx, dy, Rand: word;
A, B, C, D, E, F: real; x, y: word; i: longint;begin
A: = 0.5; B: = 0.5; E: = 0;
C: = 0.3; D: = 0; F: = 1; p>
dx: = (xEnd - xStart +1) div 2; xEnd: = xStart 2 * dx - 1; dy: = (yEnd-yStart +1) div 2; yEnd: = yStart 2 * dy - 1; p>
x : = xStart + dx; y: = yStart + dy;
Randomize; for i: = 1 to 50000 do begin p>
Rand: = Random (10); p>
Case Rand of p>
0 .. 3: begin x: = xStart + 1 + (x-xStart +1) div 2; y: = yStart + 1 + (y-yStart +1) div 2; end ; p>
4: begin x: = xStart + dx + (x-xStart +1) div 2; y: = yStart + 1 + (y-yStart +1) div 2; end; p >
5: begin x: = xStart + 1 + (x-xStart +1) div 2; y: = yStart + dy + (y-yStart +1) div 2; end; p>
6 .. 9: begin x: = xStart + dx + (x-xStart +1) div 2; y: = yStart + dy + (y-yStart +1) div 2; end; end; (Case) p >
Image.Canvas.Pixels [x, y]: = clBlue; end; (for i)end; p>
procedure TMainForm.N7Click (Sender: TObject);begin
AfinConvert;end; p>
procedure TMainForm.OneMore;var dx, dy, Rand, Kx, Ky: word;
A, B, C, D, E, F: real; x, y, K: real; i: longint;begin
Kx: = 4; Ky: = 4; dx: = (xEnd-xStart +1) div Kx; xEnd: = xStart + Kx * dx - 1; dy: = (yEnd-yStart +1) div Ky ; yEnd: = yStart + Ky * dy - 1; x: = xStart; y: = yStart; for i: = 1 to 100000 do begin p>
Rand: = Random (Kx * Ky); if ( Rand = 0) or (Rand = 3) or (Rand = 12) or (Rand = 15) then p>
Continue; p>
K: = (Rand - Kx * (Rand div Kx)) * dx; x: = K + xStart + 1 + (x-xStart +1)/Kx; p>
K: = (Rand div Kx) * dy; y: = K + yStart + 1 + (y-yStart +1)/Ky; p>
Image.Canvas.Pixels [Round (x), Round (y)]: = clBlue; end; (for i)end; p>
procedure TMainForm.Onemore1Click (Sender: TObject);begin
OneMore;end; p>
procedure TMainForm.Mandel;var
Z, Z0, C: TComplex; i, x, y: word;begin
Z0: = TComplex.Create (0,0);
Z: = TComplex.Create (0,0);
C: = TComplex.Create (0,0); for y: = yStart to yEnd do begin for x: = xStart to xEnd do begin p>
C. Assign (x, y); p>
Z. Mul (Z0); p>
Z. Plus (C); if (Z. Re <2) and (Z. Im <2) then p>
Image.Canvas.Pixels [Z. Re, Z. Im]: = clBlue; p>
Z. Assign (0,0); end; (for x) end; (for y)
C. Free;
Z. Free;
Z0.Free;end; p>
procedure TMainForm.N8Click (Sender: TObject);begin
Mandel;end; p>
procedure TMainForm.Paporotnik;const
A: array [0 .. 3, 0 .. 2, 0 .. 3] of integer = p>
(((0,0,0,0), (0,20, 0,0), (0,0,0,0 )), p>
((85,0,0,0), (0,85,11,70), (0, -10, 85,0 )), p>
((31, -41,0,0), (10,21,0,21), (0,0,30,0 )), p>
((-29,40,0,0), (10,19,0,56), (0,0,30,0)));var b: array [1 .. 15000] of word; k, n, i: word; newX, newY, z, x, y: real;
Color: longint;begin x: = 0; y: = 0; z: = 0;
Randomize; for k: = 1 to 15000 do begin b [k]: = Random (10); if b [k]> 3 then b [k]: = 1; end; (for k) p>
i: = 1;
(B [i]: = 1;) for i: = 1 to 10000 do begin newX: = (a [b [i], 0,0] * x + a [b [i], 0,1] * y + a [b [i], 0,2] * z)/100 + a [b [i], 0,3]; newY: = (a [b [i], 1,0] * x + a [ b [i], 1,1] * y + a [b [i], 1,2] * z)/100 + a [b [i], 1,3]; z: = (a [b [i ], 2,0] * x + a [b [i], 2,1] * y + a [b [i], 2,2] * z)/100 + a [b [i], 2,3 ]; x: = newX; y: = newY; p>
Color: = Random (65535); p>
Color: = Color * 100; p>
Image. Canvas.Pixels [Round (300-x + z), Round (350-y)]: = clGreen; end; (for k)end; p>
procedure TMainForm.N9Click (Sender: TObject);begin
Paporotnik;end; p>
function TMainForm.GetDensity: string;var i, j: byte;
LenX, LenY, x, y, xOld, yOld, dx, dy: word;
BlackCnt, TotCnt: word;
P: real; (Щільність пікселів в квадранті)
S, S1: string;begin
(Визначаємо щільність в 9 квадрантах)
(виділеного діапазону)
S: ='';
LenX: = xEnd-xStart 1;
LenY: = yEnd-yStart 1 ; xOld: = xStart; yOld: = yStart; for j: = 1 to 3 do begin if j = 2 then dy: = LenY-2 * Round (LenY/3) else dy: = Round (LenY/3); for i: = 1 to 3 do begin if i = 2 then dx: = LenX-2 * Round (LenX/3) else dx: = Round (LenX/3);
{------------------------------------------------- -----------------} p>
BlackCnt: = 0; (Кількість чорних пікселів в квадранті) for y: = yOld to yOld + dy-1 do begin for x: = xOld to xOld + dx-1 do begin if Image.Canvas.Pixels [x, y] clWhite then Inc (BlackCnt); end; (for x) end; (for y)
{------------------------------------------------- -----------------} p>
TotCnt: = dx * dy; p>
P: = BlackCnt/TotCnt; (Щільність пікселів в квадранті) p>
Str (P: 1:3, S1); p>
S: = S + S1 + ''; xOld: = xOld + dx; end; (for i) yOld : = yOld + dy; end; (for j)
Result: = S;end; (TMainForm.GetDensity) p>
procedure TMainForm.N5Click (Sender: TObject);var
S: string;
ID: word;begin
S: = GetDensity;
ID: = DataTable.RecordCount;
DataTable.AppendRecord ([ID 1, S]);end; p>
procedure TMainForm.N10Click (Sender: TObject);var
SValue: string [5];
S, DStr1, DStr2, OldS: string;
Value, NewValue: real; i: byte;
ID: word;begin
S: = GetDensity;
OldS: = S;
DataTable.First;
Value: = 100;
ID: = 0; while not DataTable.EOF do begin p >
NewValue: = 0; p>
{--------------------------------- --------------------------} for i: = 1 to 9 do begin p>
DStr1: = Copy (S, (i-1) * 6 +1, 5); p>
DStr2: = Copy (DataTableOpis.Value, (i-1) * 6 +1, 5); p>
NewValue : = NewValue + Abs (StrToFloat (DStr2)-StrToFloat (DStr1)); end; (for i) p>
{------------------- ----------------------------------------} if NewValue Value: = NewValue; p>
ID: = DataTableID.AsInteger; end; p>
DataTable.Next; end; (while)
ShowMessage (IntToStr (ID) );end;end. p>
-----------------------< br>[1] Відомо, що при створенні звичайними засобами ( "руками") інтерфейсу користувача для програм, що працюють в графічних середовищах, на це йде більше 80% часу розробки програми. P>