Форум С++

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

Автор: ka3kap   (09.11.2007 в 08:21)
Прямую задаю в виде: 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];
    }
 }


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


Ваше имя:

Пароль:

Цитировать

Используйте тэги для выделения текста:
Код: [code][/code]
Жирный: [b][/b]
Наклонный: [i][/i]
URL: [url][/url]

Сообщение:

Прикрепить: