Как сделать ограничивающую рамку мышью на графическом интерфейсе, перетаскивая облако точек и выбирая все координаты внутри него в Python?
Я рисую облако точек. В этом облаке точек я хочу использовать мышь, чтобы перетащить и нарисовать (изменяемый размер) прямоугольник(для 2d) или кубоид(3d) и выбрать все точки внутри. Я новичок в python, поэтому не имею о нем большого представления.
Я был бы очень добр, если бы вы направили меня к каким-нибудь библиотекам, пакетам или чему-нибудь еще, что могло бы помочь.
Я использую (python) Jupyter-ноутбук, использующий matplotlib для рендеринга данных. для начала я могу нарисовать прямоугольник
Что я уже пробовал:
<pre> import pandas as pd import random import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as patches #point cloud coordinates points = [(random.random(), random.random()) for i in range(20)] pts = np.array(points) # X and Y coordinates that is tö be fed to scatter plot xcord =[row[0] for row in pts] ycord= [row[1] for row in pts] print("Enter the cordinates of the rectangle") numx1 = input('x1 lower cordinate: ') numx2 = input('x2 upper cordinate: ') numy1 = input('y1 lower cordinate: ') numy2 = input('y2 upper cordinate: ') numx1, numx2 = sorted([float(numx1), float(numx2)]) numy1, numy2 = sorted([float(numx1), float(numy2)]) ll = np.array([numx1, numy1]) # lower left cordinate of rectangel ur = np.array([numx2, numy2]) # upper right cordinate of rectangel inidx = np.all(np.logical_and(ll <= pts, pts <= ur), axis=1) inbox = pts[inidx] #points inside rectangle outbox = pts[np.logical_not(inidx)] # points outside the rectangle figure1 = plt.figure(figsize=(8,6)) ax = figure1.add_subplot(111) #Create a Rectangle patch #Rectangle(xy, width, height, angle=0.0, **kwargs) #rect cordinates a,b,c,d # a =numx1,numy1 b =numx2,numy1 c =numx2,numy2 d = numx1,numy2 width1 = float(numx2)-float(numx1) height1 = float(numy2)-float(numy1) rect1 = patches.Rectangle((numx1,numy1),width1,height1,linewidth=1,edgecolor='r',facecolor='none') # Add the patch to the Axes ax.add_patch(rect1) plt.scatter(xcord,ycord,s=2) plt.show() for example i made a simple program with random cordinates and this is result : https://ibb.co/0hMnFPY I am expecting result something like this for 3d: https://ibb.co/ysKBXhb I want to drag and draw the shape and should be able to resize. I will do further computations on the cordinates or shape accordingly.