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

Статус
В этой теме нельзя размещать новые ответы.

Marja4ok

Создатель
Регистрация
18 Ноя 2008
Сообщения
27
Реакции
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
 
Рядом с картинкой создал квадрат тоже из 9ти имейджей (чтобы на нем собирать картинку) Каким кодом можно сравнить например имейдж1 с имейдж10 и если все верно то выдать сообщение?
 
Подарю семизнак....Ребят ну действительно выручайте срочно нужно ..всеголиш код чтобы сравнить два имейджа ....
 
В канве 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 эта переменна которая содержит равность двух картинок


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


можно же к каждому кусочку привязать номер???
 
можно же к каждому кусочку привязать номер???
Наверно... ) мне абсолютно всеравно каким образом оно сделано будет главное чтобы работало....

теоретически подумав решил что можно это организовать не для всех 9ти кусков а хотябы для двух какихто))) Так проще будет... Картинки которые будут собиратся всеравно несложные...нужно просто показать что программа умеет это делать....
 
Как говорится все гениальное просто...вот мысль пришла в голову, Зачем мне надо сравнивать изображения ,если можно просто сравнить их порядок.... кто знает как это можно сделать?
 
ну да надо просто вести "учет" присвоить каждому кусочку номер и сравнивать порядок с эталонным. для этого надо. у тебя всего 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;} // проверка в цикле всё ли на местах
или оформить это в виде ф-ции. вот примерно так
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху