Объеденение двух фигур в С++ Builder

У меня есть функция-собитие, которое вызывается при отпускание мыши и при наложение двух фигур, должна "объеденятся" и создаваться на этом месте другая.

void __fastcall TForm1::ShapeMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
    TShape* shape = dynamic_cast<TShape*>(Sender);
    if (shape) {
        shape->Tag = 0;
        if (!Panel1->BoundsRect.Contains(shape->BoundsRect)) {
            shape->Left = TagFloat; 
            shape->Top = TagFloat2;
        }
        else {
            // Проверяем наложение на другие квадраты
            for (int i = 0; i < Panel1->ControlCount; ++i) {
                TShape* otherShape = dynamic_cast<TShape*>(Panel1->Controls[i]);
                if (otherShape && otherShape != shape) {
                    if (shape->BoundsRect.IntersectsWith(otherShape->BoundsRect)) {
                        //Application->MessageBox(L"Условие выполнилось", L"Тест");
                
                        int left = std::max(shape->Left, otherShape->Left);
                        int top = std::max(shape->Top, otherShape->Top);
                        int right = std::min(shape->Left + shape->Width, otherShape->Left + otherShape->Width);
                        int bottom = std::min(shape->Top + shape->Height, otherShape->Top + otherShape->Height);

                        int intersectionWidth = right - left;
                        int intersectionHeight = bottom - top;

                        if (intersectionWidth > 0 && intersectionHeight > 0 && intersectionWidth * intersectionHeight > 0.5 * shape->Width * shape->Height) {
                            
                            TShape* newShape = new TShape(Panel1);
                            newShape->Parent = Panel1;
                            newShape->Width = shape->Width;
                            newShape->Height = shape->Height;
                            newShape->Left = shape->Left;
                            newShape->Top = shape->Top;
                            newShape->Shape = stEllipse;
                            newShape->Brush->Color = clRed;
                            newShape->OnMouseDown = ShapeMouseDown;
                            newShape->OnMouseMove = ShapeMouseMove;
                            newShape->OnMouseUp = ShapeMouseUp;

                            Panel1->RemoveControl(shape);
                            Panel1->RemoveControl(otherShape);
                            delete shape;
                            delete otherShape;
                            break;
                        }
                    }
                }
            }
        }
    }
}

Но проблема как раз таки заключается в том, что условие не выполняется


Ответы (1 шт):

Автор решения: Denis

Разбирался с кодом, и заметил что всегда вполняется условие if(!Panel1->BoundsRect.Contains(shape->BoundsRect)) что логично, чтобы объект вернулся на место. Скорее всего я неправильно поставил проверку на пересечение. Надо убрать проверку if (!Panel1->BoundsRect.Contains(shape->BoundsRect)) на else проверки if(otherShape && otherShape != shape && shape->BoundsRect.IntersectsWith(otherShape->BoundsRect) ::

void __fastcall TForm1::ShapeMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
    TShape* shape = dynamic_cast<TShape*>(Sender);
    if (!shape) return;

    // Сбрасываем состояние перетаскивания

    for (int i = 0; i < Panel1->ControlCount; ++i) {
        shape->Tag = 0;
        TShape* otherShape = dynamic_cast<TShape*>(Panel1->Controls[i]);
        if (otherShape && otherShape != shape && shape->BoundsRect.IntersectsWith(otherShape->BoundsRect)) {
            int left = std::max(shape->Left, otherShape->Left);
            int top = std::max(shape->Top, otherShape->Top);
            int right = std::min(shape->Left + shape->Width, otherShape->Left + otherShape->Width);
            int bottom = std::min(shape->Top + shape->Height, otherShape->Top + otherShape->Height);

            int intersectionWidth = right - left;
            int intersectionHeight = bottom - top;

            if (intersectionWidth > 0 && intersectionHeight > 0 && intersectionWidth * intersectionHeight > 0.5 * shape->Width * shape->Height) {
                continue;
            }

            // Объединение квадратов в круг
            TShape* newShape = new TShape(Panel1);
            newShape->Parent = Panel1;
            newShape->Width = shape->Width;
            newShape->Height = shape->Height;
            newShape->Left = shape->Left;
            newShape->Top = shape->Top;
            newShape->Shape = stEllipse;
            newShape->Brush->Color = clRed;
            newShape->OnMouseDown = ShapeMouseDown;
            newShape->OnMouseMove = ShapeMouseMove;
            newShape->OnMouseUp = ShapeMouseUp;

            // Удаление исходных квадратов
            Panel1->RemoveControl(shape);
            Panel1->RemoveControl(otherShape);
            delete shape;
            delete otherShape;
            break;
        }
        else
        {
            if (!Panel1->BoundsRect.Contains(shape->BoundsRect)) {
                shape->Left = TagFloat; // Возвращаем исходную позицию Left
                shape->Top = TagFloat2; // Возвращаем исходную позицию Top
                return;
            }
        }
    }
}
→ Ссылка