close

Вход

Забыли?

вход по аккаунту

?

Курсовая my

код для вставкиСкачать
Министерство Образования, Науки, Молодежи и Спорта Украины
Донецкий Национальный Технический Университет
Пояснительная записка
к курсовой работе
по курсу «Системное программирование»
Вариант №18
Выполнил:
Студент гр. КСД-10
Серик Михаил
Преподаватели:
Омельченко А.А.
Смирницкий Г.А.
Донецк 2012
Реферат
Пояснительная записка к курсовой работе: 36 страниц, 1 приложение
13 рисунков.
Цель работы – практическое закрепление теоретической части курса и
приобретение навыков по систмному программированию.
Морфологический анализ, программирование .Net, распознование рас,
рспознование полов, корресляция, антропология, MathMask, МатМаск,
математическая маска, Scimarket.tk, mathmask.tk
Зим.
Лист
Разработал
Проверили
№ Документа
Серик М.А.
Омельченко А.А.
Смирницкий Г.А.
Подпись
Дата
Морфометрический
анализ и обработка
цифрового изображения,
создание
«математической маски»
Литера.
Лист
Листов
1
ДонНТУ Кафедра АСУ
Утвердил
1
СОДЕРЖАНИЕ
Введение………………………..………………………………..………… 3
1. Лист заданий…………………………………………..………………………4
2. Описание поставленных задач и алгоритмы используемых методов………6
2.1 Математические алгоритмы для обработки координат точек……………7
2.2 Импорт и экспорт значений в файлы *.xls и *.xlsx……………………..7
2.3 Построение макета лица…………………………………………………8
2.4 Сохранение рабочей области……………………………………………9
2.5 Работа с изображением…………………………………………………9
2.6 Распознование расы и пола………………………………………………10
2.7 Работа с интернет…………………………………………………………10
2.8 Разработка удобного интерфейса…………………………………………12
2.9 Классовая структуризация проекта………………………………………13
2.10 Совместимость……………………………………………………………13
3. Описание разработанной программы………………………………………14
3.1 Панель управления программы «MathMask»…………………………14
3.2 Построение «макета» лица ……………………………………………….16
3.3 Расчет всех возможных расстояний на текущем лице…………………17
4. Перспективы дальнейших исследований…………………………….……18
5. Пример работы с программой…………………………………………………19
Вывод………………………………………………………………………………20
Список используемой литературы………………………………………………22
Приложение А…………………………………………………………………….23
Лист
Изм
Лист.
№ Документа
Подпись
Дата
Содержание
2
2
Введение
Измерения показателей – есть ключевая задача любой науки. В каждой отрасли
существуют свои цели, но методы снятия показателей в целом делятся на 2 подхода.
Для физического измерения любого объекта потребуются дополнительные
измерительные приборы, подходящие условия и опыт. Всё это приводит к
увеличению затрат и времени на реализацию, особенно в случае исследований
большого объёма данных. Есть другой подход - автоматизированный. Этот метод
измерения
предполагает
цифровую
обработку
данных,
выполненную
вычислительной программой. Такая программа и есть результат данной курсовой
работы.
3
1. Лист задания
Для достижения поставленной цели в работе в первую очередь потребуется освоить
решение следующих задач:
1) Создать удобный, понятный интерфейс программы, продумать логику работы
пользователя в приложении.
2) Создать ключевые элементы на форме проекта, для работы с изображениями,
таблицами, импортом и экспортом данных.
3) Разработать необходимые алгоритмы обработки полученных данных
4) Внедрить их в проект без ущерба совместимости приложения с разными
версиями операционной системы Windows
5) Позаботиться об интуитивности и эстетичности интерфейса программы.
6) Протестировать полученную программу.
Для достижения поставленных задач, было принято решение разделить проект
между двумя разработчиками. Это позволило ускорить создание проекта, наладить
совместную работу (распределяя по ходу написания те или иные задачи), и, конечно
же, компенсировать недостатки знаний о разного рода необходимых
дополнительных функций, бережно вошедших в проект MathMask, но не
вошедших в стандартную программу обучения студентов специальности КСД.
Ввиду того, что конечный вид программы это совокупность всех её функций,
определим [цифрой] тех, кто будет отвечать за каждую из них:
[1] - Серик Михаил Александрович;
[2] - Гукасян Игорь Меружанович;
[~] – Общее задание (правило);
1. Вывод изображения на экран в рабочую область. [1]
2. Установка точек на изображении мышкой. [1]
3. Внедрение математических алгоритмов для обработки координат установленных
точек. [1]
4. Импорт и экспорт значений в файлы *.xls и *.xlsx . Наличие MS Office не
требуется. [2]
5. Построение предполагаемого макета лица по импортируемым данным. [1]
6. Сохранение рабочей области в файл *.jpg с водяным знаком времени и даты. [2]
7. Расчёт средних арифметических показателей для нескольких лиц, наглядное
отображение результата. [2]
4
8. Измерение отдельных отрезков на рабочей области. [2]
9. Установка сетки на изображение. [1] < [2]
10. Возможность удаления установленных точек, откат действий. [2]
11. Интерактивные подсказки. [1]
12. Работа с изображением: [1]>[2]
 бинаризация (переход к чёрно-белому);
 переход к оттенкам серого;
 негатив;
 добавление шумов: аддитивного, мультипликативного, импульсного;
 возможность изменения яркости и контрастности;
 возможность бинарного распознования границ (метод Жука);
 применение полученных изменений;
13. Распознование расы и пола с наглядным отображением показателей (с
музыкальным сопровождением). [1] > [2]
14. Работа с интернет: [2]
 проверка лицензионного ключа,
 сообщения администратора,
 безопасный офлайн режим.
15. Активация программы и сохранение локальной лицензии. [2]
16. Demo – режим. [2]
17. Разработка удобного интерфейса. [1]<[2]
18. Классовая структуризация проекта. [1]
19. Раздел «Помощь». [2]
20. Гиперссылки на действующие сайты SciMarket.tk и MathMask.tk. [2]
21. Совместимость с Microsoft Windows XP SP2 и выше. [~]
22. Совместимость с .NET FrameWork 2.0* и выше. [~]
* - см. Раздел Совместимость
5
2. ОПИСАНИЕ ПОСТАВЛЕННЫХ ЗАДАЧ
Данная программа позволяет получить требуемый результат (построение макета
лица или определение расы) двумя способами:
- выставление точек вручную;
- загрузить имеющиеся данные из файла.
Общий алгоритм программа выглядит, как показано на Рисунок 2.1:
Начало
--
Ручная работа
Загрузка имеющихся
данных
+
Выставление точек
Обработка полученых
растояний
Построение макета лица
Определение расы
Конец
Рисунок 2.1
6
2.1 Математические алгоритмы для обработки координат точек
После установки точек на изображении, следует преобразовать полученные
значения растояний в пикселах в миллиметры. Для этого используем координаты
«линейки» и вычислим «коеффициент миллиметра» :
Data.cR[f1.zatoch, 16] = (float)Math.Sqrt((f1.cX[f1.zatoch, 34] -f1.cX[f1.zatoch, 33])
* (f1.cX[f1.zatoch, 34] -f1.cX[f1.zatoch, 33]) + (f1.cY[f1.zatoch, 34] f1.cY[f1.zatoch, 33]) * (f1.cY[f1.zatoch, 34] - f1.cY[f1.zatoch, 33]));
f1.coef = Data.cR[f1.zatoch, 16] / 100;
2.2 Импорт и экспорт значений в файлы *.xls и *.xlsx
Для удобства выведения и сохранения результатов составлен алгоритм
экспорта/импорта значений в файлы Excel. Для этого мы добавили ссылку на
библиотеки Excel.
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
А также подключили обработчик Ole для взаимодействия с методами Office.Core
using System.Data.OleDb;
2.3 Построение макета лица
После импорта значений, появляется возможность построения схемы
обработанного лица. Схема строится путём интерполяции крайних точек овала
лица, губ, глаз, зрачков. Полученное изображение является макетом лица
испытуемого.
7
Блок-схема алгоритма построения макета лица (рисунок 2.2):
Начало
Импорт данных для
построения
Построение всех дуг
овала лица
Построение глаз
Построение дуги каймы
нижней губы
Конец
Рисунок 2.2
8
2.4 Сохранение рабочей области
Сохранение картинки является одним из способов извлечения данных из
программы. По нажатию на кнопку «Сохранить картинку» программа делает
скриншот рабочей области, сставит на ней водяной знак и сохраняет в указанную
дирректорию.
Алгоритм работы следующий:
Rectangle r = f1.pictureBox1.RectangleToScreen(f1.pictureBox1.ClientRectangle);
Bitmap b = new Bitmap(r.Width, r.Height);
Graphics g = Graphics.FromImage(b);
g.CopyFromScreen(r.Location, new Point(0, 0), r.Size);
2.5 Работа с изображением
Как упоминалось ранее, программа имеет базовые средства для работы с
изображением, наиболее востребованы следующие:
 уменьшение разрешения исходной фотографии
 преобразование в негатив;
 пороговая бинаризация;
 изменения яркости и контрастности.
