Консультация № 183992
08.09.2011, 15:27
162.00 руб.
0 6 1
Уважаемые эксперты! Здравствуйте! Помогите пожалуйста с данными задачами.(Компьютерная графика).1. Составить программу(с блок-схемой) для представления графического объекта:Кривая В – сплайна по 10 точкам. По возможности без усложнений для понимания. И хорошо если будет совместимо с c++ builder.2. Составить программу(с блок схемой) вывода графика Функция синус
Y=2.5*sin(X)+0.5. Аргумент и его диапазон: X [-2пи, 2пи]. Цвет графика/фона: белый
Зеленый.


Обсуждение

Неизвестный
08.09.2011, 19:29
общий
У Вас здесь два независимых вопроса, эксперты имеют право отвечать на один любой по собственному выбору. Рекомендую создать два разных вопроса.
Неизвестный
12.09.2011, 02:51
общий
12.09.2011, 13:07
это ответ
Здравствуйте, life!
Среда C++Builder, согласно пожеланию пользователя.
Фрагмент из проекта типа VCL/Форма.
Добавляете в форму Form2 проекта компонент PaintBox.
На событие клика мыши записываете тот обработчик, который приложен выше в коде PaintBox1Click

Решены две задачи:

Сначала готовим площадку для рисования.
///////////////////////////////////////////////////////////////////////////////
TCanvas* gdi=Form2->PaintBox1->Canvas;
TPen* oldPen=gdi->Pen;
TPen* pn=new TPen();
pn->Width=3;
pn->Color=clWhite;
gdi->Pen=pn;
TPen* bpn=new TPen();
bpn->Width=2;
bpn->Color=clOlive;
TBrush* br=new TBrush();
br->Color=clGreen;
gdi->Brush=br;
gdi->FillRect(TRect(0,0,400,250));
///////////////////////////////////////////////////////////////////////////////


1-ая - построение сплайна по 10 точкам (в примере дополнительно к сплайну рисуется десятиугольник по тем же точкам).
///////////////////////////////////////////////////////////////////////////////
///////// ДЕСЯТЬ ТОЧЕК //////////////////////////////////////
TPoint pnt[10]={TPoint(78,7), TPoint(123,30), TPoint(149,65), TPoint(123,100),
TPoint(78,123), TPoint(30,100), TPoint(7,65),
TPoint(30,30), TPoint(78,7)};
///////////////////////////////////////////////////////////////////////////////
gdi->Pen=bpn;
first=true;
///////////////////////////////////////////////////////////////////////////////
//// В ЦИКЛЕ ОТОБРАЖАЕМ ЛИНИЯМИ /////
//////////////// ДЕСЯТИУГОЛЬНИК ///////////////////////
for(int i=0; i<10; i++)
if(first)
{
gdi->MoveTo(pnt[i].X,pnt[i].Y);
first=false;
}
else
gdi->LineTo(pnt[i].X,pnt[i].Y);
gdi->Pen=pn;
///////////////////////////////////////////////////////////////////////////////
//////// В ЦИКЛЕ РИСУЕМ СПЛАЙНАМИ /////
gdi->MoveTo(pnt[0].X,pnt[0].Y);
for(int i=1; i<9; i++)
for(double t=0; t<=1; t+=0.01)
gdi->LineTo(Xt(pnt,i,t),Yt(pnt,i,t));
gdi->LineTo(pnt[9].X,pnt[9].Y);
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//////// ДЛЯ ВЫЧИСЛЕНИЯ ТОЧЕК ПО /////////
//////// КОТОРЫМ СТРОЯТСЯ СПЛАЙНЫ ///
//////// ОПРЕДЕЛЯЕМ ДВЕ ФУНКЦИИ //////////
int Xt(TPoint (&p)[],int i, double t)
{
double a0=(p[i-1].X+4*p[i].X+p[i+1].X)/6;
double a1=(p[i+1].X-p[i-1].X)/2;
double a2=(p[i-1].X-2*p[i].X+p[i+1].X)/2;
double a3=(p[i+2].X-3*p[i+1].X+3*p[i].X-p[i-1].X)/6;
double xt=((a3*t+a2)*t+a1)*t+a0;
return (int)xt;
}
int Yt(TPoint (&p)[],int i, double t)
{
double b0=(p[i-1].Y+4*p[i].Y+p[i+1].Y)/6;
double b1=(p[i+1].Y-p[i-1].Y)/2;
double b2=(p[i-1].Y-2*p[i].Y+p[i+1].Y)/2;
double b3=(p[i+2].Y-3*p[i+1].Y+3*p[i].Y-p[i-1].Y)/6;
double yt=((b3*t+b2)*t+b1)*t+b0;
return (int)yt;
}
///////////////////////////////////////////////////////////////////////////////


2-ая - построение синусоиды.
///////////////////////////////////////////////////////////////////////////////
const double kX=66.0;
const double kY=10.0;
const double pi=3.14;
bool first=true;
for(double x=-2*pi; x<2*pi; x+=0.01)
{
double y=2.5*sin(x)+0.5;
if(first)
{
gdi->MoveTo(x*kX,y*kY+125);
first=false;
}
else
gdi->LineTo(x*kX,y*kY+125);
}
///////////////////////////////////////////////////////////////////////////////
5
Неизвестный
12.09.2011, 10:26
общий
Вам следует прокомментировать свой ответ: добавить комментарии к коду, вообще объяснить, на какой вопрос Вы отвечаете и что делаете, в какой среде проверялось, как создать проект, в котором это будет работать.
Неизвестный
12.09.2011, 12:50
общий
Среда C++Builder, согласно пожеланию пользователя.
Фрагмент из проекта типа VCL/Форма.
Добавляете в форму Form2 проекта компонент PaintBox.
На событие клика мыши записываете тот обработчик, который приложен выше в коде PaintBox1Click
Решены две задачи:
Сначала готовим площадку для рисования.
///////////////////////////////////////////////////////////////////////////////
TCanvas* gdi=Form2->PaintBox1->Canvas;
TPen* oldPen=gdi->Pen;
TPen* pn=new TPen();
pn->Width=3;
pn->Color=clWhite;
gdi->Pen=pn;
TPen* bpn=new TPen();
bpn->Width=2;
bpn->Color=clOlive;
TBrush* br=new TBrush();
br->Color=clGreen;
gdi->Brush=br;
gdi->FillRect(TRect(0,0,400,250));
///////////////////////////////////////////////////////////////////////////////


1-ая - построение сплайна по 10 точкам (в примере дополнительно к сплайну рисуется десятиугольник по тем же точкам).
///////////////////////////////////////////////////////////////////////////////
///////// ДЕСЯТЬ ТОЧЕК //////////////////////////////////////
TPoint pnt[10]={TPoint(78,7), TPoint(123,30), TPoint(149,65), TPoint(123,100),
TPoint(78,123), TPoint(30,100), TPoint(7,65),
TPoint(30,30), TPoint(78,7)};
///////////////////////////////////////////////////////////////////////////////
gdi->Pen=bpn;
first=true;
///////////////////////////////////////////////////////////////////////////////
//// В ЦИКЛЕ ОТОБРАЖАЕМ ЛИНИЯМИ /////
//////////////// ДЕСЯТИУГОЛЬНИК ///////////////////////
for(int i=0; i<10; i++)
if(first)
{
gdi->MoveTo(pnt[i].X,pnt[i].Y);
first=false;
}
else
gdi->LineTo(pnt[i].X,pnt[i].Y);
gdi->Pen=pn;
///////////////////////////////////////////////////////////////////////////////
//////// В ЦИКЛЕ РИСУЕМ СПЛАЙНАМИ /////
gdi->MoveTo(pnt[0].X,pnt[0].Y);
for(int i=1; i<9; i++)
for(double t=0; t<=1; t+=0.01)
gdi->LineTo(Xt(pnt,i,t),Yt(pnt,i,t));
gdi->LineTo(pnt[9].X,pnt[9].Y);
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//////// ДЛЯ ВЫЧИСЛЕНИЯ ТОЧЕК ПО /////////
//////// КОТОРЫМ СТРОЯТСЯ СПЛАЙНЫ ///
//////// ОПРЕДЕЛЯЕМ ДВЕ ФУНКЦИИ //////////
int Xt(TPoint (&p)[],int i, double t)
{
double a0=(p[i-1].X+4*p[i].X+p[i+1].X)/6;
double a1=(p[i+1].X-p[i-1].X)/2;
double a2=(p[i-1].X-2*p[i].X+p[i+1].X)/2;
double a3=(p[i+2].X-3*p[i+1].X+3*p[i].X-p[i-1].X)/6;
double xt=((a3*t+a2)*t+a1)*t+a0;
return (int)xt;
}
int Yt(TPoint (&p)[],int i, double t)
{
double b0=(p[i-1].Y+4*p[i].Y+p[i+1].Y)/6;
double b1=(p[i+1].Y-p[i-1].Y)/2;
double b2=(p[i-1].Y-2*p[i].Y+p[i+1].Y)/2;
double b3=(p[i+2].Y-3*p[i+1].Y+3*p[i].Y-p[i-1].Y)/6;
double yt=((b3*t+b2)*t+b1)*t+b0;
return (int)yt;
}
///////////////////////////////////////////////////////////////////////////////


2-ая - построение синусоиды.
///////////////////////////////////////////////////////////////////////////////
const double kX=66.0;
const double kY=10.0;
const double pi=3.14;
bool first=true;
for(double x=-2*pi; x<2*pi; x+=0.01)
{
double y=2.5*sin(x)+0.5;
if(first)
{
gdi->MoveTo(x*kX,y*kY+125);
first=false;
}
else
gdi->LineTo(x*kX,y*kY+125);
}
///////////////////////////////////////////////////////////////////////////////

КАК РИСОВАТЬ ВАМ АЛГОРИТМ, ОТДЕЛЬНЫМ ФАЙЛОМ? В КАКОМ ФОРМАТЕ ДОЛЖЕН БЫТЬ ДОКУМЕНТ?
Неизвестный
12.09.2011, 13:38
общий
Огромное спасибо! Вечером буду пробовать
алгоритм в ворде нужен
Неизвестный
13.09.2011, 04:33
общий
АЛГОРИТМ для 1 и 2 задания на 1 и 2 странице соответствено
Прикрепленные файлы:
11afe8abf82975aa8c73e37bd2d7c9c6.doc
Форма ответа