Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160

Кубик-Рубика

12.05.2013, 20:33. Показов 6207. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый вечер, форумчане) мне необходимо написать программу кубика-рубика. руководитель посоветовала использовать opengl, так вот у меня, как наверное у многих новичков, мало что выходит, разобрался я с примитивами, а дальше не знаю куда/что, буду признателен, если подскажете в какую сторону копать)
в частности интересует, как сделать так, чтоб можно было двигать хотя бы 2 объекта независимо друг от друга?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.05.2013, 20:33
Ответы с готовыми решениями:

Игра 'Кубик Рубика'
Ребят мне очень нужна ваша помощь. Помогите создать игру кубик рубик. Но без 3D модели. Никак не могу догадаться как же это сделать.

Дорисовать кубик рубик
Господа требуется через canvas на форме нарисовать кубик рубик Лицевую часть сделал, а вот боковую и верхнуюю не смог procedure...

Кубик Рубика
Задача такая,из любой позиции собрать кубик Рубика за минимальное число ходов(вывести алгоритм сборки),используя поиск в...

49
angstrom
20.05.2013, 02:35
Студворк — интернет-сервис помощи студентам
За вращение отвечает функция OpenGL glRotatef, посмотри справку в Дельфи по WinAPI там команды OpenGL описаны.

Добавлено через 7 минут
Для начала, для понимания OpenGL, желательно скачать книгу "Графика в проектах Delphi" (автор - М.Краснов)", лучше, если найдёшь с примерами.
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 02:41  [ТС]
angstrom, располагаю я сим произведением, как раз с примерами, пытался по нему делать, правда не читал всё подряд, а пытался вытянуть конкретно нужную информацию
тяжело, если честно)
0
angstrom
20.05.2013, 02:52
Посмотри 64 пример из 3 раздела. Там пример вращения 6 кубиков.
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 03:19  [ТС]
очень интересно, и 7, и хе3 ругают DGlut.pas, конкретно 353 строчку: "Slices : GLint;"
Line too long (more than 1023 characters)

Добавлено через 10 минут
нашёл рабочую
0
angstrom
20.05.2013, 03:32
3 и 5 Дельфи компилируют.
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 03:43  [ТС]
angstrom, не та нынче "молодёжь" =D
не хватало файлов просто, нашёл полные примеры
с этим, 64, примером понятно всё, а вот в рубик_д я не разберусь, скорее всего, по крайней мере с нынешними знаниями) работа, если я не прав, то не стоит серчать, с байтами) мне ещё рано =(
мозг начинает кипеть)
0
angstrom
20.05.2013, 03:46
Непонятно в чём разница, нашёл копию файла в 7 Дельфи компилируется.
Вложения
Тип файла: rar glut.rar (5.2 Кб, 18 просмотров)
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 03:50  [ТС]
в моём файле 260 байт не хватало, видно кто-то посчитал что-то лишним)
0
angstrom
20.05.2013, 03:55
Файлы одинаковые, а искать разницу в 900 строках желания нет. Тут и fc не поможет, по разному отформатированы строки.
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 03:58  [ТС]
хм, эти кубики используют файл которых с ними находится, в корне ...\chapter3\
ну т.е. когда ошібка выскочила, то сразу файл открылся и я глянул путь, он лежал на уровень выше кубиков
0
angstrom
20.05.2013, 04:05
По инициализированным переменным в моём примере. Там находятся первоначальные координаты точек для кубиков, координаты расположения "наклеек". Далее в программе пересчитываются с учётом поворота в новые координаты.
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 04:09  [ТС]
вот, мне интересует как это происходит, то бишь алгоритм сам
как я это представляю, как я и делал:
вывожу те части куба, которые не будут тронуты
сдвигаю координаты
поворот
возвращаю координаты
вывожу поворачиваемую сторону куба

"опыт" показал, что так не верно)
как происходит вращение? когда сторона вращается, то меняются значения в массиве? ну там наклейки, к примеру? или это бред?)))
вот что я хочу сказать, когда сторону повернул, как сохраняется её вращение? в какой части кода?)
0
angstrom
20.05.2013, 04:14
Отрисовка сцены
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure RenderScene;
begin
...
  // вычисляются углы для нового поворота
  glRotatef(RotateX / float20, 1.0, 0.0, 0.0);
  glRotatef(RotateY / float20, 0.0, 1.0, 0.0);
  glRotatef(RotateZ / float20, 0.0, 0.0, 1.0);
...
  // оригинальные координаты
  glVertexPointer(3, GL_FLOAT, 0, @CooQuad);
  // здесь меняются
  RenderVerges;
...
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 04:30  [ТС]
glEnableClientState(GL_VERTEX_ARRAY); - метод тыка помог выясніть, что именно эта функция вращает стороны)
она использует константу GL_VERTEX_ARRAY = $8074; - вот здесь опять камень, что значит $8074?
если ещё где цвета понятно, то это...вообще, куда стоит обратится, к какой книге/статье, чтобы разобраться с этими строками:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
   J := Byte(Buf[I]);
 
    if J < $80 then
 
   CubVrByte  : CubArrayByte absolute CubVerge;
 
   J := (ugolp and $80);
   I := (ugolp and $7F) + 2;
 
   Rot := Rot shl 8;
 
   CubVrByte[RuleShift[Offset]] := Lo(Rot);
 
полностью эту процедуру
procedure FillSticker(Color : TColorRef; CornerA, CornerB : Integer);
var
  Pen      : HPEN;
  Br       : HBRUSH;
  Logbrush : TLogBrush;
begin
  // Sticker
  Pen := SelectObject(DCBitmap, CreatePen(PS_SOLID, 1, Color));
  Br  := SelectObject(DCBitmap, CreateSolidBrush(Color));
  try
    RoundRect(DCBitmap, CornerA + 4, CornerB + 4, CornerA + 60, CornerB + 60, 10, 10);
  finally
    DeleteObject(SelectObject(DCBitmap, Br));
    DeleteObject(SelectObject(DCBitmap, Pen));
  end;
  // Border
  Pen := SelectObject(DCBitmap, CreatePen(PS_SOLID, 1, $202020));
  FillChar(LogBrush, SizeOf(LogBrush), 0);
  LogBrush.lbStyle := BS_HOLLOW;
  Br := SelectObject(DCBitmap, CreateBrushIndirect(LogBrush));
  try
    RoundRect(DCBitmap, CornerA, CornerB, CornerA + 64, CornerB + 64, 3, 3);
  finally
    DeleteObject(SelectObject(DCBitmap, Br));
    DeleteObject(SelectObject(DCBitmap, Pen));
  end;
end;

да в принципе и с остальными процедурами) "базу" каких, так скажем, тем статей/книг достаточно? ну не углубляясь, просто времени не так много)
0
angstrom
20.05.2013, 12:24
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
procedure FillSticker(Color : TColorRef; CornerA, CornerB : Integer);
var
  Pen      : HPEN;
  Br       : HBRUSH;
  Logbrush : TLogBrush;
begin
  // Sticker - наклейка
  // создаём карандаш и выбираем в канвас битмапа
  Pen := SelectObject(DCBitmap, CreatePen(PS_SOLID, 1, Color));
  // создаём кисть и выбираем в канвас битмапа
  Br  := SelectObject(DCBitmap, CreateSolidBrush(Color));
  try
    // рисование скруглённого прямоугольника
    RoundRect(DCBitmap, CornerA + 4, CornerB + 4, CornerA + 60, CornerB + 60, 10, 10);
  finally
    // удаление кисти и карандаша
    DeleteObject(SelectObject(DCBitmap, Br));
    DeleteObject(SelectObject(DCBitmap, Pen));
  end;
  // Border
  // тоже самое, но кисть прозрачная
  Pen := SelectObject(DCBitmap, CreatePen(PS_SOLID, 1, $202020));
  FillChar(LogBrush, SizeOf(LogBrush), 0);
  LogBrush.lbStyle := BS_HOLLOW;
  Br := SelectObject(DCBitmap, CreateBrushIndirect(LogBrush));
  try
    // рисование скруглённого прямоугольника
    RoundRect(DCBitmap, CornerA, CornerB, CornerA + 64, CornerB + 64, 3, 3);
  finally
    DeleteObject(SelectObject(DCBitmap, Br));
    DeleteObject(SelectObject(DCBitmap, Pen));
  end;
end;
как выглядит на VCL
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure FillSticker(aColor : TColor; CornerA, CornerB : Integer);
begin
  // Sticker - наклейка
  DCBitmap.Canvas.Pen.Color := aColor;
  DCBitmap.Canvas.Brush.Color := Color;
  // рисование скруглённого прямоугольника
  DCBitmap.Canvas.RoundRect(CornerA + 4, CornerB + 4, CornerA + 60, CornerB + 60, 10, 10);
  // Border
  DCBitmap.Canvas.Pen.Color := $202020;
  DCBitmap.Canvas.Brush.Style := bsClear;
  // рисование скруглённого прямоугольника
  DCBitmap.Canvas.RoundRect(CornerA, CornerB, CornerA + 64, CornerB + 64, 3, 3);
