es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Matlab: ¿Cómo guardar múltiples puntos de variable desde clics de ratón (con ‘ButtonDownFcn’) desde un gráfico en el espacio de trabajo?

Tengo una figura con algunas líneas verticales agregadas, así:

Me gustaría poder hacer clic en las líneas con el botón del mouse y guardar el índice de cada línea clicada. El siguiente script funciona, pero no sé cómo guardar cada índice en un arreglo. El ‘IndInWorkSpace’ cambia para cada clic.

figure
x = rand(1,41);
y = 1:41;
H(1)= plot(x,y,'r.');
H(2)= line([x(21) x(21)],[0 max(y)], 'LineWidth', 2, 'Color', 'k');
H(3)= line([x(3) x(3)],[0 max(y)], 'LineWidth', 2, 'Color', 'k');
H(4)= line([x(15) x(15)],[0 max(y)], 'LineWidth', 2, 'Color', 'k');

set(H, 'ButtonDownFcn', {@LineSelected, H})

function [indices] = LineSelected(ObjectH, H)
   set(ObjectH, 'LineWidth', 4);
   set(H(H ~= ObjectH), 'LineWidth', 2);
   % Get x and y data of the highlighted lines 
   ind = ObjectH.XData;
   assignin('base','IndInWorkSpace',ind);
end

¡Cualquier ayuda será muy apreciada! ¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para almacenar el índice de cada línea seleccionada en un arreglo, puede modificar la función LineSelected de la siguiente manera:

    function LineSelected(ObjectH, H)
       set(ObjectH, 'LineWidth', 4);
       set(H(H ~= ObjectH), 'LineWidth', 2);
       % Obtener el índice de la línea destacada
       ind = find(H == ObjectH);
       % Obtener el arreglo actual de índices almacenados
       indices = evalin('base', 'Indices');
       % Agregar el nuevo índice al arreglo
       indices = [indices ind];
       % Almacenar el arreglo actualizado en el espacio de trabajo
       assignin('base', 'Indices', indices);
    end
    

    Este código encuentra primero el índice de la línea destacada en el arreglo H, y luego obtiene el arreglo actual de índices almacenados del espacio de trabajo utilizando evalin('base', 'Indices'). Luego agrega el nuevo índice al arreglo y almacena el arreglo actualizado de nuevo en el espacio de trabajo utilizando assignin('base', 'Indices', indices).

    Para inicializar el arreglo Indices, puede agregar la siguiente línea de código antes de llamar a set en su script principal:

    assignin('base', 'Indices', []);
    

    Esto crea un arreglo vacío llamado Indices en el espacio de trabajo, que será actualizado por la función LineSelected.

Comments are closed.