Масштабирование С++ Builder

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Pomka
Сообщения: 1
Зарегистрирован: 26 май 2010, 18:46
Откуда: г. Санкт-Петербург
Контактная информация:

Добрый вечер!

Работа программы заключается в расчете траектории посадки самолета.

Имеется проблема такого рода:

С 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;
  }
Вложения
Безымянный 2.jpg
Безымянный 1.jpg
Ответить