|
|
|
|
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; | , вот только вопрос как? Подскажите пожалуйста! | |
|
|
|
|
|
|
|
для: AVS
(07.11.2007 в 07:37)
| | Нужно аналитическую геометрию вспоминать - нахождение координат симметричной точки относительно прямой... | |
|
|
|
|
|
|
|
для: 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];
}
}
|
Для более точного отображения можно увеличить предварительно рисунок а потом уменьшить.
Как вариант, можно повернуть изображение на угол прямой, так чтоб она стала вертикально или горизонтально, и отобразить соответствующую сторону, после чего повернуть обратно. Причем это будет правильнее. Только формулы правильного поворота и увеличения для того чтоб пиксели не потерялись - не помню. | |
|
|
|
|
|
|
|
для: 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;
}
}
|
Вот этот цикл у меня строит изображение из считанного массива файла. Но строит он его вертикально. Не знаю как и что изменить, чтобы оно строилось симметрично прямой. | |
|
|
|