Исходник программы, показывающей пример создания классической китайской головоломки, в которой задача состоит в том, чтобы собрать части головоломки заново и сформировать исходный квадрат или любую из сотен других форм, учитывая только контур окончательной фигуры.
Функция PieceInSolution вызывается, когда пользователь щелкает мышью, чтобы разместить кусок фигуры в секции рисунка на экране. Чтобы положить фигуру, она должна полностью находиться в контуре фигуры и не перекрывать ранее размещенную часть. Легко, правда? А вот и нет! Функция PointInPoly, помогает определить, где лежат вершины, но это только часть истории. У фигуры может быть одна или две вершины, соприкасающиеся с краями другой части без нарушения, но это не дает информации о том, находится ли область части снаружи или внутри другой части. В конце концов я решил, что если у кусков две или более стороны, они должны перекрываться. Это ограничивает части выпуклыми многоугольниками, то есть без углублений.
Проблема поиска оптимального решения была решена простым подсчетом того, сколько частей было успешно размещено. Когда размещенный счетчик совпадает с количеством кусочков решения, мы должны закончить.
Интересным оказался и опыт, полученный при программировании переворота фигур. Переворачивание относительно горизонтальной или вертикальной оси (через центр детали) может быть выполнено перемещением точки так, чтобы она была центрирована на этой оси, изменением знака точки и переводом обратно в исходное положение оси. То есть, чтобы переместить точку (Px, Py) вокруг оси Y для части с центром в (Cx, Cy), переместите точку в (Px, Py-Cy), измените ее знак координаты Y на (Px, Cy-Py) и переместите его обратно в (Px, Cy-Py + Cy) или (Px, 2Cy-Py). Метод TPiece, Flip, делает это для всех точек детали и, кажется, работает нормально. Обратите внимание, что параллелограмм - единственная стандартная деталь, которую можно перевернуть.