4576

Создание программы для рисования кривых второго порядка в среде Borland C++ Builder 6

Курсовая

Информатика, кибернетика и программирование

Введение В рамках данного курсового проекта требуется написать программу, рисующую кривые второго порядка. Для разработки была использована среда разработки BorlandC++ Builder 6. Формулировка поставленной задачи Написать программу, рисующую кр...

Русский

2012-11-22

437 KB

64 чел.

Введение

В рамках данного курсового проекта требуется написать программу, рисующую кривые второго порядка. Для разработки была использована среда разработки Borland C++ Builder 6.

Формулировка поставленной задачи

Написать программу, рисующую кривые второго порядка.

Описание предметной области

Все кривые второго порядка можно описать формулой:

a11x2 + a22y2 + 2a12xy + 2a13x + 2a23y + a33 = 0. Вид кривой будет зависеть только от коэффициентов.

Инварианты

Вид кривой зависит от 4 инвариантов:

  •  инварианты относительно поворота и сдвига системы координат
    •  
    •  
    •  
  •  инвариант относительно поворота системы координат (полуинвариант)
    •  

Классификация кривых второго порядка

Невырожденные кривые

Кривая второго порядка называется «невырожденной», если . Могут возникать следующие варианты:

  •  Эллипс — при условии D > 0 и IΔ < 0.
  •  Окружность (частный случай эллипса) — при условии a11 = a22, a12 = 0.
  •  Мнимый Эллипс (пустое множество) — при условии D = 0 и IΔ > 0.
  •  Гипербола — при условии D < 0.
  •  Парабола — при условии D = 0.

Вырожденные кривые

Кривая второго порядка называется «вырожденной», если Δ = 0. Могут возникать следующие варианты:

  •  Точка — при условии D > 0 (вырожденный эллипс)
  •  Пара пересекающихся прямых — при условии D < 0 (вырожденная гипербола).
  •  Пара параллельных прямых — при условии D = 0 и B < 0.
  •  Прямая (две слившихся параллельных прямых) — при условии D = 0 и B = 0.
  •  Пара мнимых параллельных прямых — при условии D = 0 и B > 0.

Уравнения

Канонический вид

Вводом новой системы координат можно привести уравнения кривых второго порядка к каноническому виду:

  •  Невырожденные кривые
    •  (эллипс)
    •  (гипербола)
    •  y2 = 2px (парабола)
  •  Вырожденные кривые
    •  (точка)
    •  (пересекающиеся прямые)
    •  (параллельные прямые)
    •  x2 = 0 (одна прямая)

Описание вариантов использования

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

Рис 1. Окно программы.

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

Описание структуры программы

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

 a 11x2 + a22y2 + 2a12xy + 2a13x + 2a23y + a33 = 0

 преобразуетсяя в

 by2+2(cx+e)y+ax2+2dx+f=0.

 Эта общая формула квадратного уравнения ay2+by+c’=0, где  

     a’=b, b’=2(cx+e), c’= ax2+2dx+f.

 

А для функции ay2+by+c’=0  можно вычислить дискриминант и посчитать корни. Таким образом, для каждого X находится одно или два значения Y, если они имеются, и выводятся на экран.

 

Рассмотрим подробнее принцип работы программы.

При нажатии на кнопку «Строить», выполняется следующий код:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

float y,D,x1,x2,a,b,c,d,e,f;   //объявляем вещественные переменные

//присваиваем значения коэффициентов

a=StrToFloat(Edit1->Text);   // a11

b=StrToFloat(Edit2->Text); // a22

c=StrToFloat(Edit3->Text); // a12

d=StrToFloat(Edit4->Text); // a13

e=StrToFloat(Edit5->Text); // a23

f=StrToFloat(Edit6->Text); // a33

Series1->Clear();   //очищаем поле для графика

Chart1->BottomAxis->Minimum=StrToFloat(Edit7->Text);  

//вводим минимум оси X из формы

Chart1->BottomAxis->Maximum=StrToFloat(Edit8->Text);  

// вводим максимум оси X из формы

for(float x=StrToFloat(Edit7->Text);x<=StrToFloat(Edit8->Text);x=x+0.005)

//объявляем вещественную переменную и перебираем точки из заданного интервала с шагом 0.005

{

       if (b==0){ Series1->AddXY(x, -(a*x*x+2*d*x+f) / 2*(c*x+e)) ; }

//частный случай (при b==0), при котором уравнение превращается в линейное

       else

       {

       D=(c*x+e)*(c*x+e)-b*(a*x*x+2*d*x+f);

//считаем дискриминант, и смотрим количество корней

       if (D==0){Series1->AddXY(x,-(c*x+e)/b);} // 1 корень

else

       if (D>0)      // 2 корня

     

      {Series1->AddXY(x,(-(c*x+e)+sqrt(D))/b);      

        Series1->AddXY(x,(-(c*x+e)-sqrt(D))/b);  }

        }

}

}

Series1->AddXY(x,y) – рисует точку с соответствующими координатами.

Контрольный пример

Приведем пример некоторой, произвольно набранной, функции (Рис 2).

Рис 2. Пример некоторой функции.

Вывод

В ходе работы была написана программа в среде Borland C++ Builder 6 и проверена её работоспособность.  Программа графически изображает кривые второго порядка. Она строит кривую на заданном пользователем  интервале на оси абсцисс.

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

  1.  Культин Н.Б. «C++ Builder в задачах и примерах» - СПб: «БХВ-Петербург», 2005;

Приложение

Код программы

//---------------------------------------------------------------------------

#include <vcl.h>

#include <math.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

       : TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

float y,D,x1,x2,a,b,c,d,e,f;

a=StrToFloat(Edit1->Text);

b=StrToFloat(Edit2->Text);

c=StrToFloat(Edit3->Text);

d=StrToFloat(Edit4->Text);

e=StrToFloat(Edit5->Text);

f=StrToFloat(Edit6->Text);

Series1->Clear();

Chart1->BottomAxis->Minimum=StrToFloat(Edit7->Text);

Chart1->BottomAxis->Maximum=StrToFloat(Edit8->Text);

for(float x=StrToFloat(Edit7->Text);x<=StrToFloat(Edit8->Text);x=x+0.005)

{

       if (b==0){ Series1->AddXY(x, -(a*x*x+2*d*x+f) / 2*(c*x+e)) ; }

       else

       {

     //  a*x*x+b*y*y+2*c*x*y+2*d*x+2*e*y+f=0;

       D=(c*x+e)*(c*x+e)-b*(a*x*x+2*d*x+f);

       if (D==0){Series1->AddXY(x,-(c*x+e)/b);}else

       if (D>0){Series1->AddXY(x,(-(c*x+e)+sqrt(D))/b);

        Series1->AddXY(x,(-(c*x+e)-sqrt(D))/b);  }

}}}


 

А также другие работы, которые могут Вас заинтересовать

66928. Рольова гра «Судимо Чіпку» 60 KB
  Мета: 1) у ході гри визначитись зі ставленням до головного героя роману Панаса Мирного «Хіба ревуть воли, як ясла повні?», оцінивши його вчинки, мотиви поведінки; 2) перевірити знання учнів з правознавства про адміністративну та кримінальну відповідальність; 3) розвивати в учнів аналітичні здібності; уміння грамотно, послідовно висловлювати свої думки...
66929. Поріс чорнобилем Чорнобиль - бідою нашою поріс 72.64 KB
  У ці дні ми привертаємо увагу, як української так і світової громадськості, до страждань людей, які зазнали і продовжують зазнавати дії радіації, а це 3 міл. ІОО тис. наших співвітчизників і жителів інших держав: Білорусії та Росії. Серед них і ті, хто захистив світ від страшної біди ціною свого здоров'я...
66930. Мужність і біль Чорнобиля 55 KB
  Вступне слово вчителя. 26 квітня 2010 року виповнилося 24 роки з дня найстрашнішої за наслідками катастрофи минулого тисячоліття. Чотири букви – ЧАЕС – стали символом трагедії, яка доторкнулася до мільйонів людей, накрила їх крилом безжалісної радіації, перетворюючи свої жертви в безпомічних людей.
66931. Дзвони Чорнобиля 54.5 KB
  Коли пара під великим тиском зруйнувала частину паропроводів потік води та пари викликав хімічні реакції з розігрітим графітом та цирконієм унаслідок чого утворилися горючі грози тиск яких був достатнім для підняття кришки реактора.
66932. Чорнобильська балада 57.5 KB
  Мета. Виховувати почуття співчутливості, критичне ставлення до історичних подій. Розвивати почуття гордості за свій народ. Прищеплювати любов до рідного краю. Обладнання. Стіл, накритий вишитим рушником, свічка, живі квіти, фотографії пожежників, магнітофон, фонограми...
66933. На Чорнобиль журавлі летіли 1.91 MB
  Мета заходу: згадати про трагедію віку — вибух на ЧАЕС, поглибити знання студентів про неї, визначити негативний вплив аварії на стан навколишнього середовища та здоров'я населення; розвивати вміння школярів аналізувати та узагальнювати навчальну інформацію, вміння виразно декламувати...
66934. Christmas in the Wood 49 KB
  Dady: Ok.Sit here and listen attentively. It was winter, December. All people were on Christmas Eve. The snow is falling down…. And there were a beautiful fir-tree in the middle of the "wood ". Some more trees are around it..
66935. Cooking 12.85 MB
  Today we’ll continue speaking about food and cooking. We’ll recollect the constructions there is/are and use these constructions in practice. So we’ll speak English, repeat and learn words, work with grammar, play and do a lot of interesting things.
66936. Ми у космос летимо. Заняття за інтересами 920 KB
  Мета. Закріпити вміння учнів працювати з технікою складання паперу «Орігамі». Виготовити моделі ракет, супутників, гратографії «Сузір’я», геометричну аплікацію, мозаїку «Чумацький шлях». Навчати працювати в групах, в парах та закріплювати вміння працювати з ножицями,...