9
2.6 Распознование расы и пола
Используя морфологические методы по обработке отрезков, составленные
профессором кафедры Анатомии ДонМУ Зениным О.К., мы получаем
предполагаемую расу и пол исследуемого человека.
Так как вероятность правильности результата на данный момент оставляет
желать лучшего, отображение того самого «вердикта» сопровождается
музыкальным вступлением из мотива «Так судьба стучится в дверь» пятой
симфонии Людвига Ван Бетховена.
Выполнено это с помощью подключения using
System.Media, следующим
образом:
try
{
SoundPlayer player = new SoundPlayer();
player.SoundLocation = "Resources//tadam.wav";
player.Play();
}
catch { }
2.7 Работа с Интернет
Данная программа может стать рентабельным коммерческим продуктом, однако
для достижения этого, потребуется наладить работу по лицензировании и защите
от дизассемблирования на профессиональном уровне. На данный момент,
программа не защищена от дизассемблирования, но имеет возможность
заблокировать свою работу на ПК, где не пройдена продцедура активации.
Активация состоит из нескольких этапов:
1. На специальном созданном интернет-сайте, тайно публикуется
страница с ключами активации различных типов лицензии,
параметрами запуска, информацией об обновлении и сообщениям
администратора.
2. Пользователю предлагается купить ключ доступа на интернет
ресурсе SciMarket.tk, после покупки – ключ будет выслан на email
покупателя.
3. Пользователь, он же – покупатель, запускает программу на своём
компьютере и вставляет код в специальное поле для активации.
10
Далее, программа сверяет введённый ключ с синхронизированным
по сети. При совпадении, программа активирует себя на файловом
уровне и больше не потребует для этого соединения с Интернет.
Необходимость реактивации возникнет после форматированнии
диска C:
В случае, если пользователь не активировал программу, ему будет доступен
только demo-режим, с несколькими функциями.
11
2.8 Разработка удобного интерфейса
При детальном разборе и анализе полученных результатов, было выявлено
большое колличество погрещностей, связанных в основном с установкой точек
на рабочей плоскости. Таким образом, главный интерфейс программы MathMask
был изменён и существенно упрощён:
Рисунок 2.3 Интерфейс MathMask
Главным преимуществом нового дизайна является увеличенная рабочая область,
с соотношением сторон, удовлетворяющему разрешение большинства цифровых
снимков (3648х2736 точек).
12
2.9 Классовая структуризация проекта
После добавления функций для определения расы и пола, улучшения интерфейса
и онлайн акцивации, проект MathMask был преобразован в MathMask 2.0, с
последующим реформированием программных классов. Теперь вся программа
структурно разделена по ассоциативным группам:
Form1.cs – основной класс с интерфейсом главного окна, и глобальным блоком
данных public static class Data
PaintForm.cs – форма, с методами для работы с графикой.
HelpForm.cs – форма, содержащая все разделы «Помощи».
MarkingClass.cs – класс, где находятся все функции для обработки данных с
рабочей области (разметки).
AverageForm.cs – форма, с таблицей средних величин текущего лица
DistanceForm.cs – форма, с таблицами средних величин для нескольких лиц. Так
же содежит методы для формирования выборки для анализа.
LoadForm.cs – форма, с таблицей данных, аналогичной импортируемой из файла.
Существует возможность редактирования ячеек перед импортом.
RecForm.cs – форма, с наглядным представлениям результатов, связанных с
определением пола и расы человека.
2.10 Совместимость
* - Программа MathMask 2.0 теоретически совместима с ОС Windows XP SP2 с
предустановленным .NET FrameWork 2.0, однако стоит заметить, что наличие .NET
FrameWork версии ниже 3.0 может привести к появлению ряда исключений.
Для нормальной работы рекомендуется ПК, где:
 Частота двухядерного процессора выше 2 гГц.
 Опретивная память 2 гб и выше.
 ОС Windows 7 и выше.
 MS Office 2007 и выше.
 Монитор с диагональю более 15 дюймов.
