Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Имитация волны над изображением

17K
07 июня 2010 года
neWManAlex
15 / / 20.10.2006
Здравствуйте, уважаемые!

У меня стоит задача сымитировать волну над изображением. Я решил для этого использовать функцию sin(x). У меня получилось только сымитировать волну проходящую горизонтально. Но мне нужно чтобы волна проходила под углом, который задаёт пользователь. Как мне можно пустить эту волну под углом?

Заранее спасибо!

Код:
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");

        }

}
2.1K
07 июня 2010 года
Norgat
452 / / 12.08.2009
угол...
прямая это 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, строил бы анимацию... а потом переделал бы под значение угла
397
07 июня 2010 года
SergPas
527 / / 03.02.2007
Не знаю как там насчет прямой, но есть верный способ - это пропустить каждую точку через конвейер аффиных преобразований, а именно в Вашем случае каждую точку нужно умножить на матрицу:
[ATTACH]4313[/ATTACH]
Топикстартеру предлагается проверить оба варианта.
2.1K
07 июня 2010 года
Norgat
452 / / 12.08.2009
Цитата: SergPas
Не знаю как там насчет прямой, но есть верный способ - это пропустить каждую точку через конвейер аффиных преобразований, а именно в Вашем случае каждую точку нужно умножить на матрицу:
Топикстартеру предлагается проверить оба варианта.



ну про прямую я прикунул в голове полагаясь только на школьный курс геометрии о прямоугольных треугольниках и их свойствах)) поэтому и написал, что не уверен в правильности))

щас вот прикинул... если сделать как я написал, то скорее всего должны быть не слишком хорошие искривления(аля пересечение одной волны синусойды, на другую... как это будет выглядеть я правда не слишком хорошо представляю))... а может так и должно быть)

17K
09 июня 2010 года
neWManAlex
15 / / 20.10.2006
Способ Norgat я реализовал (первый рисунок). Получился следующий код:

Код:
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");
        }

}


А вот со способом 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");
        }
}


Я думаю второй способ будет предпочтительнее. Пожалуйста, помогите мне исправить его код.

У меня получилось нарисовать синусоиду под углом используя этот метод:

Код:
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);
        }
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог