void __fastcall TForm1::Button1Click(TObject *Sender)
{
Image1->Picture->LoadFromFile("C:\\CONTENT.BMP");
TColor temp;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int b;
int imagen_widht = Image1->Picture->Width;
int imagen_height = Image1->Picture->Height;
float pi_sot = M_PI/100;
int offset[100];
for(b = 0; b<100; b++)
offset = 50*sin(pi_sot*b);
for(int a=-100;a<imagen_widht;a+=5)
{
b=0;
for(int i=a;i<a+100;i++)
{
for (int j=0;j<imagen_height;j++)
{
Image1->Canvas->Pixels[j]=Image1->Canvas->Pixels[j+offset];
}
b++;
}
Image1->Refresh();
Sleep(10);
Image1->Picture->LoadFromFile("C:\\CONTENT.BMP");
}
}
Имитация волны над изображением
У меня стоит задача сымитировать волну над изображением. Я решил для этого использовать функцию sin(x). У меня получилось только сымитировать волну проходящую горизонтально. Но мне нужно чтобы волна проходила под углом, который задаёт пользователь. Как мне можно пустить эту волну под углом?
Заранее спасибо!
Код:
прямая это y = kx+b
далее... есть точка пересечения этой прямой с осью ОХ... - это твой угол...
выбираешь точку на прямой y и строишь перпендикуляр к ОХ...
получаешь прямоугольный треугольник... а для него есть формулы зависимости угла от длинн сторон(в гугле найдёшь)
из прямоугольного треугольника и его угла ищещь коэффициенты уравнения y = kx + b...
получаешь уравнение прямой ну типа y = 5x + 3 (это пример от балды)...
соотв из этого уравнения считаем x... x = (y - b)/k....
ну и подставить это x в код, как смещение для координаты x(синусом смещается y)...
Код:
Image1->Canvas->Pixels[i [COLOR="Blue"]+x[/COLOR]][j]=Image1->Canvas->Pixels[i [COLOR="blue"]+x[/COLOR]][j+offset];
наверно как то так надо сделать... хотя может я и ошибаюсь)) если я не прав поправьте меня)
п.с. я бы, для начала, сделал код, который по k и b, строил бы анимацию... а потом переделал бы под значение угла
[ATTACH]4313[/ATTACH]
Топикстартеру предлагается проверить оба варианта.
Цитата: SergPas
Не знаю как там насчет прямой, но есть верный способ - это пропустить каждую точку через конвейер аффиных преобразований, а именно в Вашем случае каждую точку нужно умножить на матрицу:
Топикстартеру предлагается проверить оба варианта.
Топикстартеру предлагается проверить оба варианта.
ну про прямую я прикунул в голове полагаясь только на школьный курс геометрии о прямоугольных треугольниках и их свойствах)) поэтому и написал, что не уверен в правильности))
щас вот прикинул... если сделать как я написал, то скорее всего должны быть не слишком хорошие искривления(аля пересечение одной волны синусойды, на другую... как это будет выглядеть я правда не слишком хорошо представляю))... а может так и должно быть)
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Image1->Picture->LoadFromFile("C:\\CONTENT.BMP");
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int b;
double imagen_widht = Image1->Picture->Width;
double imagen_height = Image1->Picture->Height;
float pi_sot = M_PI/100;
int offset[100];
for(b = 0; b<100; b++)
offset = 50*sin(pi_sot*b);
double x=StrToFloat(Edit1->Text);
double x_rad=x*M_PI/180;
for(int a=-100;a<imagen_widht*2;a+=5)
{
b=0;
for(double i=a;i<a+100;i++)
{
for (double j=0;j<imagen_height;j++)
{
[COLOR="Red"]Image1->Canvas->Pixels[int(i+(j/tan(x_rad)))][int(j)]=Image1->Canvas->Pixels[int(i+(j/tan(x_rad)))][int(j+offset)];[/COLOR]
}
b++;
}
Image1->Refresh();
Sleep(10);
Image1->Picture->LoadFromFile("C:\\CONTENT.BMP");
}
}
{
Image1->Picture->LoadFromFile("C:\\CONTENT.BMP");
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int b;
double imagen_widht = Image1->Picture->Width;
double imagen_height = Image1->Picture->Height;
float pi_sot = M_PI/100;
int offset[100];
for(b = 0; b<100; b++)
offset = 50*sin(pi_sot*b);
double x=StrToFloat(Edit1->Text);
double x_rad=x*M_PI/180;
for(int a=-100;a<imagen_widht*2;a+=5)
{
b=0;
for(double i=a;i<a+100;i++)
{
for (double j=0;j<imagen_height;j++)
{
[COLOR="Red"]Image1->Canvas->Pixels[int(i+(j/tan(x_rad)))][int(j)]=Image1->Canvas->Pixels[int(i+(j/tan(x_rad)))][int(j+offset)];[/COLOR]
}
b++;
}
Image1->Refresh();
Sleep(10);
Image1->Picture->LoadFromFile("C:\\CONTENT.BMP");
}
}
А вот со способом SergPas пока что не получается (второй рисунок). Волна проходит неправильно:
Код:
void __fastcall TForm1::Button7Click(TObject *Sender)
{
int b;
double imagen_widht = Image1->Picture->Width;
double imagen_height = Image1->Picture->Height;
float pi_sot = M_PI/100;
int offset[100];
for(b = 0; b<100; b++)
offset = 50*sin(pi_sot*b);
double x_g=StrToFloat(Edit1->Text);
double x_rad=x_g*M_PI/180;
double x,y,x1,y1;
for(int a=-100;a<imagen_widht*2;a+=5)
{
b=0;
for(double i=a;i<a+100;i++)
{
for (double j=0;j<imagen_height;j++)
{
[COLOR="Red"]x=i;
y=j+offset; // offset - массив с синусами
x1=x*cos(x_rad)-y*sin(x_rad);
y1=x*sin(x_rad)+y*cos(x_rad);
Image1->Canvas->Pixels[int(x1)][int(y1)]=Image1->Canvas->Pixels[int(i)][int(j)];[/COLOR]
}
b++;
}
Image1->Refresh();
Sleep(10);
Image1->Picture->LoadFromFile("C:\\CONTENT.BMP");
}
}
{
int b;
double imagen_widht = Image1->Picture->Width;
double imagen_height = Image1->Picture->Height;
float pi_sot = M_PI/100;
int offset[100];
for(b = 0; b<100; b++)
offset = 50*sin(pi_sot*b);
double x_g=StrToFloat(Edit1->Text);
double x_rad=x_g*M_PI/180;
double x,y,x1,y1;
for(int a=-100;a<imagen_widht*2;a+=5)
{
b=0;
for(double i=a;i<a+100;i++)
{
for (double j=0;j<imagen_height;j++)
{
[COLOR="Red"]x=i;
y=j+offset; // offset - массив с синусами
x1=x*cos(x_rad)-y*sin(x_rad);
y1=x*sin(x_rad)+y*cos(x_rad);
Image1->Canvas->Pixels[int(x1)][int(y1)]=Image1->Canvas->Pixels[int(i)][int(j)];[/COLOR]
}
b++;
}
Image1->Refresh();
Sleep(10);
Image1->Picture->LoadFromFile("C:\\CONTENT.BMP");
}
}
Я думаю второй способ будет предпочтительнее. Пожалуйста, помогите мне исправить его код.
У меня получилось нарисовать синусоиду под углом используя этот метод:
Код:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Form1->Canvas->Pen->Color=clRed;
double a=StrToFloat(Edit1->Text);
double a_rad=a*M_PI/180;
double x,y,x1,y1;
Form1->Canvas->MoveTo(0,0);
for(x=0;x<Form1->Width;x++)
{
y=Form1->Height-50*sin(M_PI*x/100)-400;
[COLOR="Red"]y1=x*cos(a_rad)-y*sin(a_rad);
x1=x*sin(a_rad)+y*cos(a_rad);[/COLOR]
Form1->Canvas->LineTo(x1,y1);
Sleep(1);
}
}
{
Form1->Canvas->Pen->Color=clRed;
double a=StrToFloat(Edit1->Text);
double a_rad=a*M_PI/180;
double x,y,x1,y1;
Form1->Canvas->MoveTo(0,0);
for(x=0;x<Form1->Width;x++)
{
y=Form1->Height-50*sin(M_PI*x/100)-400;
[COLOR="Red"]y1=x*cos(a_rad)-y*sin(a_rad);
x1=x*sin(a_rad)+y*cos(a_rad);[/COLOR]
Form1->Canvas->LineTo(x1,y1);
Sleep(1);
}
}