Форум: Форум C++Разное
Новые темы: 00
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Симметричное изображение относительно прямой
 
 автор: AVS   (07.11.2007 в 07:37)   письмо автору
 
 


    for(i=0;i<h;++i)
    {
      for(j=0;j<w;++j)
      {
        x_color.rgb[0]=color[h-i][j].rgb[1];
        x_color.rgb[1]=color[h-i][j].rgb[0];
        x_color.rgb[2]=color[h-i][j].rgb[2];
        x_color.rgb[3]=color[h-i][j].rgb[3];
        Form1->Canvas->Pixels[j][i]=x_color.c;
      }
    }


В этом цикле строится изображение на форме. Мне надо изменить этот цикл так, чтобы изображение строилось симметрично прямой с координатами x1,y1,x2,y2. Вероятно надо измениь строку
  Form1->Canvas->Pixels[j][i]=x_color.c; 
, вот только вопрос как? Подскажите пожалуйста!

  Ответить  
 
 автор: cheops   (09.11.2007 в 07:27)   письмо автору
 
   для: AVS   (07.11.2007 в 07:37)
 

Нужно аналитическую геометрию вспоминать - нахождение координат симметричной точки относительно прямой...

  Ответить  
 
 автор: ka3kap   (09.11.2007 в 08:21)   письмо автору
 
   для: AVS   (07.11.2007 в 07:37)
 

Прямую задаю в виде: y=kx+c; участок отображения - x1,x2,y1,y2. Отображаются только пиксели, имеющие точный аналог за прямой.

int l,h,x1,y1,x2,y2;
 float k,c;
 float k1, c1;
 l=Image->Width;
 h=Image->Height;
 if(K->Text=="K") K->Text=1;
 if(C->Text=="C") C->Text=0;
 if(X1->Text=="X1") X1->Text=50;
 if(Y1->Text=="Y1") Y1->Text=10;
 if(X2->Text=="X2") X2->Text=60;
 if(Y2->Text=="Y2") Y2->Text=20;
 int center_i=l/2;
 int center_j=h/2;
 k=StrToFloat(K->Text);
 c=StrToFloat(C->Text);
 x1=center_i+StrToInt(X1->Text);
 x2=center_i+1+StrToInt(X2->Text);
 y1=center_j-StrToInt(Y2->Text);
 y2=center_j+1-StrToInt(Y1->Text);

 Image->Canvas->Brush->Color=clWhite;
 Image->Canvas->Rectangle(0,0,l-1,h-1);
 Image->Canvas->Brush->Color=clGreen;
 Image->Canvas->MoveTo(0,h/2);
 Image->Canvas->LineTo(l-1,h/2);
 Image->Canvas->MoveTo(l/2,0);
 Image->Canvas->LineTo(l/2,h-1);
 Image->Canvas->Rectangle(x1,y1,x2,y2);
 c1=-(y1-center_j)+(x1-center_i)/k;
 c2=-(y2-center_j)+(x2-center_i)/k;
 c3=-(y1-center_j)+(x2-center_i)/k;
 c4=-(y2-center_j)+(x1-center_i)/k;

 k1=-(y1-center_j)-k*(x1-center_i);
 k2=-(y2-center_j)-k*(x2-center_i);
 k3=-(y1-center_j)-k*(x2-center_i);
 k4=-(y2-center_j)-k*(x1-center_i);

 for(int i=-l/2;i<l/2;i++)
 for(int j=-h/2;j<h/2;j++)
    {
     if(j==k*i+c)
       Image->Canvas->Pixels[i+center_i][center_j-j]=clBlue;
    }

 for(int q=x1;q<=x2;q++)
 for(int w=y1;w<=y2;w++)
 {
  c1=-(w-center_j)+(q-center_i)/k;
  k1=-(w-center_j)-k*(q-center_i);
  k1=k1-2*c;
  for(int i=-l/2;i<l/2;i++)
  for(int j=-h/2;j<h/2;j++)
    {
     if(-k1==j-k*i)
     if(j+i/k==c1)
       Image->Canvas->Pixels[i+center_i][center_j-j]=Image->Canvas->Pixels[q][w];
    }
 }


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

  Ответить  
 
 автор: AVS   (13.11.2007 в 14:26)   письмо автору
 
   для: ka3kap   (09.11.2007 в 08:21)
 

Задача у меня немного другая: Пользоватль вводит координаты прямой. (без координатной плоскости по центру (y-право, x-верх)). Эта прямая строится на форме. Затем пользователь выбирает BMP файл. Этот файл считывается побайтно. Из него извлекается массив точек. И именно это изображение строится симметрично прямой.


for(i=0;i<h;++i)
    {
      for(j=0;j<w;++j)
      {
        x_color.rgb[0]=color[h-i][j].rgb[1];
        x_color.rgb[1]=color[h-i][j].rgb[0];
        x_color.rgb[2]=color[h-i][j].rgb[2];
        x_color.rgb[3]=color[h-i][j].rgb[3];
        Form1->Canvas->Pixels[j][i]=x_color.c;
      }
    }


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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования