Problem with element clicked for arrows
Hello,
I am implementing a rotation span task and here is the thing.
I have a canvas of arrow in different direction appearing on the screen, during a test part, in which the task of the participant ti to click on the arrow previously presented in a correct order.
Anyway the issue I have right now is that when I try to collect where participants click, I have very odd results. For some reasons, even if they click between arrows, then element will take a value that is close to an arrow. My arrow are black on a white screen this way:
The code I use to generate them is as follow:
import numpy as np
# calculate length total of an arrow,its position at the beginningm and its position at the end
# relatively to the height of the screen
def calc_parameter_arrow(prop_length_arrow, prop_start_point_arrow):
length_total = int(prop_length_arrow*var.height)
pos_arrow_begin = int(prop_start_point_arrow*var.height)
pos_arrow_final_long = length_total + pos_arrow_begin
return (length_total, pos_arrow_begin, pos_arrow_final_long)
# convert polar to cartesian
def pol2cart(rho, phi):
x = rho * np.cos(phi)
y = rho * np.sin(phi)
return(int(round(x)), int(round(y)))
# transform a length according to various radian, and return a list of list with the x, y cartesian coordinate of this length for these various radians
def coord_cart_radians(length_given, list_radian):
deg_rad_pos = map(( lambda x: [length_given, x]), list_radian)
cartesian_pos_return = [pol2cart(p[0], p[1]) for p in deg_rad_pos]
return(cartesian_pos_return)
#calculate radian of arrow separated by 45 degrees
nbr_arrow = 8.
degree_sep = 45.
deg = np.arange(nbr_arrow) * degree_sep
var.deg_rad = np.radians(deg)
var.deg_name = [ int(x) for x in deg ]
# various proportion of arrow relative to the height of the screen
var.prop_arrow_long_length_height = 0.3
var.prop_start_point_arrow_long = 0.1
length_arrow_long_total, pos_arrow_begin_long, pos_arrow_final_long = calc_parameter_arrow(var.prop_arrow_long_length_height, var.prop_start_point_arrow_long)
cartesian_pos_arrow_final_long = coord_cart_radians(pos_arrow_final_long, var.deg_rad)
cartesian_pos_arrow_begin_long = coord_cart_radians(pos_arrow_begin_long, var.deg_rad)
Pratice_arrow_long_Instruct_canvas = Canvas()
for pos, (coord_cart_b, coord_cart_f) in enumerate(zip(cartesian_pos_arrow_begin_long, cartesian_pos_arrow_final_long)):
Pratice_arrow_long_Instruct_canvas['long_arrow%s' % int(var.deg_name[pos])] = Arrow(coord_cart_b[0],coord_cart_b[1], coord_cart_f[0], coord_cart_f[1], head_width = 50, body_length = 0.8, body_width = 0.5, fill = True, color = 'black')
And in order to lauch the canvas and see my clicked element in the variable inspector:
my_mouse = Mouse(visible=True)
counter = -1
Pratice_arrow_long_Instruct_canvas.show()
while counter <15:
button, (x, y), timestamp = my_mouse.get_click()
var.element_clicked = Pratice_arrow_long_Instruct_canvas.elements_at(x, y)
Pratice_arrow_long_Instruct_canvas.show()
And when I click between the arrows, for some reason var.element_clicked is taking the value of closest arrow.
I do not really know what I did wrong.
Thank you for any help I also join an example script.
Best,
Sylvain
Comments
Oh actually I think I noticed something.
The issue is only happening for arrows that are not in a vertical or horizontal direction.
Like if all the pixels in a square around the arrows were considered as belonging to it.
Hi Sylvain,
Right now the
Canvas.elements_at()
indeed checks whether a point falls inside the bounding rectangle of a polygon. Thinking about how to improve this I came acrossshapely
which seems like a good library for this kind of geometrical operations. If you add the following code to the start of the experiment, the arrow and polygons should accurately indicate whether or not a point falls inside them. (This monkey patches thePolygon
class.)Could you let me know if this works for you?
Cheers,
Sebastiaan
Check out SigmundAI.eu for our OpenSesame AI assistant!
Hey Sebastiaan,
Thank you for the answer!
I installed shapely and indeed adding these lines at the very beginning seems to work very well!
I know have other issues with arrows (I originally worked on windows, now this week on osx and I encounter odd behavior but I will make another topic I guess).
But yeah concerning element it works well by adding these lines.
Thank you!
Best,
Sylvain