13
3. Описание разработанной программы
В результате роботы была создана компьютерная программа «MathMask»
имеющая удобный интуитивный интерфейс, что дает возможность пользователю
легко и быстро освоится с большинством ее функций. Программа и описание её
возможностей
доступно
в
интернете
по
адресам
www.MathMask.tk,
www.SciMarket.tk. Программа была написана на языке С Sharp [1].
Созданная программа позволяет вводить исследуемое 2-х мерное цифровое
изображение лица в рабочую область в виде компьютерного файла с расширением
.jpg (поддерживается более 20 других форматов изображения). Определять и
настраивать реальный масштаб изучаемого объекта. Измерять расстояния между
заданными точками. Автоматически осуществлять пересчет полученных величин в
реальные размеры. Сохранять изображение с отмеченными на нем расстояниями и
площадями, а также «макетов» лица , с указанием масштаба построения [3].
Интерфейс содержит: командную строку (рисунок 1, 1), панель управления
(рисунок 1, 2), рабочую область (рисунок 1, 3) и область подсказок (рисунок 1, 4).
3.1 Панель управления программы «MathMask»
Рисунок 3.1. Интерфейс программы «MathMask».
14
Панель состоит из 14 элементов:
Рисунок 3.2. Панель управления программы MathMask
Элементы управления по номеру соответственно:
1.
2.
3.
4.
5.
6.
7.
8.
Открыть фото
Убрать фото
Убрать точки
Измерить отрезок
Закончить ввод точек
Включить сетку
Следующее лицо
Удалить
9. Индикатор
номера
текущего лица
10.Зуммирование (Zoom)
11. Построить
12. Импорт из Excel
13. Экспорт в Excel
14. Сохранить картинку
15. Выход
Функции кнопок:
1. Открыть фото – позволяет импортировать готовое цифровое 2-х мерное
изображение лица в виде компьютерного файла и поместить его в рабочей
области (рисунок 1, 3), в качестве фона.
2. Убрать фото – убрать фон рабочей области.
3. Убрать точки – убрать установленные точки на рабочей области.
4. Измерить отрезок - позволяет определить реальную длину произвольно
выбранного в рабочей области отрезка. Необходимо указать 4 точки: 1 и 2
это линейка (для определения масштаба в мм), 3 и 4 – измеряемый отрезок.
5. Закончить ввод точек – используется для внеочередного завершения
процесса установки точек. После нажатия потребуется установить две
точки, соответствующие 10 см.
6. Включить сетку – включает/выключает сетку на рабочей области.
7. Следующее лицо – приступить к установке точек для нового лица.
Требуется для статистического анализа.
8. Удалить – удаляет текущее лицо (установленные значения).
15
9. Индикатор номера текущего лица – показывает номер текущего лица.
Для статистического анализа требуется минимум 2 лица.
10.
Зуммирование (Zooming) – зуммирует изображение. Используется в
качестве лупы.
11.
Построить – построение «макета» лица в специальной области, при
возможности наложения фотографии человека в качестве фона этой области.
Необходимо заранее импортировать значения из файла Excel.
12.
Импорт из Excel –импорт файлов с расширением *.xls или *.xlsx .
13.
Экспорт в Excel –экспорт полученных данных в файл *.xls или *.xlsx.
14.
Сохранить картинку - сохраняет полученное изображение.
15. Выход – выход из программы.
3.2 Построение «макета» лица
Рисунок 3.3. Лицо и его электронный вариант
«Макет» представляет собой цифровую схему лица, построенную
согласно отмеченным пользователем точкам, или в результате ручного
ввода значений отрезков.
16
3.3 Расчет всех возможных расстояний на текущем лице
Рисунок 3.4. Интерфейс окна «Анализ всех возможных значений»
Расчет всех расстояний, по сути, является тем неограниченным
потенциалом, который заложен в первичную программу MathMask.
Потенциалом, который даёт этой программе реальное будущее, ведь она, на
данный момент, представляет собой лишь площадку для измерения. Данные
же, полученные таким путём, можно анализировать для бесконечного
количества задач, определение расы и пола человека – это всего лишь часть
из них.
В программе MathMask предусмотрено несколько вариантов работы с
полученными данными: работа со значениями одного лица, нескольких лиц,
работа со средними значениями в выборке из заданных лиц [4]. Сохранение
текущих результатов для дальнейшего анализа вручную, или этой же
программой, путём импорта значений.
Рисунок 3.5. Окно анализа после добавления в выборку элементов
Рисунок 3.6 Инструментарий окна расчёта расстояний
17
Подробнее по функциям каждой из кнопок:
1. Добавить в выборку – добавляет текущие данные в главном блоке или
левого блока в выборку.
2. Очистить выборку – полная очистка элементов в выборке.
3. Показать выборку – показывает текущий элемент справа окна.
4. <выбор номера элемента выборки для отображения >.
5. Сравнить выборку из N элементов – отображает средние
арифметические значения полей выборки. Например: расстояние 1-2 на
первом лице = 175.03, на втором 182.164, результатом для ячейки 1-2
будет 178.601.
6. Срока выполнения – процесс выполнения расчёта или экспорта данных.
7. Экспорт в Excel соответствующих данных.
8. Закрытие окна анализа.
4. Перспективы дальнейших исследований
Программирование такого рода инструментов не стесняет
разработчиков в плане сфер применения их продукта. Достаточно дописать
несколько строчек алгоритма и программа MathMask превратиться в
MathMask G.A.S. («Gender Analyzer System») для распознавания пола,
MathMask R.A.S. («Race Analyzer System») для распознавания расы. И даже
«Health Analyzer System», скажем, для определения того, как изменилось
состояние лица человека спустя некоторое время, или какие изменения с ним
произошли в результате алкогольного опьянения.
В будущем, после проведения соответствующей доработки, программа
может быть усовершенствована, путем добавления так называемых
«плагинов», обладать интеллектом и самостоятельно искать закономерности
в заданной выборке. Такой подход вызовет необходимость создания
своеобразных «инструкций» для анализа тех или иных объектов. Например,
для определения породы собак («Breed of Dog System» – BDS) или любых
других импровизационных целей, потребуется указать лишь количество
точек и эталонные параметры, записанные в соответствующую
«инструкцию» [2].
Математическая маска будет составлена
автоматически и для любых объектов - c любыми целями, согласно любым
параметрам.
18
5. Пример работы с программой
1. Пользователь Вася, с компьютером , работающим на ОС Windows XP ,
с установленным пакетом MS Office 2003 открывает программу
2. Далее, нажав на соответствующую кнопку, открывает изображение
(большинство форматов картинки поддерживаются).
3. Руководствуясь текстовыми подсказками слева сверху, отмечает на
лице точки. Слева, снизу программы приведен графический вариант
того, в какой области фотографии необходимо установить точку, 31
точку.
4. Понимая, что ввод столь огромного количества точек может забрать у
него кучу драгоценного времени, Вася решает завершить ввод точек:
ради этого, на главном окне программы расположена специальная
кнопка, которая позволяет прекратить ввод точек, но при условии
ввода 32 и 33. Вася нажимает эту кнопку.
5. 32 и 33 точки это линейка, а именно отрезок 10см на ней. Так
программа определит масштаб и попробует рассчитать коэффициент
расстояния ближе к реальным.
6. Пользователь Вася экспортирует полученные данные в файл а.xls и
переписывает его вместе со всей программой пользователю Сява.
7. Пользователь Сява, будучи обладателем современного ПК, имеет на
борту только что установленную Windows 8, без установленного пакета
MS Office. Открытие this.программы у него не вызывает проблем.
8. Пользователь Сява , нажав кнопку “импортировать из Excell” успешно
получает доступ ко всем данным в таблице, а так же возможность
редактирования их.
9. Пользователю Сява теперь доступно нажатие на кнопку «Построить» ,
чем он и воспользовался , построив макет лица, отмеченного точками
пользователем Вася.
10.Пользователь Сява сохраняет макет лица в файл *.jpg пользуясь
специальной кнопкой на панеле инструментов this.программы
11.PROFIT***
***- имея расстояния на лице человека, существует также
возможность определения его различных параметров и типов – пол и
раса только часть из них.
19
Выводы
Разработана компьютерная программа для работы с фотографиями людей, а
именно – вычисления размеров между ключевыми точками на лице человека.
Полученные значения могут быть использованы для определения таких
параметров как: раса человека , пол , возраст, состояния здоровья.
Сокращение времени обработки значительного количества портретных
фотографий при определении пола и расы человека даёт существенное
ускорение в работе с большими массивами данных, а так же даёт
возможность цифрового редактирования изображения, что само по себе
открывает множество разых преимуществ.
Проект предназначен для вычисления размеров между ключевыми точками
на лице человека. Пользователь программы имеет дело с универсальным
приложением, способным не только работать с уже созданным пакетом
научных данных, но и создавать его.
Программа имеет первоначальный вид, т.е. реализованы только
показательные возможности, а именно средства для работы с переменными
данных, расчётными структурами и изображениями, импортом и экспортом
и данных. Для примера приведен простейший алгоритм определения расы
человека, как показатель возможностей данной программы.
При использовании стандартной лицензии, доступны следующие функции:
-построение макета лица в специальной области, при возможности
наложения фотографии человека в качестве фона этой области.
-измерения расстояний между двумя произвольно заданными точками
(линейка)
- экспорт расчётных табличных данных в таблицы Excell
- импорт расчётных табличных данных из таблиц Excell
- построения макета лица по импортированным данным
- сохраниние jpg картинки макета лица
-работа со статистическими данными: расчёт средних по заданной выборке,
автоматический расчёт средних, определение масштаба построения макета в
среде операционной системы пользователя (при учёте разрешения монитора
пользователя)
20
-определение расы и пола человека
- открытие файлов Excell формата *.xls и *.xlsx без обязательного наличия
пакета Microsoft Office
-имеется внятное руководство пользователя для данной программы на
русском языке, с описанием работы ключевых функций программы.
21
Список используемой литературы
1. Методические указания к выполнению курсового проекта по курсу
«Системное программирование»;
2. Википедия [Электронный ресурс]. – Режим доступа к ресурсу:
http://www.wikipedia.com;
3. Библиотека MSDN [Электронный ресурс]. – Режим доступа к ресурсу:
http://www.msdn.com;
4. CodeProject [Электронный ресурс]. – Режим доступа к ресурсу:
http://www.codeproject.com;
5. Stack Overflow [Электронный ресурс]. – Режим доступа к ресурсу:
http:// stackoverflow.com;
6. Обработка изображений и распознование образов [Электронный
ресурс]. – Режим доступа к ресурсу: http://www.sati.archaeology.nsc.ru
7. Методические указания к выполнению курсового проекта по курсу
«Обработка сигналов и изображений»;
22
Приложение A
Класс работы с фото:
public partial class MarkingClass
{
Form1 f1;
[System.Runtime.InteropServices.DllImport
("user32.dll")]
static extern bool
SetCursorPos(int x, int y);
[System.Runtime.InteropServices.DllImport
("user32.dll")]
public static extern void
mouse_event(int dwFlags, int dx, int dy,
int cButtons, int dwExtraInfo);
public const int
MOUSEEVENTF_LEFTDOWN = 0x02;
public const int
MOUSEEVENTF_LEFTUP = 0x04;
int[] x = new int[4];
int[] y = new int[4];
bool FLAG1 = true;
public int numeric, count;
public float coef = 1;
public MouseEvent(Form1 ff)
{
f1 = ff;
}
//Vertical menu
public void ShowVertical(object
sender, EventArgs e)
{
f1.msVertikal.Visible = true;
}
public void HideVertical(object
sender, EventArgs e)
{
f1.msVertikal.Visible =
false;
}
//------------------------public void HideIfNot(object
sender, MouseEventArgs e)
{
if (f1.msVertikal.Visible &&
e.Y > f1.msVertikal.Bottom)
f1.msVertikal.Visible =
false;
if (f1.pAction.Visible &&
(e.X < f1.pAction.Left || e.Y <
f1.pAction.Top || e.X >
f1.pAction.Right))
f1.pAction.Visible =
false;
}
public void
pbFaceMouseMove(object sender,
MouseEventArgs e)
{
if (f1.pAction.Visible &&
(e.X < f1.pAction.Left || e.Y <
f1.pAction.Top || e.X >
f1.pAction.Right))
f1.pAction.Visible =
false;
f1.textBox1.Text =
Convert.ToString(e.X);
f1.textBox2.Text =
Convert.ToString(e.Y);
}
//Panel action
public void
ShowPanelAction(object sender, EventArgs
e)
{
f1.pAction.Visible = true;
}
public void
HidePanelAction(object sender, EventArgs
e)
{
f1.pAction.Visible = false;
}
//-------------------------public void
ChangeCursor2Hand(object sender,
EventArgs e)
{
f1.Cursor = Cursors.Hand;
}
public void
ChangeCursor2Default(object sender,
EventArgs e)
{
f1.Cursor = Cursors.Default;
}
//Кликанье по рылу
string[] podsk = {"Нажмите на
область, на медиальной части лба на
начале волосяного покрова.",
"Нажмите на нижнюю медиальную часть
ментона.",
"Нажмите на дистальный выступ латеральной
части правой скуловой кости.",
23
"Нажмите на дистальный выступ латеральной
части левой скуловой кости.",
"Нажмите на спайку губ правого угла
рта.",
"Нажмите на спайку губ левого угла рта.",
"Нажмите на внутренний угол правого
глаза.",
"Нажмите на внутренний угол левого
глаза.",
public void
pbFaceMouseClick(object sender,
MouseEventArgs e)
{
numeric =
Convert.ToInt16(f1.nudCurrentPoint.Value)
;
if (FLAG1)
{
if (numeric == 24)
MessageBox.Show("Отметьте 10см на
линейке!");
"Нажмите на правую наиболее удаленную
точку крыльев носа.",
if (numeric == 25)
DrawAllLines();
"Нажмите на левую наиболее удаленную
точку крыльев носа.",
if (numeric == 26)
{
"Нажмите на стомин (центр рта).",
f1.graphics1.DrawEllipse(new
Pen(Color.Red, 3), e.X, e.Y, 2, 2);
"Нажмите на кончик носа",
"Нажмите на глабеллу(точка между
бровями).",
f1.graphics1.DrawString(Convert.ToString(
numeric), new Font("Arial", 7), new
SolidBrush(Color.Blue), e.X + 5, e.Y 5);
"Нажмите на точку на корне носа.",
"Нажмите на внешний угол левого глаза.",
"Нажмите на внешний угол правого глаза.",
"Нажмите на наиболее удаленную правую
точку нижнего контура лица, на уровне
красной каймы нижней губы.",
"Нажмите на наиболее удаленную левую
точку нижнего контура лица, на уровне
красной каймы нижней губы.",
"Нажмите на наиболее удаленную правую
точку лба.",
"Нажмите на наиболее удаленную левую
точку лба.",
"Нажмите на наиболее удаленную точку
красной каймы нижней губы.",
"Нажмите на точку расположенную на
пересечении продольного размера лицевой
нормы головы",
"Отметьте
диаметр радужки.",
"Отметьте
диаметр радужки.",
"Отметьте 10см
на линейке",
"Отметьте 10см
на линейке",
"Все точки
успешно установлены."};
f1.graphics1.DrawImage(f1.bitmap1, new
Point(0, 0));
Data.cXFace[f1.zatoch,
(int)f1.nudCurrentPoint.Value - 1] = e.X;
Data.cYFace[f1.zatoch,
(int)f1.nudCurrentPoint.Value - 1] = e.Y;
f1.nudCurrentPoint.Value = 1;
MessageBox.Show("Все
точки успешно установлены.");
Data.cR[f1.zatoch,15]
=
(float)Math.Sqrt((Data.cXFace[f1.zatoch,
24] - Data.cXFace[f1.zatoch, 25]) *
(Data.cXFace[f1.zatoch, 24] Data.cXFace[f1.zatoch, 25]) +
(Data.cYFace[f1.zatoch, 24] Data.cYFace[f1.zatoch, 25]) *
(Data.cYFace[f1.zatoch, 24] Data.cYFace[f1.zatoch, 25]));
coef =
(float)Data.cR[f1.zatoch,15] / 100;
Data.coeficient[f1.zatoch] = coef;
CalkDist(f1.zatoch);
MessageBox.Show("1 мм
= " + Convert.ToString(coef) + " пикселей
\r\n" + "Полученный результат можно
экспортировать в файл Excell (xlsx)");
f1.textBox3.Text =
"Все точки успешно установлены.";
f1.экспортВExcelToolStripMenuItem.Enabled
= true;
1
return;
}
Data.cXFace[f1.zatoch,
(int)f1.nudCurrentPoint.Value - 1] =
e.X;// cX и cY массивы с координатами
введённых нами точек
Data.cYFace[f1.zatoch,
(int)f1.nudCurrentPoint.Value - 1] = e.Y;
- x[2]) * (x[3]-x[2]) + (y[3]-y[2]) *
(y[3]-y[2]))) / rule) + " см");
f1.graphics1.Clear(Color.Transparent);
FLAG1 = true;
count = 0;
}
}
}
f1.progressBar1.PerformStep();
f1.nudCurrentPoint.Value++;
numeric =
Convert.ToInt16(f1.nudCurrentPoint.Value)
;
podskazka(numeric);
if (numeric > 1)
f1.bDelCurPoint.Enabled = true;
else
f1.bDelCurPoint.Enabled = false;
f1.graphics1.DrawEllipse(new
Pen(Color.Red, 3), e.X, e.Y, 2, 2);
f1.graphics1.DrawString(Convert.ToString(
numeric - 1), new Font("Arial", 7), new
SolidBrush(Color.Blue), e.X + 5, e.Y 5);
f1.graphics1.DrawImage(f1.bitmap1, new
Point(0, 0));
}
else
{
x[count] = e.X;
y[count] = e.Y;
f1.graphics1.DrawEllipse(new
Pen(Color.Red, 3), e.X, e.Y, 2, 2);
f1.graphics1.DrawString(Convert.ToString(
count + 1), new Font("Arial", 7), new
SolidBrush(Color.Blue), e.X + 5, e.Y 5);
f1.graphics1.DrawImage(f1.bitmap1, new
Point(0, 0));
count++;
if (count == 4)
{
float rule;
rule =
(float)Math.Sqrt((x[1] - x[0]) * (x[1] x[0]) + (y[1] - y[0]) * (y[1] - y[0])) /
10;
MessageBox.Show("Результат:\n1 мм= " +
rule + " пикселей \nДлина отрезка [3-4]="
+
Convert.ToString((float)(Math.Sqrt((x[3]
public void DrawAllLines()
{
float d =
(float)Math.Sqrt((Data.cXFace[f1.zatoch,
23] - Data.cXFace[f1.zatoch, 22]) *
(Data.cXFace[f1.zatoch, 23] Data.cXFace[f1.zatoch, 22]) +
(Data.cYFace[f1.zatoch, 23] Data.cYFace[f1.zatoch, 22]) *
(Data.cYFace[f1.zatoch, 23] Data.cYFace[f1.zatoch, 22]));
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
0], Data.cYFace[f1.zatoch, 0],
Data.cXFace[f1.zatoch, 1],
Data.cYFace[f1.zatoch, 1]);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
2], Data.cYFace[f1.zatoch, 2],
Data.cXFace[f1.zatoch, 3],
Data.cYFace[f1.zatoch, 3]);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
4], Data.cYFace[f1.zatoch, 4],
Data.cXFace[f1.zatoch, 5],
Data.cYFace[f1.zatoch, 5]);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
6], Data.cYFace[f1.zatoch, 6],
Data.cXFace[f1.zatoch, 7],
Data.cYFace[f1.zatoch, 7]);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
8], Data.cYFace[f1.zatoch, 8],
Data.cXFace[f1.zatoch, 9],
Data.cYFace[f1.zatoch, 9]);
f1.graphics1.DrawLine(new
Pen(Color.Black), (Data.cXFace[f1.zatoch,
7] - Data.cXFace[f1.zatoch, 6]) / 2 +
Data.cXFace[f1.zatoch, 6],
Data.cYFace[f1.zatoch, 6],
Data.cXFace[f1.zatoch, 8],
Data.cYFace[f1.zatoch, 8]);
f1.graphics1.DrawLine(new
Pen(Color.Black), (Data.cXFace[f1.zatoch,
7] - Data.cXFace[f1.zatoch, 6]) / 2 +
Data.cXFace[f1.zatoch, 6],
Data.cYFace[f1.zatoch, 6],
Data.cXFace[f1.zatoch, 9],
Data.cYFace[f1.zatoch, 9]);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
16], Data.cYFace[f1.zatoch, 16],
2
Data.cXFace[f1.zatoch, 17],
Data.cYFace[f1.zatoch, 17]);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
18], Data.cYFace[f1.zatoch, 18],
Data.cXFace[f1.zatoch, 19],
Data.cYFace[f1.zatoch, 19]);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
7], Data.cYFace[f1.zatoch, 7],
Data.cXFace[f1.zatoch, 14],
Data.cYFace[f1.zatoch, 14]);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
6], Data.cYFace[f1.zatoch, 6],
Data.cXFace[f1.zatoch, 15],
Data.cYFace[f1.zatoch, 15]);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
14], Data.cYFace[f1.zatoch, 14],
(Data.cXFace[f1.zatoch, 14] Data.cXFace[f1.zatoch, 7]) / 2 +
Data.cXFace[f1.zatoch, 7],
Data.cYFace[f1.zatoch, 7] - d / 2 - 2);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
7], Data.cYFace[f1.zatoch, 7],
(Data.cXFace[f1.zatoch, 14] Data.cXFace[f1.zatoch, 7]) / 2 +
Data.cXFace[f1.zatoch, 7],
Data.cYFace[f1.zatoch, 7] - d / 2 - 2);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
14], Data.cYFace[f1.zatoch, 14],
(Data.cXFace[f1.zatoch, 14] Data.cXFace[f1.zatoch, 7]) / 2 +
Data.cXFace[f1.zatoch, 7],
Data.cYFace[f1.zatoch, 7] - d / 2 - 2 +
d);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
7], Data.cYFace[f1.zatoch, 7],
(Data.cXFace[f1.zatoch, 14] Data.cXFace[f1.zatoch, 7]) / 2 +
Data.cXFace[f1.zatoch, 7],
Data.cYFace[f1.zatoch, 7] - d / 2 - 2 +
d);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
15], Data.cYFace[f1.zatoch, 15],
(Data.cXFace[f1.zatoch, 6] Data.cXFace[f1.zatoch, 15]) / 2 +
Data.cXFace[f1.zatoch, 15],
Data.cYFace[f1.zatoch, 7] - d / 2 - 2);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
6], Data.cYFace[f1.zatoch, 6],
(Data.cXFace[f1.zatoch, 6] Data.cXFace[f1.zatoch, 15]) / 2 +
Data.cXFace[f1.zatoch, 15],
Data.cYFace[f1.zatoch, 7] - d / 2 - 2);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
15], Data.cYFace[f1.zatoch, 15],
(Data.cXFace[f1.zatoch, 6] Data.cXFace[f1.zatoch, 15]) / 2 +
Data.cXFace[f1.zatoch, 15],
Data.cYFace[f1.zatoch, 7] - d / 2 - 2 +
d);
f1.graphics1.DrawLine(new
Pen(Color.Black), Data.cXFace[f1.zatoch,
6], Data.cYFace[f1.zatoch, 6],
(Data.cXFace[f1.zatoch, 6] Data.cXFace[f1.zatoch, 15]) / 2 +
Data.cXFace[f1.zatoch, 15],
Data.cYFace[f1.zatoch, 7] - d / 2 - 2 +
d);
f1.graphics1.DrawEllipse(new
Pen(Color.Black), (Data.cXFace[f1.zatoch,
6] - Data.cXFace[f1.zatoch, 15]) / 2 +
Data.cXFace[f1.zatoch, 15] - d / 2,
Data.cYFace[f1.zatoch, 6] - d / 2, d, d);
f1.graphics1.DrawEllipse(new
Pen(Color.Black), (Data.cXFace[f1.zatoch,
14] - Data.cXFace[f1.zatoch, 7]) / 2 +
Data.cXFace[f1.zatoch, 7] - d / 2,
Data.cYFace[f1.zatoch, 7] - d / 2, d, d);
}
public void CalkDist(int kol)
{
Data.cR2[0] =
((float)Math.Sqrt((Data.cXFace[kol,1] Data.cXFace[kol,0]) * (Data.cXFace[kol,1]
- Data.cXFace[kol,0]) +
(Data.cYFace[kol,1] - Data.cYFace[kol,0])
* (Data.cYFace[kol,1] Data.cYFace[kol,0]))) /
Data.coeficient[kol];
Data.cR2[1] =
((float)Math.Sqrt((Data.cXFace[kol, 3] Data.cXFace[kol, 2]) * (Data.cXFace[kol,
3] - Data.cXFace[kol, 2]) +
(Data.cYFace[kol, 3] - Data.cYFace[kol,
2]) * (Data.cYFace[kol, 3] Data.cYFace[kol, 2]))) /
Data.coeficient[kol];
Data.cR2[2] =
((float)Math.Sqrt((Data.cXFace[kol, 5] Data.cXFace[kol, 4]) * (Data.cXFace[kol,
5] - Data.cXFace[kol, 4]) +
(Data.cYFace[kol, 5] - Data.cYFace[kol,
4]) * (Data.cYFace[kol, 5] Data.cYFace[kol, 4]))) /
Data.coeficient[kol];
Data.cR2[3] =
((float)Math.Sqrt((Data.cXFace[kol, 7] Data.cXFace[kol, 6]) * (Data.cXFace[kol,
7] - Data.cXFace[kol, 6]) +
(Data.cYFace[kol, 7] - Data.cYFace[kol,
6]) * (Data.cYFace[kol, 7] Data.cYFace[kol, 6]))) /
Data.coeficient[kol];
Data.cR2[4] =
((float)Math.Sqrt((Data.cXFace[kol, 9] Data.cXFace[kol, 8]) * (Data.cXFace[kol,
9] - Data.cXFace[kol, 8]) +
3
(Data.cYFace[kol, 9] - Data.cYFace[kol,
8]) * (Data.cYFace[kol, 9] Data.cYFace[kol, 8]))) /
Data.coeficient[kol];
Data.cR2[5] =
((float)Math.Sqrt((Data.cXFace[kol, 10] Data.cXFace[kol, 1]) * (Data.cXFace[kol,
10] - Data.cXFace[kol, 1]) +
(Data.cYFace[kol, 10] - Data.cYFace[kol,
1]) * (Data.cYFace[kol, 10] Data.cYFace[kol, 1]))) /
Data.coeficient[kol];
Data.cR2[6] =
((float)Math.Sqrt((Data.cXFace[kol, 13] Data.cXFace[kol, 12]) * (Data.cXFace[kol,
13] - Data.cXFace[kol, 12]) +
(Data.cYFace[kol, 13] - Data.cYFace[kol,
12]) * (Data.cYFace[kol, 13] Data.cYFace[kol, 12]))) /
Data.coeficient[kol];
Data.cR2[7] =
((float)Math.Sqrt((Data.cXFace[kol, 11] Data.cXFace[kol, 10]) * (Data.cXFace[kol,
11] - Data.cXFace[kol, 10]) +
(Data.cYFace[kol, 11] - Data.cYFace[kol,
10]) * (Data.cYFace[kol, 11] Data.cYFace[kol, 10]))) /
Data.coeficient[kol];
Data.cR2[8] =
((float)Math.Sqrt((Data.cXFace[kol, 14] Data.cXFace[kol, 7]) * (Data.cXFace[kol,
14] - Data.cXFace[kol, 7]) +
(Data.cYFace[kol, 14] - Data.cYFace[kol,
7]) * (Data.cYFace[kol, 14] Data.cYFace[kol, 7]))) /
Data.coeficient[kol];
Data.cR2[9] =
((float)Math.Sqrt((Data.cXFace[kol, 17] Data.cXFace[kol, 16]) * (Data.cXFace[kol,
17] - Data.cXFace[kol, 16]) +
(Data.cYFace[kol, 17] - Data.cYFace[kol,
16]) * (Data.cYFace[kol, 17] Data.cYFace[kol, 16]))) /
Data.coeficient[kol];
Data.cR2[10] =
((float)Math.Sqrt((Data.cXFace[kol, 19] Data.cXFace[kol, 18]) * (Data.cXFace[kol,
19] - Data.cXFace[kol, 18]) +
(Data.cYFace[kol, 19] - Data.cYFace[kol,
18]) * (Data.cYFace[kol, 19] Data.cYFace[kol, 18]))) /
Data.coeficient[kol];
Data.cR2[11] =
((float)Math.Sqrt((Data.cXFace[kol, 20] Data.cXFace[kol, 10]) * (Data.cXFace[kol,
20] - Data.cXFace[kol, 10]) +
(Data.cYFace[kol, 20] - Data.cYFace[kol,
10]) * (Data.cYFace[kol, 20] Data.cYFace[kol, 10]))) /
Data.coeficient[kol];
Data.cR2[12] =
((float)Math.Sqrt((Data.cXFace[kol, 21] Data.cXFace[kol, 10]) * (Data.cXFace[kol,
21] - Data.cXFace[kol, 10]) +
(Data.cYFace[kol, 21] - Data.cYFace[kol,
10]) * (Data.cYFace[kol, 21] Data.cYFace[kol, 10]))) /
Data.coeficient[kol];
Data.cR2[13] =
((float)Math.Sqrt((Data.cXFace[kol, 13] Data.cXFace[kol, 11]) * (Data.cXFace[kol,
11] - Data.cXFace[kol, 13]) +
(Data.cYFace[kol, 11] - Data.cYFace[kol,
13]) * (Data.cYFace[kol, 11] Data.cYFace[kol, 13]))) /
Data.coeficient[kol];
Data.cR2[14] =
((float)Math.Sqrt((Data.cXFace[kol, 23] Data.cXFace[kol, 22]) * (Data.cXFace[kol,
23] - Data.cXFace[kol, 22]) +
(Data.cYFace[kol, 23] - Data.cYFace[kol,
22]) * (Data.cYFace[kol, 23] Data.cYFace[kol, 22]))) /
Data.coeficient[kol];
Data.cR2[15] =
(float)Data.coeficient[kol];
f1.экспортВExcelToolStripMenuItem.Enabled
= true;
}
int[] x1 = { 84, 84, 51, 122, 70
, 96, 75, 94, 75, 93, 84, 84, 84, 84,
112, 57, 57, 111, 55, 116, 85, 84, 99,
108, 0, 0 };
int[] y1 = { 41, 175, 111, 111,
144, 144, 100, 100, 125, 125, 145, 127,
83, 97, 95, 95, 155, 155, 63, 63, 154,
108, 99, 97, 0, 0 };
int[] x2 = { 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 1, 1};
int[] y2 = { 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 1, 1 };
public void podskazka(int f)
{
f1.graphics2.Clear(Color.Transparent);
f1.textBox3.Text =
Convert.ToString(f) + "." + podsk[f - 1];
f1.nudCurrentPoint.Value = f;
f1.graphics2.DrawEllipse(new
Pen(Color.Red, 2), x1[f-1], y1[f-1],
x2[f-1], y2[f-1]);
}
public void
DelCurrentPoint(object sender, EventArgs
e)
{
f1.nudCurrentPoint.Value--;
f1.graphics1.DrawString("XX",
new Font("Arial", 9), new
SolidBrush(Color.Blue),
Data.cXFace[f1.zatoch,
Convert.ToInt32(f1.nudCurrentPoint.Value
- 1)], Data.cYFace[f1.zatoch,
4
Convert.ToInt32(f1.nudCurrentPoint.Value
- 1)]-5);
MessageBox.Show("Установите
заново " + f1.nudCurrentPoint.Value + "
точку");
if (f1.nudCurrentPoint.Value
== 1) { Data.cXFace[f1.zatoch,
Convert.ToInt32(f1.nudCurrentPoint.Value
- 1)] = 0; f1.bDelCurPoint.Enabled =
false; }
}
f1.label12.Hide();
f1.textBox3.Text = "";
f1.nudCurrentPoint.Value = 1;
f1.numericUpDown1.Value = 10;
f1.progressBar1.Value = 0;
f1.zatoch++;
f1.nudCurrentFace.Value++;
f1.button12.Enabled = true;
Data.grid = 1;
Grid(sender, e);
podskazka(1);
}
public void DelAllPoints(object
sender, EventArgs e)
{
f1.graphics1.Clear(Color.Transparent);
f1.numericUpDown1.Hide();
f1.label12.Hide();
f1.textBox3.Text = "";
f1.nudCurrentPoint.Value = 1;
f1.numericUpDown1.Value = 10;
f1.progressBar1.Value = 0;
Data.grid = 1;
Grid(sender ,e);
for(int j = 0;j < 22;j++)
{ Data.cXFace[f1.zatoch, j] =
0; Data.cYFace[f1.zatoch, j] = 0; }
podskazka(1);
}
public void FaceChanged(object
sender, EventArgs e)
{
f1.zatoch =
(int)f1.nudCurrentFace.Value - 1;
f1.graphics1.Clear(Color.Transparent);
f1.numericUpDown1.Hide();
f1.label12.Hide();
f1.textBox3.Text = "";
f1.nudCurrentPoint.Value = 1;
f1.numericUpDown1.Value = 10;
f1.progressBar1.Value = 0;
Data.grid = 1;
Grid(sender, e);
podskazka(1);
}
public void Liniar(object sender,
EventArgs e)
{
FLAG1 = false;
count = 0;
MessageBox.Show("
Режим измерения отрезка\n\nОтметьте 4
точки:\nОтрезок [1-2] это значение 10 см
(линейка)\nОтрезок [3-4] это измеряемый
отрезок");
}
public static void
LeftMouseClick(int xpos, int ypos)
{
SetCursorPos(xpos, ypos);
public void EndEnterPoint(object
sender, EventArgs e)
{
DrawAllLines();
CalkDist(f1.zatoch);
if (Data.cR2[0] <
Data.cR2[3]) MessageBox.Show("Точки
установлены некорректно");
MessageBox.Show("Теперь
отметьте 10 см на линейке.");
f1.nudCurrentPoint.Value =
25;
f1.progressBar1.Value = 24;
}
//-------------------------------
public void Grid(object sender,
EventArgs e)
{
if (Data.grid == 1)
{
Data.grid = 0;
public void NextFace(object
sender, EventArgs e)
{
f1.graphics1.Clear(Color.Transparent);
f1.numericUpDown1.Hide();
mouse_event(MOUSEEVENTF_LEFTDOWN, xpos,
ypos, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, xpos,
ypos, 0, 0);
}
f1.bGrid.Text =
"Выключить сетку";
//graphics1.Clear(Color.Transparent);
Pen gridPen = new
Pen(Color.LightGray, 1);
int dist =
f1.pbFace.Height / 5;
for (int i = 0; i <
f1.pbFace.Height; i += 40)
{
f1.graphics1.DrawLine(gridPen, 0, i,
f1.pbFace.Width, i);
5
f1.graphics1.DrawLine(gridPen, i, 0, i,
f1.pbFace.Height);
}
for (int i = 0; i <
f1.pbFace.Width; i += 40)
{
f1.graphics1.DrawLine(gridPen, i, 0, i,
f1.pbFace.Height);
}
}
else
{
f1.graphics1.Clear(Color.Transparent);
Data.grid = 1;
f1.bGrid.Text = "Включить
сетку";
//numericUpDown2.Value =
1;
Point location =
f1.pbFace.PointToClient(Point.Empty);
Point location2 =
f1.PointToClient(Point.Empty);
Point location3 =
f1.bGrid.PointToClient(Point.Empty);
for (int i = 0; i <
Data.cXFace.GetLength(1) - 1; i++)
{
if
(Data.cXFace[f1.zatoch, i] != 0)
LeftMouseClick((location.X - location2.X)
* (- 1) + Data.cXFace[f1.zatoch, i],
(location.Y - location2.Y) * (-1) +
f1.msMain.Height - 2 +
Data.cYFace[f1.zatoch, i]);
}
SetCursorPos((location3.X
- location2.X) * (-1) + 40, (location3.Y
- location2.X) * (-1) + 40);
}
}
}
6
x2[3] = 10;
y2[3] = f1.pbFace.Width / 2;
Класс построения лица:
N = x2[0]; N1 = x2[0]; rez1 =
public partial class Graphing
{
Form1 f1;
public Graphing(Form1 ff)
{
f1 = ff;
}
double[] x1 = new double[3];
double[] y1 = new double[3];
double[] L1 = new double[3];
double[] D1 = new double[3];
double[,] matr1 = new
double[3, 3];
double[] x2 = new double[5];
double[] y2 = new double[5];
double[] L2 = new double[5];
double[] D2 = new double[5];
double[,] matr2 = new
double[5, 5];
double P, rez, rez1, N, N1;
int i, j;
y2[0];
while (N < x2[2] - 1)
{
N = N + 5;
for (i = 0; i < 3; i++)
if (N == x2[i])
N = N + 1;
P = 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
j++)
{
if (i == j)
{
matr2[i, j] =
N - x2[i];
P = P *
matr2[i, j];
}
else
matr2[i, j] =
x2[i] - x2[j];
public void BuildGraph(object
sender, EventArgs e)
{
f1.numericUpDown1.Show();
//numericUpDown1.Value = 10;
f1.label12.Show();
DrawRightCheekbone(sender,
e);
DrawLeftCheekbone(sender, e);
DrawTop(sender, e);
DrawBottom(sender, e);
DrawEyes(sender, e);
DrawNose(sender, e);
DrawMouth(sender, e);
}
private void
DrawRightCheekbone(object sender,
EventArgs e)
{
x2[4] = Data.cR2[0] *
Data.cR2[15] + 10;
y2[4] = f1.pbFace.Width / 2;
x2[2] = (Data.cR2[0] Data.cR2[5] + Data.cR2[11]) *
Data.cR2[15] + 10;
y2[2] = f1.pbFace.Width / 2 ((Data.cR2[9]) / 2) * Data.cR2[15];
x2[1] = (Data.cR2[0] Data.cR2[5] - Data.cR2[12]) *
Data.cR2[15] + 10;
y2[1] = f1.pbFace.Width / 2 ((Data.cR2[1]) / 2) * Data.cR2[15];
x2[0] = ((Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
/ 2) * Data.cR2[15] + 10;
y2[0] = f1.pbFace.Width / 2 ((Data.cR2[10]) / 2) * Data.cR2[15];
}
for (i = 0; i < 3; i++)
D2[i] = 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
j++)
D2[i] = D2[i] *
matr2[i, j];
for (i = 0; i < 3; i++)
L2[i] = P / D2[i];
rez = 0;
for (i = 0; i < 3; i++)
rez = rez + y2[i] *
L2[i];
f1.graphics1.DrawLine(new
Pen(Color.Black, 2),
Convert.ToInt32(rez1),
Convert.ToInt32(N1),
Convert.ToInt32(rez),
Convert.ToInt32(N));
N1 = N; rez1 = rez;
}
}
private void DrawLeftCheekbone(object
sender, EventArgs e)
{
// x2[4] = Data.cR2[0] *
Data.cR2[15] + 10;
// y2[4] = f1.pbFace.Width /
2;
x2[2] = (Data.cR2[0] Data.cR2[5] + Data.cR2[11]) *
Data.cR2[15] + 10;
7
y2[2] = f1.pbFace.Width / 2 +
((Data.cR2[9]) / 2) * Data.cR2[15];
x2[1] = (Data.cR2[0] Data.cR2[5] - Data.cR2[12]) *
Data.cR2[15] + 10;
y2[1] = f1.pbFace.Width / 2 +
((Data.cR2[1]) / 2) * Data.cR2[15];
x2[0] = ((Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
/ 2) * Data.cR2[15] + 10;
y2[0] = f1.pbFace.Width / 2 +
((Data.cR2[10]) / 2) * Data.cR2[15];
// x2[0] = 10;
// y2[0] = f1.pbFace.Width /
2;
N = x2[0]; N1 = x2[0]; rez1 =
y2[0];
while (N < x2[2])
{
N = N + 1;
for (i = 0; i < 3; i++)
if (N == x2[i])
N = N + 1;
P = 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
j++)
{
if (i == j)
{
matr2[i, j] =
N - x2[i];
P = P *
matr2[i, j];
}
else
matr2[i, j] =
Convert.ToInt32(rez),
Convert.ToInt32(N));
// else
f1.graphics1.DrawLine(new
Pen(Color.Black, 2),
Convert.ToInt32(rez1),
Convert.ToInt32(N1),
Convert.ToInt32(rez),
Convert.ToInt32(N));
N1 = N; rez1 = rez;
}
}
private void DrawTop(object
sender, EventArgs e)
{
x1[0] = f1.pbFace.Width / 2 ((Data.cR2[10]) / 2) * Data.cR2[15];
y1[0] = ((Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
/ 2) * Data.cR2[15] + 10;
x1[1] = f1.pbFace.Width / 2;
y1[1] = 10;
x1[2] = f1.pbFace.Width / 2 +
((Data.cR2[10]) / 2) * Data.cR2[15];
y1[2] = ((Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
/ 2) * Data.cR2[15] + 10;
N = x1[0]; N1 = x1[0]; rez1 =
y1[0];
while (N < x1[2])
{
N = N + 1;
for (i = 0; i < 3; i++)
if (N == x1[i])
N = N + 1;
P = 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
x2[i] - x2[j];
}
j++)
for (i = 0; i < 3; i++)
D2[i] = 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
{
if (i == j)
{
matr1[i, j] =
N - x1[i];
j++)
P = P *
D2[i] = D2[i] *
matr1[i, j];
matr2[i, j];
for (i = 0; i < 3; i++)
L2[i] = P / D2[i];
}
else
matr1[i, j] =
x1[i] - x1[j];
}
rez = 0;
for (i = 0; i < 3; i++)
rez = rez + y2[i] *
for (i = 0; i < 3; i++)
D1[i] = 1;
// if ((N < x2[1]) || (N
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
L2[i];
> x2[3] + 2))
//
f1.graphics1.DrawLine(new
Pen(Color.White, 2),
Convert.ToInt32(rez1),
Convert.ToInt32(N1),
j++)
D1[i] = D1[i] *
matr1[i, j];
for (i = 0; i < 3; i++)
L1[i] = P / D1[i];
8
rez = 0;
for (i = 0; i < 3; i++)
rez = rez + y1[i] *
for (i = 0; i < 3; i++)
L1[i] = P / D1[i];
L1[i];
f1.graphics1.DrawLine(new
Pen(Color.Black, 2), Convert.ToInt32(N1),
Convert.ToInt32(rez1),
Convert.ToInt32(N),
Convert.ToInt32(rez));
N1 = N; rez1 = rez;
}
}
private void DrawBottom(object
sender, EventArgs e)
{
x1[0] = f1.pbFace.Width / 2 ((Data.cR2[9]) / 2) * Data.cR2[15];
y1[0] = (Data.cR2[0] Data.cR2[5] + Data.cR2[11]) *
Data.cR2[15] + 10;
x1[1] = f1.pbFace.Width / 2;
y1[1] = Data.cR2[0] *
Data.cR2[15] + 10;
x1[2] = f1.pbFace.Width / 2 +
((Data.cR2[9]) / 2) * Data.cR2[15];
y1[2] = (Data.cR2[0] Data.cR2[5] + Data.cR2[11]) *
Data.cR2[15] + 10;
N = x1[0]; N1 = x1[0]; rez1 =
y1[0];
while (N < x1[2] - 1)
{
N = N + 1;
for (i = 0; i < 3; i++)
if (N == x1[i])
N = N + 1;
P = 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
j++)
{
if (i == j)
{
matr1[i, j] =
N - x1[i];
P = P *
matr1[i, j];
}
else
matr1[i, j] =
x1[i] - x1[j];
}
for (i = 0; i < 3; i++)
D1[i] = 1;
rez = 0;
for (i = 0; i < 3; i++)
rez = rez + y1[i] *
L1[i];
f1.graphics1.DrawLine(new
Pen(Color.Black, 2), Convert.ToInt32(N1),
Convert.ToInt32(rez1),
Convert.ToInt32(N),
Convert.ToInt32(rez));
N1 = N; rez1 = rez;
}
}
private void DrawEyes(object sender,
EventArgs e)
{
f1.graphics1.DrawEllipse(new
Pen(Color.Black), f1.pbFace.Width / 2 +
Convert.ToInt16((Data.cR2[3] / 2 +
Data.cR2[8] / 2 - Data.cR2[14] / 2) *
Data.cR2[15]),
Convert.ToInt16((Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13]
- Data.cR2[14] / 2) * Data.cR2[15]) + 10,
Convert.ToInt16(Data.cR2[14] *
Data.cR2[15]),
Convert.ToInt16(Data.cR2[14] *
Data.cR2[15]));
x1[0] = f1.pbFace.Width / 2 +
(Data.cR2[3]) / 2 * Data.cR2[15];
y1[0] = (Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
* Data.cR2[15] + 10;
x1[1] = f1.pbFace.Width / 2 +
(Data.cR2[3] / 2 + Data.cR2[8] / 2) *
Data.cR2[15];
y1[1] = (Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13]
- Data.cR2[14] / 2) * Data.cR2[15] + 10;
x1[2] = f1.pbFace.Width / 2 +
(Data.cR2[3] / 2 + Data.cR2[8]) *
Data.cR2[15];
y1[2] = (Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
* Data.cR2[15] + 10;
N = x1[0]; N1 = x1[0]; rez1 =
y1[0];
while (N < x1[2] - 1)
{
N = N + 1;
for (i = 0; i < 3; i++)
if (N == x1[i])
N = N + 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
P = 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
j++)
D1[i] = D1[i] *
matr1[i, j];
j++)
{
9
if (i == j)
{
matr1[i, j] =
for (j = 0; j < 3;
j++)
{
N - x1[i];
if (i == j)
{
matr1[i, j] =
P = P *
matr1[i, j];
}
else
matr1[i, j] =
N - x1[i];
P = P *
matr1[i, j];
x1[i] - x1[j];
}
else
matr1[i, j] =
}
for (i = 0; i < 3; i++)
D1[i] = 1;
x1[i] - x1[j];
}
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
for (i = 0; i < 3; i++)
D1[i] = 1;
D1[i] = D1[i] *
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
j++)
matr1[i, j];
j++)
for (i = 0; i < 3; i++)
L1[i] = P / D1[i];
D1[i] = D1[i] *
matr1[i, j];
rez = 0;
for (i = 0; i < 3; i++)
rez = rez + y1[i] *
for (i = 0; i < 3; i++)
L1[i] = P / D1[i];
L1[i];
f1.graphics1.DrawLine(new
Pen(Color.Black), Convert.ToInt32(N1),
Convert.ToInt32(rez1),
Convert.ToInt32(N),
Convert.ToInt32(rez));
N1 = N; rez1 = rez;
}
x1[0] = f1.pbFace.Width / 2 +
(Data.cR2[3]) / 2 * Data.cR2[15];
y1[0] = (Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
* Data.cR2[15] + 10;
x1[1] = f1.pbFace.Width / 2 +
(Data.cR2[3] / 2 + Data.cR2[8] / 2) *
Data.cR2[15];
y1[1] = (Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13]
+ Data.cR2[14] / 2) * Data.cR2[15] + 10;
x1[2] = f1.pbFace.Width / 2 +
(Data.cR2[3] / 2 + Data.cR2[8]) *
Data.cR2[15];
y1[2] = (Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
* Data.cR2[15] + 10;
N = x1[0]; N1 = x1[0]; rez1 =
y1[0];
while (N < x1[2] - 1)
{
N = N + 1;
for (i = 0; i < 3; i++)
if (N == x1[i])
N = N + 1;
P = 1;
for (i = 0; i < 3; i++)
rez = 0;
for (i = 0; i < 3; i++)
rez = rez + y1[i] *
L1[i];
f1.graphics1.DrawLine(new
Pen(Color.Black), Convert.ToInt32(N1),
Convert.ToInt32(rez1),
Convert.ToInt32(N),
Convert.ToInt32(rez));
N1 = N; rez1 = rez;
}
f1.graphics1.DrawEllipse(new
Pen(Color.Black), f1.pbFace.Width / 2 Convert.ToInt16((Data.cR2[3] / 2 +
Data.cR2[8] / 2 + Data.cR2[14] / 2) *
Data.cR2[15]),
Convert.ToInt16((Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13]
- Data.cR2[14] / 2) * Data.cR2[15]) + 10,
Convert.ToInt16(Data.cR2[14] *
Data.cR2[15]),
Convert.ToInt16(Data.cR2[14] *
Data.cR2[15]));
x1[2] = f1.pbFace.Width / 2 (Data.cR2[3]) / 2 * Data.cR2[15];
y1[2] = (Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
* Data.cR2[15] + 10;
x1[1] = f1.pbFace.Width / 2 (Data.cR2[3] / 2 + Data.cR2[8] / 2) *
Data.cR2[15];
y1[1] = (Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13]
- Data.cR2[14] / 2) * Data.cR2[15] + 10;
10
x1[0] = f1.pbFace.Width / 2 (Data.cR2[3] / 2 + Data.cR2[8]) *
Data.cR2[15];
y1[0] = (Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
* Data.cR2[15] + 10;
N = x1[0]; N1 = x1[0]; rez1 =
y1[0];
while (N < x1[2] - 1)
{
N = N + 1;
for (i = 0; i < 3; i++)
if (N == x1[i])
N = N + 1;
P = 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
y1[1] = (Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13]
+ Data.cR2[14] / 2) * Data.cR2[15] + 10;
x1[0] = f1.pbFace.Width / 2 (Data.cR2[3] / 2 + Data.cR2[8]) *
Data.cR2[15];
y1[0] = (Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
* Data.cR2[15] + 10;
N = x1[0]; N1 = x1[0]; rez1 =
y1[0];
while (N < x1[2] - 1)
{
N = N + 1;
for (i = 0; i < 3; i++)
if (N == x1[i])
N = N + 1;
j++)
P = 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
{
if (i == j)
{
matr1[i, j] =
j++)
{
N - x1[i];
if (i == j)
{
matr1[i, j] =
P = P *
matr1[i, j];
}
else
matr1[i, j] =
N - x1[i];
P = P *
matr1[i, j];
x1[i] - x1[j];
}
else
matr1[i, j] =
}
for (i = 0; i < 3; i++)
D1[i] = 1;
x1[i] - x1[j];
}
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
for (i = 0; i < 3; i++)
D1[i] = 1;
D1[i] = D1[i] *
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
j++)
matr1[i, j];
j++)
for (i = 0; i < 3; i++)
L1[i] = P / D1[i];
D1[i] = D1[i] *
matr1[i, j];
rez = 0;
for (i = 0; i < 3; i++)
rez = rez + y1[i] *
for (i = 0; i < 3; i++)
L1[i] = P / D1[i];
L1[i];
f1.graphics1.DrawLine(new
Pen(Color.Black), Convert.ToInt32(N1),
Convert.ToInt32(rez1),
Convert.ToInt32(N),
Convert.ToInt32(rez));
N1 = N; rez1 = rez;
}
x1[2] = f1.pbFace.Width / 2 (Data.cR2[3]) / 2 * Data.cR2[15];
y1[2] = (Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
* Data.cR2[15] + 10;
x1[1] = f1.pbFace.Width / 2 (Data.cR2[3] / 2 + Data.cR2[8] / 2) *
Data.cR2[15];
rez = 0;
for (i = 0; i < 3; i++)
rez = rez + y1[i] *
L1[i];
f1.graphics1.DrawLine(new
Pen(Color.Black), Convert.ToInt32(N1),
Convert.ToInt32(rez1),
Convert.ToInt32(N),
Convert.ToInt32(rez));
N1 = N; rez1 = rez;
}
}
private void DrawNose(object
sender, EventArgs e)
{
11
f1.graphics1.DrawLine(new
Pen(Color.Black), f1.pbFace.Width / 2 Convert.ToInt16((Data.cR2[4] / 2) *
Data.cR2[15]),
Convert.ToInt16((Data.cR2[0] Data.cR2[5] - Data.cR2[7]) *
Data.cR2[15]) + 10, f1.pbFace.Width / 2 +
Convert.ToInt16((Data.cR2[4]) / 2 *
Data.cR2[15]),
Convert.ToInt16((Data.cR2[0] Data.cR2[5] - Data.cR2[7]) *
Data.cR2[15]) + 10);
f1.graphics1.DrawLine(new
Pen(Color.Black), f1.pbFace.Width / 2 Convert.ToInt16(((Data.cR2[4]) / 2) *
Data.cR2[15]),
Convert.ToInt16((Data.cR2[0] Data.cR2[5] - Data.cR2[7]) *
Data.cR2[15]) + 10, f1.pbFace.Width / 2,
Convert.ToInt16((Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
* Data.cR2[15]) + 10);
f1.graphics1.DrawLine(new
Pen(Color.Black), f1.pbFace.Width / 2 +
Convert.ToInt16(((Data.cR2[4]) / 2) *
Data.cR2[15]),
Convert.ToInt16((Data.cR2[0] Data.cR2[5] - Data.cR2[7]) *
Data.cR2[15]) + 10, f1.pbFace.Width / 2,
Convert.ToInt16((Data.cR2[0] Data.cR2[5] - Data.cR2[7] - Data.cR2[13])
* Data.cR2[15]) + 10);
}
private void DrawMouth(object
sender, EventArgs e)
{
f1.graphics1.DrawLine(new
Pen(Color.Black), f1.pbFace.Width / 2 Convert.ToInt16(((Data.cR2[2]) / 2) *
Data.cR2[15]),
Convert.ToInt16((Data.cR2[0] Data.cR2[5]) * Data.cR2[15]) + 10,
f1.pbFace.Width / 2 +
Convert.ToInt16(((Data.cR2[2]) / 2) *
Data.cR2[15]),
Convert.ToInt16((Data.cR2[0] Data.cR2[5]) * Data.cR2[15]) + 10);
{
N = N + 1;
for (i = 0; i < 3; i++)
if (N == x1[i])
N = N + 1;
P = 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
j++)
{
if (i == j)
{
matr1[i, j] =
N - x1[i];
P = P *
matr1[i, j];
}
else
matr1[i, j] =
x1[i] - x1[j];
}
for (i = 0; i < 3; i++)
D1[i] = 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3;
j++)
D1[i] = D1[i] *
matr1[i, j];
for (i = 0; i < 3; i++)
L1[i] = P / D1[i];
rez = 0;
for (i = 0; i < 3; i++)
rez = rez + y1[i] *
L1[i];
f1.graphics1.DrawLine(new
Pen(Color.Black), Convert.ToInt32(N1),
Convert.ToInt32(rez1),
Convert.ToInt32(N),
Convert.ToInt32(rez));
N1 = N; rez1 = rez;
}
}
}
x1[0] = f1.pbFace.Width / 2 ((Data.cR2[2]) / 2) * Data.cR2[15];
y1[0] = (Data.cR2[0] Data.cR2[5]) * Data.cR2[15] + 10;
x1[1] = f1.pbFace.Width / 2;
y1[1] = (Data.cR2[0] Data.cR2[5] + Data.cR2[11]) *
Data.cR2[15] + 10;
x1[2] = f1.pbFace.Width / 2 +
(Data.cR2[2]) / 2 * Data.cR2[15];
y1[2] = (Data.cR2[0] Data.cR2[5]) * Data.cR2[15] + 10;
N = x1[0]; N1 = x1[0]; rez1 =
y1[0];
while (N < x1[2] - 1)
12
Документ
Категория
Компьютеры, Программирование
Просмотров
21
Размер файла
1 444 Кб
Теги
курсовая_my
1/--страниц
Пожаловаться на содержимое документа