Помогите с image в С++

Тема в разделе "Другие языки", создана пользователем Marja4ok, 17 апр 2009.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. Marja4ok

    Marja4ok Создатель

    Регистр.:
    18 ноя 2008
    Сообщения:
    26
    Симпатии:
    0
    Есть программа которая разрезает картинку на 9ть частей в произвольном порядке (тоесть как несобраный пазл)(код разбиения картинки приведен ниже,а еще ниже программа) . Также есть код который позволяет "тягать" эти картинки по форме и т.д . Прошу помощи в связи с тем что незнаю как организовать правильность собрания картинки...Тоесть помогите сделать так чтобы при правильном собирании картинки программа выдавала сообщение "Вы выиграли". Также еще волнует вопрос ,как сделать так чтобы при перетягивании части картинки с одного имейджа на другой любой картинка как бы прилипала к имейджу тоесть четко становилась в его рамки... ато выстраивать по пикселю неочень удобно.
    Код:
    void __fastcall TForm1::Open1Click(TObject *Sender)
    {
     TImage * Pict = new TImage(Form1);
    Pict->AutoSize = true;
    
    if(OpenDialog->Execute())
    {
    Pict->Picture->LoadFromFile(OpenDialog->FileName);
    
    
    Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                      Rect(0,0,Pict->Width / 3,Pict->Height / 3));
    Image3->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                      Rect(Pict->Width / 3,0,Pict->Width *2/ 3,Pict->Height / 3));
    Image2->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                      Rect(Pict->Width *2/ 3,0,Pict->Width,Pict->Height / 3));
    
    Image5->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                      Rect(0,Pict->Height / 3,Pict->Width / 3,Pict->Height *2/ 3));
    Image4->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                      Rect(Pict->Width / 3,Pict->Height / 3,Pict->Width *2/ 3,Pict->Height *2/ 3));
    Image6->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                      Rect(Pict->Width *2/ 3,Pict->Height / 3,Pict->Width,Pict->Height *2/ 3));
    
    Image9->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                      Rect(0,Pict->Height *2/ 3,Pict->Width / 3,Pict->Height));
    Image7->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                      Rect(Pict->Width / 3,Pict->Height *2/ 3,Pict->Width *2/ 3,Pict->Height));
    Image8->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                      Rect(Pict->Width *2/ 3,Pict->Height *2/ 3,Pict->Width,Pict->Height));
      }
    }
    Посмотреть вложение 7.rar
     
  2. Marja4ok

    Marja4ok Создатель

    Регистр.:
    18 ноя 2008
    Сообщения:
    26
    Симпатии:
    0
    Рядом с картинкой создал квадрат тоже из 9ти имейджей (чтобы на нем собирать картинку) Каким кодом можно сравнить например имейдж1 с имейдж10 и если все верно то выдать сообщение?
     
  3. Marja4ok

    Marja4ok Создатель

    Регистр.:
    18 ноя 2008
    Сообщения:
    26
    Симпатии:
    0
    Подарю семизнак....Ребят ну действительно выручайте срочно нужно ..всеголиш код чтобы сравнить два имейджа ....
     
  4. vivid

    vivid Постоялец

    Регистр.:
    13 апр 2009
    Сообщения:
    143
    Симпатии:
    18
    В канве Image1->Canvas-> нет случайно поля Pixels ??? через него можно достучаться до каждого пикселя... не могу найти описайние Canvas в инете, а ставить нереально такой софт тяжелый на мой комп но можно сделать что то типа такого
    Код:
    equal = true;
    for(int row=0;
    row<Image1->Height() /* то ли свойство то ли метод не знаю но должно быть такое*/;
    row++)
     for(int col = 0;col<Image1->Width() /*тоже не знаю но IDE тебе в помощь); col++){
      if(Image1->Canvas->Pixels[row][col] != Image10->Canvas->Pixels[row][col])
       equal = false;
       break;
     }
    }
    
    equal эта переменна которая содержит равность двух картинок


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


    можно же к каждому кусочку привязать номер???
     
  5. Marja4ok

    Marja4ok Создатель

    Регистр.:
    18 ноя 2008
    Сообщения:
    26
    Симпатии:
    0
    Наверно... ) мне абсолютно всеравно каким образом оно сделано будет главное чтобы работало....

    теоретически подумав решил что можно это организовать не для всех 9ти кусков а хотябы для двух какихто))) Так проще будет... Картинки которые будут собиратся всеравно несложные...нужно просто показать что программа умеет это делать....
     
  6. Marja4ok

    Marja4ok Создатель

    Регистр.:
    18 ноя 2008
    Сообщения:
    26
    Симпатии:
    0
    Как говорится все гениальное просто...вот мысль пришла в голову, Зачем мне надо сравнивать изображения ,если можно просто сравнить их порядок.... кто знает как это можно сделать?
     
  7. vivid

    vivid Постоялец

    Регистр.:
    13 апр 2009
    Сообщения:
    143
    Симпатии:
    18
    ну да надо просто вести "учет" присвоить каждому кусочку номер и сравнивать порядок с эталонным. для этого надо. у тебя всего 9 мест куда могут быть помещены кусочки изображений следовательно тебе избыточно хранить даже координаты каждого кусочка тебе достаточно хранить номер места. координаты можно вычислять следующей формулой:

    x = (pos % 3) * pos_width;
    y = (pos / 3) * pos_height; // естественно деление здесь целочисленное

    а восстановить номер позиции из координат ты можешь по след формуле (после того как передвинул изображение у него же должна быть новая позиция:(

    pos = (x / pos_width) + 3 * (y / pos_height);

    где x,y координаты на поле в пикселах, pos_width, pos_height - ширина и высота позиции в пикселах.

    таким образом можешь теперь заводить массив кусочков ассоциативных, где индекс это номер кусочка, а значение это текущая позиция. следовательно можешь условие окончания вычислять как
    ok=true;
    for(int i;i<9;i++)if(piece_pos !=i) {ok=false;break;} // проверка в цикле всё ли на местах
    или оформить это в виде ф-ции. вот примерно так
     
Статус темы:
Закрыта.