Добавил:
svokna.by Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
poyasnitelnaya_zapiska.docx
Скачиваний:
16
Добавлен:
28.02.2018
Размер:
256.87 Кб
Скачать

1.1.Математическое описание преобразования плоских фигур

Основная фигура – квадрат, внутри которого содержится восьмиконечная звезда. Со стороной равной A и квадрат со стороной A*3, имеющие центр в одной и той же точке. Внутри квадрата описана звезда. Вращение фигуры осуществляется формулой:

x[i] = x0 + A*cos((alpha + 45)*pi_180)

y[i] = y0 - A*sin((alpha + 45)*pi_180)

Где X и Y- координаты углов квадратов по соответствующим осям.

Alpha-угол, на который отклоняется фигура.

1.2 Выбор и обоснование языка программирования и среды разработки

С++ (англ. C++) — компилируемый строго типизированный язык программирования общего назначения. Поддерживает разные парадигмы программирования: процедурную, обобщённую, функциональную; наибольшее внимание уделено поддержке объектно-ориентированного программирования.

Язык программирования С++ обеспечивает модульность, раздельную компиляцию, обработку исключений, абстракцию данных, объявление типов (классов) объектов, виртуальные функции. Стандартная библиотека включает, в том числе, общеупотребительные контейнеры и алгоритмы. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщенного программирования.

C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (игр). Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ. Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder и другие. C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.

Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C; множество программ, которые могут одинаково успешно транслироваться как компиляторами C, так и компиляторами C++, довольно велико, но не включает все возможные программы на C.

На примере языка со статической типизацией проще понять, что такое тип данных, зачем он нужен и от чего зависит. Видно, что собой представляет объявление, определение и инициализация. Использование языка C++ даёт это явно увидеть, что способствует дальнейшему пониманию того, как работают эти механизмы в других языках. Помимо этого можно на реальных примерах понять, чем беззнаковые целые отличаются от целых со знаком, чем отличаются числа двойной и одинарной точности, чем отличается символ от строки и т.д.

Нововведениями C++ в сравнении с C являются:

  • поддержка объектно-ориентированного программирования через классы. C++ предоставляет все четыре возможности ООП — абстракцию, инкапсуляцию, наследование (в том числе и множественное) и полиморфизм.

  • поддержка обобщённого программирования через шаблоны функций и классов;

  • стандартная библиотека C++ состоит из стандартной библиотеки C (с некоторыми модификациями) и библиотеки шаблонов (Standard Template Library, STL), которая предоставляет обширный набор обобщенных контейнеров и алгоритмов;

  • дополнительные типы данных;

  • обработка исключений;

  • виртуальные функции;

  • пространства имён;

  • встраиваемые (inline) функции;

  • перегрузка (overloading) операторов;

  • перегрузка имён функций;

  • ссылки и операторы управления свободно распределяемой памятью.

Родственным языку C++ является C#. Предпочтение было отдано C++ ввиду следующих особенностей:

С первого взгляда код С++ и С# очень похож внешне. Но многообразие кода на С++ больше, ведь С++ является одновременно и С и С++ и С++0х и все это вы можете использовать одновременно (конечно, если это поддерживает ваш компилятор).

С# же, это только C#, хотя его синтаксис постоянно расширяется. Код на С#, как правило, выглядит проще и лаконичнее, чем код С++ (хотя это не всегда можно было сказать про первые версии С#). Языковые конструкции С++ и С# очень схожи, однако существенные различия можно найти в деталях. 

Если С++ можно упрекнуть за отсутствие «в базе» reflection, позднего связывания и сборки мусора. То С# надо упрекнуть за отсутствие полноценных деструкторов, отсутствие полноценных макросов, достаточно грубую настройку наследования, отсутствие константных методов и членов, отсутствие глобальным методов (процедур), очень ограниченную поддержку шаблонов, список можно продолжать… Однако жить без всего этого вполне можно как в случае С++, так и в случае C#.

Синтаксис С#, пожалуй, можно назвать упрощенной версией С++, таким образом С#, как и любое упрощение, одновременно несет и позитивный и негативный эффекты.

Стоит сказать, что более сложный код часто легче пишется и анализируется, если написан более простым языком. С этой позиции, используя С#, меньше шансов допустить ошибку в принципиально сложном коде и больше шансов написать чистый код, обладая теми же ресурсами. Это может быть полезно при решении достаточно сложных, но не требовательных к производительности задач. Однако при этом большее количество «синтетики» в С# делает меньше оценку производительности кода по его «внешнему виду». 

С++ кросплатформенный по факту, хотя и с некоторыми оговорками, дополнительными затратами, а также бинарной несовместимость между платформами.

C#, по факту, оказался не кросплатформенный, несмотря на существование неофициальных .net окружений под разными платформами и даже потенциальную бинарную совместимость между платформами.

C# спроектирован быть кросплатформенным, однако его развитие не пошло в этом направлении. Поэтому под Windows образовалась достаточно полная .net инфраструктура; на других же платформах равноценной инфраструктуры не появилось.

При этом для разработки на С++ сложилась практически равноценная инфраструктура на большинстве существующих платформ, есть масса библиотек, которые скомпилированы или могут быть скомпилированы под любые существующие платформы. Именно поэтому существует огромное количество кросплатформенных приложений и библиотек разного масштаба, написанных на С++, на ряду с кросплатформенными библиотеками есть и библиотеки специфичные для отдельных платформ. Все это дает практический равноценные шансы для развития приложений на различных платформах.

И хотя С# возможно использовать для построения приложений под не-Windows платформы, проблемы, вызываемые использованием .net в не-Windows окружении, сводят на нет многие преимущества выбора C#. Поэтому рекомендовать его для кроссплатформенного использования можно разве что если код на C# уже написан. При этом надо четко понимать, что в перспективе это будет приносить дополнительные затраты на поддержку.

Наряду с рисками развития, есть и риски низкокачественного кода. Поскольку С# менее требователен к разработчику, вероятность появления кода низкого качества на С# в среднем выше, чем в случае С++. При критической массе подобного кода это может создать серьезные проблемы в работе приложения.

В случае С++ ситуация с низкокачественных кодом несколько лучше, т.к. шансы на выживание у плохого кода ниже, однако панацеей от плохого кода С++ конечно не является.

Полной самодостаточности приложений нет ни у C++ ни у С#. Для С++ так или иначе нужен runtime, а для C# .net framework.  Однако хотелось бы отметить, что рантайм С++, как и любая другая библиотека, может быть статический линкован в исполняемый модуль, таким образом исполняемый модуль может содержать все необходимое для работы, и за счет чего станет самодостаточным, в случае С# такое, стандартными средствами не реализуемо.

Для реализации проекта мною была выбрана среда разработки Embarcadero RAD Studio.

Embarcadero RAD Studio  представляет собой набор средств разработки приложений, который позволяет создавать приложения с графическим пользовательским интерфейсом для Windows, Mac OS X,.NET, PHP и веб-решений.

RAD Studio 2010 — это лучший пакет средств разработки полнофункциональных native-приложений для различных устройств, включая ПК, планшеты и смартфоны. Новые возможности RAD Studio 2010 упрощают создание приложений не только для Windows и Mac OS, но и для iPhone и iPad, а также позволяют подключаться к новым источникам данных и предоставляют множество других возможностей.

Основные возможности для разработки приложений Windows:

• Более 250 компонентов в библиотеке VCL.

• Встроенная поддержка касаний и жестов (более 30 готовых жестов).

• dbExpress с поддержкой 9 основных баз данных, включая InterBase®.

• DataSnap с поддержкой JSON, REST, HTTP, COM и XML.

• Возможность отладки многопоточных приложений.

• UML/аудит кода и учет показателей.

• Поддержка Windows 2000, Windows XP, Windows Vista и Windows 7 из единого источника. • Интеграция Subversion.

• Новые возможности VCL и RTL.

• Доработки в редакторе кода.

• Обновление DataSnap, в частности по части поддержки новых версий СУБД.

• Обновление средств моделирования, поддержка диаграмм последовательностей.

• Новые возможности для расширения IDE, обновленный Open Tools API.

    1. Задание базовой фигуры

Рисуем квадрат и заливаем его внутренности.

Canvas->Rectangle(center.x - outer_radius, center.y - outer_radius, center.x + outer_radius + 1, center.y + outer_radius + 1);

Переходим в "начальную точку" звезды.

Canvas->MoveTo(center.x+sin(angle)*outer_radius, center.y-cos(angle)*outer_radius);

Рисуем лучи звезды.

Canvas-> LineTo(center.x + sin(angle + (I * 21) * M_PI/beam_count *dir) *inner_radius,center.y-cos(angle+(i*2-1)*M_PI/beam_count*dir)*inner_radius);

Canvas->LineTo(center.x+sin(angle+i*2*M_PI/beam_count*dir)*outer_radius, center.y-cos(angle+i*2*M_PI/beam_count*dir)*outer_radius);

Закрашиваем вершины:

Canvas->Brush->Color = color2;

После рисования двух фигур (квадратов, которые в последствии будут вращаться один внутри другого) необходимо изменять их цвет. Для этого выбираем центр элипса, выполняем его заливку, после рисования большего квадрата, вновь выполняем заливку, рисуем поверх него еще один квадрат и вновь выполняем заливку от центра при помощи следующих комнд: Image2->Canvas->Brush->Color=RGB(colR2,colG2,colB2); Image2->Canvas->FloodFill(x0,y0,Image2->Canvas->Pixels[x0][y0],fsSurface);

Вращение происходит при помощи таймера и цикла, отклоняющего координаты фигуры по окружности на угол angle.

for (int i = 1; i <= beam_count; i++)

{

Canvas->LineTo(center.x+sin(angle+(i*2-1)*M_PI/beam_count*dir)*inner_radius, center.y-cos(angle+(i*2-1)*M_PI/beam_count*dir)*inner_radius);

Canvas->LineTo(center.x+sin(angle+(i*2-3)*M_PI/beam_count*dir)*inner_radius, center.y-cos(angle+(i*2-3)*M_PI/beam_count*dir)*inner_radius);

Canvas->MoveTo(center.x+sin(angle+(i*2-1)*M_PI/beam_count*dir)*inner_radius, center.y-cos(angle+(i*2-1)*M_PI/beam_count*dir)*inner_radius);

Canvas->LineTo(center.x+sin(angle+i*2*M_PI/beam_count*dir)*outer_radius, center.y-cos(angle+i*2*M_PI/beam_count*dir)*outer_radius);

}