Масштабирование С++ Builder
Добавлено: 26 май 2010, 19:32
Добрый вечер!
Работа программы заключается в расчете траектории посадки самолета.
Имеется проблема такого рода:
С 2 прямыми (показаны на рисунке и отмечены в коде) необходимо
проделать аналогичное масштабирование, что и с кривыми "красного
цвета" (см. рис.1 или 2).
Но вот как-то не получается из-за использования методов MoveTo(), LineTo().
Может есть у кого какие идеи?
Заранее благодарен!!!
Работа программы заключается в расчете траектории посадки самолета.
Имеется проблема такого рода:
С 2 прямыми (показаны на рисунке и отмечены в коде) необходимо
проделать аналогичное масштабирование, что и с кривыми "красного
цвета" (см. рис.1 или 2).
Но вот как-то не получается из-за использования методов MoveTo(), LineTo().
Может есть у кого какие идеи?
Заранее благодарен!!!
Код: Выделить всё
#include <vector.h>
...
public:
vector <TPoint> Buffer;
.........................................
.........................................
void Fly(int _u0,int _u1, TCanvas * can)
{ .........................................
..........................................
for(t1=0;fabs(omega*u0*t1)<2*PI;t1+=time_step)
{ ........................................
........................................
for(t2=time_step;fabs(omega*u1*t2)<2*PI;t2+=time_step)
{
.............................................
if(cos(fi2-fi1)<-0.995)
{
if(fabs((x2-x1)/(v*sin(fi1)+wx)-(y2-y1)/(v*cos(fi1)-wy))<10)
{
.............................................
}
}
}
if(ok)
{ .............................................
for(t1s=0;t1s<=t1;t1s+=time_step)
{
.............................................
Buffer.push_back(TPoint(begin_x+x1/scale,begin_y+y1/scale)); //сохранение
// координат
}
.............................................
}
can->MoveTo(begin_x+x1/scale,begin_y+y1/scale); //Проблема с масштабированием этих прямых (см. на рисунке)
//
can->LineTo(begin_x+x2/scale,begin_y+y2/scale); //
}
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
.............................................
Form1->Refresh();
Buffer.clear();
.............................................
Fly( 1, 1, Canvas);
Fly( 1,-1, Canvas);
Fly(-1,-1, Canvas);
Fly(-1, 1, Canvas);
//поиск максимума отклонения от центральной точки
int MaxDeltaX = 0, MaxDeltaY = 0;
int FW2 = Form1->Width /2;
int FH2 = Form1->Height / 2;
for (int i = 0; i < Buffer.size(); i++)
{
TPoint P = Buffer.at(i);
P.x -= FW2;
P.y -= FH2;
MaxDeltaX = max(abs(P.x), MaxDeltaX);
MaxDeltaY = max(abs(P.y), MaxDeltaY);
}
// выбираем, чтобы влезало по ширине, по высоте, или целиком
//допустим, целиком
if ((MaxDeltaX > FW2) || (MaxDeltaY > FH2))
{
float Kx = (float) FW2 / (float) MaxDeltaX;
float Ky = (float) FH2 / (float) MaxDeltaY;
float K = min(Kx, Ky);
for (int i = 0; i < Buffer.size(); i++)
{
TPoint P = Buffer.at(i);
P.x -= FW2;
P.y -= FH2;
float X = K * P.x;
float Y = K * P.y;
P.x = X + FW2;
P.y = Y + FH2;
Buffer.at(i) = P;
}
}
//после этого в буфере - набор масштабированных
//точек, которые можно рисовать
for (int i = 0; i < Buffer.size(); i++)
{
TPoint P = Buffer.at(i);
Form1->Canvas->Pixels[P.x][P.y] = clRed;
}