Объеденение двух фигур в С++ 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;
}
}
}
}