end;
Добавлено через 4 минуты
Описание glEnableClientState
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 14:09  [ТС]
cпасибо, вроде, разобрался.
вот какой вопрос назрел, отрисовывается, получается, как бы, только внешняя оболочка кубика и "граница" между 2 взаимодействующими гранями? и что вот это:$8074, $8078, J < $80?) что мне у гугла спрашивать, чтоб эту тайну познать? цвета задаются в 16-ой с этим же $, получается и это 16? с ргб ещё понятно, но как здесь это используется?)

Добавлено через 9 минут
и откуда черпнуть знания про байты/биты?

Добавлено через 16 минут
и тут в программе много работы с памятью, я прав? и про это бы почитать) а то же не разберусь совсем... =(
0
angstrom
20.05.2013, 14:13
Цитата Сообщение от luciys Посмотреть сообщение
$8074, $8078
Эти константы ищи на сайте мелкомягких в разделе MSDN. В Дельфи они не описаны.
Цитата Сообщение от luciys Посмотреть сообщение
только внешняя оболочка кубика и "граница" между 2
А больше и не нужно.
Цитата Сообщение от luciys Посмотреть сообщение
цвета задаются в 16-ой с этим же $
В исходниках Дельфи они так и даны в виде констант с префиксом cl (clBlack = $0, clRed = #FF) и так далее.
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 15:26  [ТС]
ці я дурны, ці лыжі не едуць.
мои нулевые знания английского и первое посещение сайта не принесли своих плодов, полазил полазил не нашел =(
0
angstrom
20.05.2013, 16:15
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#define GL_VERTEX_ARRAY 0x8074
#define GL_NORMAL_ARRAY 0x8075
#define GL_COLOR_ARRAY  0x8076
#define GL_INDEX_ARRAY  0x8077
#define GL_TEXTURE_COORD_ARRAY  0x8078
#define GL_EDGE_FLAG_ARRAY  0x8079
#define GL_VERTEX_ARRAY_SIZE    0x807A
#define GL_VERTEX_ARRAY_TYPE    0x807B
#define GL_VERTEX_ARRAY_STRIDE  0x807C
#define GL_NORMAL_ARRAY_TYPE    0x807E
#define GL_NORMAL_ARRAY_STRIDE  0x807F
#define GL_COLOR_ARRAY_SIZE 0x8081
#define GL_COLOR_ARRAY_TYPE 0x8082
#define GL_COLOR_ARRAY_STRIDE   0x8083
#define GL_INDEX_ARRAY_TYPE 0x8085
#define GL_INDEX_ARRAY_STRIDE   0x8086
#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088
#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089
#define GL_TEXTURE_COORD_ARRAY_STRIDE   0x808A
#define GL_EDGE_FLAG_ARRAY_STRIDE   0x808C
#define GL_VERTEX_ARRAY_POINTER 0x808E
#define GL_NORMAL_ARRAY_POINTER 0x808F
#define GL_COLOR_ARRAY_POINTER  0x8090
#define GL_INDEX_ARRAY_POINTER  0x8091
#define GL_TEXTURE_COORD_ARRAY_POINTER  0x8092
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 16:21  [ТС]
спасибо,но я имел ввиду, что эти значения означают?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.05.2013, 16:21

Кубик Рубика
Здравствуйте подскажите пожалуйста , хочу попробовать сделать кубика Рубика , пока стоит задача -&gt; определить куда хочет повернуть грань...

кубик рубика
Нужна помощь. Никак не могу найти алгоритма. Мне нужно заштрихованный кубик передвинуть на 3 ряд без нарушения 1 и 2 ряда. Подскажите...

Кубик рубика
Всем привет! Помогите сделать игру с кубиком рубиком. Я знаю, задача не простая, но довайте остановимся хотябы на 3д кубике. И да,...

Кубик Рубика
Здравствуйте)помогите пожалуйста если не трудно)) Изобразить на экране ЭВМ следующий рисунок

Кубик рубика в Паскале
Изобразить в графическом модуле паскаля Кубик рубика, с разноцветными квадратиками


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru