Contribution to International Economy

Программа вывода текста вдоль кривой линии

Введение:

Изображение текста вдоль кривой может применяться в рекламе,

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

Для разработки программы использован язык программирования высокого уровня: С#.

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

Во втором разделе приведено описание метода представления  траектории, вдоль которой выводится текст на экран.

Третий раздел посвящён разработке программы вывода текста вдоль кривой на языке C#.

Результатом работы стала программа, которая выводит строку текста вдоль кривой, которая задана мышкой.

 

 

Методы и модели отображения кривых и текста средствами векторной графики

Двумерная компьютерная графика классифицируется по типу представления графической информации, и следующими из этого алгоритмами обработки изображений. Обычно компьютерную графику разделяют на векторную и растровую.

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

Изображение в векторном формате даёт простор для редактирования. Изображение может без потерь масштабироваться, поворачиваться, деформироваться. Имитация трёхмерности в векторной графике проще, чем в растровой. Дело в том, что каждое такое преобразование фактически выполняется так: старое изображение (или фрагмент) стирается, и вместо него строится новое. Математическое описание векторного рисунка остаётся прежним, изменяются только значения некоторых переменных, например, коэффициентов. При преобразовании растровой картинки исходными данными является только описание набора пикселей, поэтому возникает проблема замены меньшего числа пикселей на большее (при увеличении), или большего на меньшее (при уменьшении). Простейшим способом является замена одного пикселя несколькими того же цвета (метод копирования ближайшего пикселя: Nearest Neighbour). Более совершенные методы используют алгоритмы интерполяции, при которых новые пиксели получают некоторый цвет, код которого вычисляется на основе кодов цветов соседних пикселей.

Растровая графика всегда оперирует двумерным массивом (матрицей) пикселов. Каждому пикселю сопоставляется значение — яркости, цвета, прозрачности — или комбинация этих значений. Растровый образ имеет некоторое число строк и столбцов.

Без особых потерь растровые изображения можно только лишь уменьшать, хотя некоторые детали изображения тогда исчезнут навсегда, что иначе в векторном представлении. Увеличение же растровых изображений оборачивается красивым видом на увеличенные квадраты того или иного цвета, которые раньше были пикселями.

В растровом виде представимо любое изображение, однако этот способ хранения имеет свои недостатки: больший объём памяти, необходимый для работы с изображениями, потери при редактировании.

Уточненная постановка задачи:

 

На языке C# в среде Visual Studio 2008 разработать программу, которая выводит на экран текст вдоль кривой, заданной мышью.

Сначала при помощи мыши задаётся произвольная кривая.

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

Расстояние между отображаемыми символами рассчитывается автоматически, в соответствии с размером шрифта.

В случае когда количество символов превышает длину кривой, текст не отображается.

 

2. Задание кривой и вывода текста на экран

2.1 Структура данных для построения кривой и вывода текста на экран

      В разрабатываемой программе фигурируют следующие компоненты: графическое окно (окно формы) для отображения вводимого текста; кривая, вдоль которой выводится текст; текстовое окно для контрольного отображения текста (окно редактирования), и динамически размещаемая вдоль кривой метка, для вывода очередного символа.

      Основой всего дальнейшего построения будет кривая, по координатам которой мы в дальнейшем будем вычислять координаты каждого нового символа выводимого на экран. В нашей программе координаты задаются нажатием кнопки мыши и дальнейшем перемещением мыши. При нажатие на кнопку мыши в классe записываются координаты точки нажатия и то, какая кнопка мыши была нажата. Координаты нажатия записываются в массив, откуда потом у будут выбираться координаты для отображения символов.При дальнейшем движении мыши координаты точки нажатия записываются в numpoint это объект класс Point. Это класс точек в библиотеке Drawing. Координаты имеют тип int(integer - целочисленный). Кривая задайтся при помощи построения прямых между точек нажатия мыши на экране. Для того чтобы нарисовать кривую нужна 2 точки al[numpoint-2], al[numpoint-1] которые хранят предыдущие расположения курсора.  Для того чтобы нарисовать линию, так же нужна «ручка». Создаем объект класса Pen.

       Элемент управления Label предназначен для создания подписей к другим элементам управления или для вывода информационных сообщений прямо на поверхности формы. Label имеет тип sting, она может менять размер шрифта символа выводимого на экран, по умолчанию у меня стоит AutoSize. При изменение содержания текстовой панели меняется и содержания текста метки. Мы могли выводить текст не только при помощи метки, это можно была сделать при помощи MessageBox или при помощи методов Graphics. Я решил воспользоваться меткой так как посчитал его наиболее лёгким в реалезации.

label.Text = txtbox.Text[index++].ToString(); // в Label заносится последний вводимый символ.

       Текстовая панель имеет тип string. TextBox – этот элемент управления является основным среди полей ввода и списков, предназначенным для ввода пользователем текстовых данных. Использовать TextBox можно в однострочном или многострочном режиме. Однако данный элемент управления имеет ограничение — до 64 кбт текста.

 

private void txtbox_TextChanged(object obj, EventArgs e)

{

TextBox txtbox = (TextBox)obj; //запоминается вводимый текст.

}

 

2.2 Алгоритм отображения символов вдоль кривой

  Трудность выбора следующей точки, где будет отображаться символ, заключается в том, что символы могут налаживаться  друг на друга. Я пришел к двум возможным способам решения этой проблемы:

  Во-первых,  мы можем просто установить через сколько точек будет выводиться следующий символ. Этот способ не совсем подходит ведь мы не мы не можем быть уверенны что мышь всё время двигалась плавно, а следовательно что расстояние между точками одинаковое. Также мы не можем быть уверены, что линия прямая, ведь это может быть петля.

  Во-вторых, мы также как и в первом случае выбираем через, сколько точек будет выводиться следующий символ, но на этот рас проверяем подходит эта точка нам или нет.

 

     while (true)

                {

                    temp = (Point)al[numsim];

                    if (temp.X == 0 && temp.Y == 0)

                        MessageBox.Show("Error");

                    if (Math.Abs(pr.X - temp.X) > 10 && Math.Abs(pr.Y - temp.Y) > 3)

                    {

                        break;

                    }

                    numsim++;

                }

 

Мы проверяем разницу между предыдущими координатами. Если она меньше заданному значению(3 по X, 9 по Y) то берётся следующая точка, в таком случае мы можем быть уверены, что соседние символы не будут налаживаться друг на друга. Также мы выдаём сообщение об ошибке если следующая точка вывода текста находится не на прямой(то есть её координаты (0;0)).

            Этот способ не решает всех проблем, ведь он не гарантирует равномерный вывод текста вдоль кривой.

 

3. Разработка программы вывода текста вдоль кривой на языке C#

3.1. Возможности применения языка C# для вывода текста вдоль кривой

Созданный компанией Microsoft для поддержки среды .NET Framework, язык C# опирается на богатое наследие в области программирования. Его главным архитектором был ведущий специалист в этой области – Андерс Хейлсберг. C# - прямой потомок двух самых успешных в мире компьютерных языков: C и С++. От С он унаследовал синтаксис, ключевые слова и операторы. Он позволяет построить и усовершенствовать объектную модель, определенную в С++. Кроме того, С# близко связан с другим очень успешным языком: Java. Опираясь на мощный фундамент, который составляют унаследованные характеристики, C# содержит ряд важных новшеств, поднимающих искусство программирования на новую ступень.

На протяжении всей истории развития вычислительной техники эволюция языков программирования означала изменение вычислительной среды, способа мышления программистов и самого подхода к программированию. Язык C# не является исключением. В непрекращающемся процессе усовершенствования, адаптации и внедрения нововведений C# в настоящее время находится на переднем крае. Это – язык, игнорировать существование которого не может ни один профессиональный программист.  

В языке программирования C# есть много инструментов для описания графических фигур. Например, класс Graphics, который  является стандартным классом в библиотеке System.Drawing. Создав объект этого класса, нам открывается множество методов. Вот пример создания объекта упомянутого класса: Graphics g = Graphics.FromHwnd(this.Handle);

В нашей программе нам понадобится один основной метод этого класса. Это метод, который рисует линию.

Для того чтобы нарисовать линию нам понадобятся точки которые запоминаются в массив al, при нажатие кнопки мыши. Для лучшего понимания того как запоминаются координаты нажатия я написал программу, которая, при нажатие кнопки на окне формы, выдаёт сообщение о том какая кнопка мыши была нажата и координаты точки нажатия (код программы приведён в приложение).

Для того чтобы нарисовать линию нам понадобятся две точки (al[numpoint - 2], al[numpoint - 1]). Вот пример создание точки al[numpoint++] = new Point(e.X, e.Y); где e.X и e.Y координаты точки где бала нажата кнопка мыши. Далее для нашей программы понадобится «ручка». Вот пример создание объекта «ручка»: Pen blackPen = new Pen(Color.Red, 1);где Color.Red цвет ручки, а 1 толщина пера.

Теперь когда всё на своих полках раскроем мутод который рисует линию.

g.DrawLine(blackPen, al[numpoint - 2], al[numpoint - 1]);

Результатом этого метода станет лини от точкт al[numpoint - 2] до al[numpoint - 1], где [numpoint - 1] и [numpoint - 2] индексы указывающие на точку в массиве al. Заметим что координаты точек являются целые числа(int).

Почти в каждой программе для Windows пользователю приходится вводить текст — так было и будет. Можно установить обработчик событий  обработчики событий KeyDown, KeyUp и KeyPress для получения и отображения на экране данных, вводимых с клавиатуры. Однако во многих простых случаях можно задействовать элемент управления, который обычно называют полем редактирования (edit control), а в .NET Framework — текстовым полем (text box). На практике используются различные текстовые поля: от небольшого однострочного поля ввода до многострочного элемента управления с автоматическим переносом строк, как в программе Notepad (Блокнот).

Простейшее текстовое поле называется TextBox. Как видно из показанной ниже иерархии классов, TextBox наследует абстрактному классу TextBoxBase. Еще одним наследником TextBoxBase является RicbTextBox, Элемент управления RicbTextBox обладает большей функциональностью по сравнению с TextBox аналогично тому, как Microsoft WordPad обладает большей функциональностью по сравнению с Notepad. В TextBox (как и в Notepad) можно указать шрифт, но шрифт применяется ко всему документу. В RicbTextBox (как и в WordPad) можно определить различные шрифты и прочее форматирование для различных частей документа.

   Самое важное свойство текстовых полей — Text: именно оно содержит текст, вводимый в поле пользователем. Кроме того, можно инициализировать текст, показываемый в поле, и ограничивать длину текста

   Зачастую в диалоговых окнах достаточно получить находящийся в поле текст в момент нажатия пользователем кнопки ОК. Но в некоторых диалоговых окнах нужно постоянно отслеживать ввод пользователя. Так, диалоговое окно может разрешать нажимать кнопку ОК, только когда текстовое поле содержит какую-то допустимую информацию. Самое полезное событие текстового поля на самом деле определено в Control.

   Элемент управления Label в основном используется для отображения пользователю текстовой информации только для чтения. Так, для отображения информационной строки рядом с элементом управления часто применяют надписи, Например First Name – рядом с элементом управления Text Box, предназначенным для имени пользователя. Надписи можно также использовать с целью указаний клавиш быстрого вызова для других элементов управления.

Текст, отображаемый в надписи, задаётся в её свойстве Text. Чтоб надпись автоматически подстраивала свои размеры под размеры текста, её свойство AutoSize нужно задать значение True. Если AutoSize присвоено значение False, задать размер надписи можно, сместив края элемента управления в конструкторе. Для лучшего понимания работы элементов Label и TextBox.

Я написал программу, которая выводит текст в форме. Текст вводится в TextBox и выводится в Label(код программы приведен в приложение).

 

3.2 Структура программы

Работа программы состаит из следующих этапов:

Во-первых, создается само окно, в котором будет происходить действие. С помощью набора инструментов, прилагающихся к windows application, создается окно и кнопка, при нажатии которой все и будет происходить.

Во-вторых, нарисовать линию, вдоль которой будет выводиться текст.

В-третьих, вывести сам текст.

Для всего этого мне понадобится класс Graphics, который  является стандартным классом в библиотеке System.Drawing. С помощью методов этого класса я рисую кривую, а также отображаю текст, вдоль кривой. Для отображения текста мне также нужна библиотека System.Collections для запоминания точек кривой.

 

Выводы:

Результатом моей курсовой стала написанная программа написана на C# выводящая текст вводимый пользователем вдоль кривой.

 

Список Литературы:

Агуров П.В. «C# Сборник рецептов – СПб.: БХВ-Петербург, 2007.»

Шилдт Герберт «Полный справочник по C#.: Пер с англ. – М.: Издательский дом «Вильямс»

Чарльс Петцольд «Программирование для Microsoft Windows на C#» 1, 2 том.

В. В. Лабор «Visual C# Создание приложений для Windows»


 

Приложение

Текст программы выводящей текст вдоль кривой

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

using System.Collections;

 

namespace Form2

{

    public partial class Form2 : Form

    {

        private int index;

        public bool drawPen;

        Point[] al = new Point[999];

        Point pr;

        int numpoint = 0;

        public Point PreviousPoint;

        int numsim = 0;

        public Form2()

        {

            InitializeComponent();

            index = 0;

        }

        public void Form2_MouseDown(object sender, MouseEventArgs e)//Cобытие нажатия унопки мыши, если кнопка нажата drawPen = true;

        {

            drawPen = true;

        }

        private void Form2_MouseUp(object sender, MouseEventArgs )//если кнопка не нажата то drawPen = false;

        {

            drawPen = false;

        }

        public void Form2_MouseMove(object sender, MouseEventArgs e)//Событие перемещение мыши

        {

            if (drawPen)

            {

                al[numpoint++] = new Point(e.X, e.Y);// если drawPen = true; то точка запоминается в массиве и идёт запоминание следующей точки

                if (numpoint > 1)//если это уже не первая запоминаемая точка, то можду ними ресуется прямая

                {

                    Graphics g = Graphics.FromHwnd(this.Handle);

                    Pen blackPen = new Pen(Color.Red, 1);

                    g.DrawLine(blackPen, al[numpoint - 2], al[numpoint - 1]);

                }

            }

        }

        //Создаём обект TextBox в который бдет вводиться текст

        public void TextBoxDemo()

        {

            TextBox txtbox = new TextBox();

            txtbox.Parent = this;

            txtbox.Location = new Point(Font.Height, Font.Height);

            txtbox.Size = new Size(ClientSize.Width - 2 * Font.Height, Font.Height);

            txtbox.Anchor = AnchorStyles.Right;

            txtbox.TabIndexChanged += new EventHandler(txtbox_TextChanged);

        }

        private void txtbox_TextChanged(object obj, EventArgs e)//Событие   изменения текста в TextBox

        {

            //Создаём обект Label каторый будет выводить символы вдоль кривой

            Label label = new Label();

            label.Parent = this;

                Point temp;

                while (true)//цикл защиты от налаживания двух соседних символов

                {

                    temp = (Point)al[numsim];

                    if (temp.X == 0 && temp.Y == 0)//проверка координат если они (0;0) выдаёт сообщение об ошибке

                        MessageBox.Show("Error");

                    if (Math.Abs(pr.X - temp.X) > 3 && Math.Abs(pr.Y - temp.Y) > 9)// проверяет чему равна разница X и Y координат между двумя соседними точками

                    {

                        break;//если она удовлетворяет условие то программа переходит к отображению символа

                    }

                    numsim++;//если не удовлетворяет то проверяется следующа точка

                }

                pr = (Point)al[numsim];// запоминает точку где в последний рас выводился символ

            label.Location = al[numsim++];//выберает следующую точка для отображения

            label.AutoSize = true;

            TextBox txtbox = (TextBox)obj;

            label.Text = txtbox.Text[index++].ToString();//выводит на экран последний символ вводимый в TextBox

        }

    }

}

 

 

 

Программа выдающая информацию о нажатой кнопке мыши

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication5

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void Form1_MouseDown(object sender, MouseEventArgs e)

        {

            string text;

            MouseButtons button;

            button = e.Button;

            if (button = MouseButtons.Left)

            {

                text = "левую";

            }

            else if (button = MouseButtons.Right)

            {

                text = "правую";

            }

            else

            {

                text = "среднюю";

            }

            string message="вы нажали"+text+"кнопку мыш в координатах:n"+"x:="+e.X.ToString()+"n"+"y:="+e.Y.ToString();

            MessageBox.Show(message);

        }

    }

}

 

Программа вывода текста на экран

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication3

{

    public partial class NextBoxDemo : Form

    {

        public Label label;

        public NextBoxDemo()

        {

                                   // создание текстовой строки

            Text = "Пример 2";

            TextBox txtbox = new TextBox();

            txtbox.Parent = this;

            txtbox.Location = new Point(Font.Height, Font.Height);

            txtbox.Size = new Size(ClientSize.Width - 2 * Font.Height, Font.Height);

            txtbox.Anchor = AnchorStyles.Right;

            txtbox.TextChanged += new EventHandler(txtbox_TextChanged);

 

                                   // создание метки

            Label label =new Label();

            label.Parent=this;

            label.Location=new Point(Font.Height,3*Font.Height);

            label.AutoSize = true;

 

        }

        void txtbox_TextChanged(object sender, EventArgs e)

        {

            TextBox txtbox = (TextBox)sender;

            label.Text = txtbox.Text;

        }

    }

}


Переплет дипломов
Главная Новости О компании Наши услуги Цены Способы оплаты Авторам Вопрос-ответ Карта сайта Контакты
Партнеры: "ЦОДНТИ" "Первая Переплетная Мастерская""ЮТЭК"
Academic Journal Catalogue (AJC)