Здравствуйте друзья. У меня на листе кружок, который перемещается при помощи нажатий на стрелки. Двигается он при помощи простенького макроса, написанного макрорекодером.
Как запретить этому кружку пересекать линию ? Чтобы он мог обойти ее, но не пересекать. В этом случае при нажатии на кнопку перемещения - он просто будет стоять на месте.
Здравствуйте друзья. У меня на листе кружок, который перемещается при помощи нажатий на стрелки. Двигается он при помощи простенького макроса, написанного макрорекодером.
Как запретить этому кружку пересекать линию ? Чтобы он мог обойти ее, но не пересекать. В этом случае при нажатии на кнопку перемещения - он просто будет стоять на месте.RagnarLodbrokovitch
RagnarLodbrokovitch, Провеить на пересечение отрезка с окружностью, если есть, то не двигаем. Уравнение окружности, уравнение прясой. Область определения для отрезка на прямой - вот и вся идея.
RagnarLodbrokovitch, Провеить на пересечение отрезка с окружностью, если есть, то не двигаем. Уравнение окружности, уравнение прясой. Область определения для отрезка на прямой - вот и вся идея.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Провеить на пересечение отрезка с окружностью, если есть, то не двигаем.
А куда именно не двигаем ?
Фигуре не запрещено вообще двигаться - ей только запрещено пересекать линию. Как макрос распознает - с какой стороны проходит линия в момент приближения к ней ?
Провеить на пересечение отрезка с окружностью, если есть, то не двигаем.
А куда именно не двигаем ?
Фигуре не запрещено вообще двигаться - ей только запрещено пересекать линию. Как макрос распознает - с какой стороны проходит линия в момент приближения к ней ?RagnarLodbrokovitch
Сообщение отредактировал RagnarLodbrokovitch - Воскресенье, 24.03.2019, 11:08
куда угодно не двигаем :-) Ну у вас это не кружок конечно. и перемещение рывком, но тут тоже не сильно сложно. Сперва упростим. Двигаем не фигуру а точку. Тогда отрезок не должен пересекаться с отрезком на который хотим переместить. Если пересекается, то стоим на месте. Так как у вас. фигура, то проверить надо два раза и отрезок перемещения увеличивается на размер фигур. Погрешность Будет, но это лучше чем ничего.
куда угодно не двигаем :-) Ну у вас это не кружок конечно. и перемещение рывком, но тут тоже не сильно сложно. Сперва упростим. Двигаем не фигуру а точку. Тогда отрезок не должен пересекаться с отрезком на который хотим переместить. Если пересекается, то стоим на месте. Так как у вас. фигура, то проверить надо два раза и отрезок перемещения увеличивается на размер фигур. Погрешность Будет, но это лучше чем ничего.bmv98rus
То есть вы имеете ввиду, что фигура намертво замрет на одном месте ? У меня в файле - несколько кнопок, которые отвечают за перемещение.
При приближении вплотную, или просто при сильном приближении фигуры (или точки) к линии - какие-то из этих кнопок должны "отключится", а какие-то должны продолжать работать. Если линия - проходит снизу - то это значит что должна отключится кнопка движения вниз, а все остальные кнопки продолжить работу.
Так вот как макрос определит - какие из нескольких кнопок отключить, а какие не трогать ?
То есть вы имеете ввиду, что фигура намертво замрет на одном месте ? У меня в файле - несколько кнопок, которые отвечают за перемещение.
При приближении вплотную, или просто при сильном приближении фигуры (или точки) к линии - какие-то из этих кнопок должны "отключится", а какие-то должны продолжать работать. Если линия - проходит снизу - то это значит что должна отключится кнопка движения вниз, а все остальные кнопки продолжить работу.
Так вот как макрос определит - какие из нескольких кнопок отключить, а какие не трогать ?RagnarLodbrokovitch
bmv98rus, теперь все работает, Большое спасибо за ответ.
Остался только один непонятный вопрос - как в вашем макросе определяется - какую линию можно пересекать, а какую нельзя ? В макросе нигде не указывается - название линии или какой-то другой определитель объекта.
Вот я расположил несколько линий на листе, но кружок не пересекает лишь только самую первую.
bmv98rus, теперь все работает, Большое спасибо за ответ.
Остался только один непонятный вопрос - как в вашем макросе определяется - какую линию можно пересекать, а какую нельзя ? В макросе нигде не указывается - название линии или какой-то другой определитель объекта.
Вот я расположил несколько линий на листе, но кружок не пересекает лишь только самую первую.RagnarLodbrokovitch
If CheckCrossing(ActiveSheet.Shapes(9), H, V, ActiveSheet.Shapes(10)) Then Exit Sub
[/vba]ActiveSheet.Shapes(9)- что двигаем ActiveSheet.Shapes(10) - с чем проверяем можете менять на ActiveSheet.Shapes("протагонист") ActiveSheet.Shapes("Прямая соединительная линия 11") соответственно
[vba]
Код
If CheckCrossing(ActiveSheet.Shapes(9), H, V, ActiveSheet.Shapes(10)) Then Exit Sub
[/vba]ActiveSheet.Shapes(9)- что двигаем ActiveSheet.Shapes(10) - с чем проверяем можете менять на ActiveSheet.Shapes("протагонист") ActiveSheet.Shapes("Прямая соединительная линия 11") соответственноbmv98rus
Замечательный Временно просто медведь , процентов на 20.
bmv98rus, понятно. Но что делать если линий много ?
Вот можно например такой код - заставить реагировать на присутствие в фигуре - одного слова "Прямая" ? [vba]
Код
If CheckCrossing(ActiveSheet.Shapes("протагонист"), H, V, ActiveSheet.Shapes("Прямая соединительная линия 11")) Then Exit Sub If CheckCrossing(ActiveSheet.Shapes("протагонист"), H, V, ActiveSheet.Shapes("Прямая соединительная линия 12")) Then Exit Sub If CheckCrossing(ActiveSheet.Shapes("протагонист"), H, V, ActiveSheet.Shapes("Прямая соединительная линия 13")) Then Exit Sub If CheckCrossing(ActiveSheet.Shapes("протагонист"), H, V, ActiveSheet.Shapes("Прямая соединительная линия 14")) Then Exit Sub
[/vba]
(Чтобы не вписывать всякий раз - в код новые линии)
bmv98rus, понятно. Но что делать если линий много ?
Вот можно например такой код - заставить реагировать на присутствие в фигуре - одного слова "Прямая" ? [vba]
Код
If CheckCrossing(ActiveSheet.Shapes("протагонист"), H, V, ActiveSheet.Shapes("Прямая соединительная линия 11")) Then Exit Sub If CheckCrossing(ActiveSheet.Shapes("протагонист"), H, V, ActiveSheet.Shapes("Прямая соединительная линия 12")) Then Exit Sub If CheckCrossing(ActiveSheet.Shapes("протагонист"), H, V, ActiveSheet.Shapes("Прямая соединительная линия 13")) Then Exit Sub If CheckCrossing(ActiveSheet.Shapes("протагонист"), H, V, ActiveSheet.Shapes("Прямая соединительная линия 14")) Then Exit Sub