Jump to content

Detectar si el cursor está dentro de una imagen redonda


Enargy,

Recommended Posts

Si el círculo ocupa todo el espacio de la imagen, su radio será el ancho o el alto dividido en dos.

Ocupa toda la imagen.

Lo que trato de hacer es que yo tengo una imagen 120x120 donde un circulo ocupa el diámetro del tamaño de la imagen, lo que quiero hacer es como chequeo si la posición del cursor es inferior a la superficie del circulo.

Link to comment
El calculo se puede hacer dependiendo en dónde pondrás la imagen, si es en pantalla, es por la mitad del ancho (eje X) y la mitad de la altura (eje Y) del espacio que ocupe la imagen.

Me quedará en el centro del circulo, pero lo que yo quiero es como hacer para que el cursor se detecte al entrar a la circunferencia.

EDIT: Sería calcular el centro del circulo más la posición del cursor, lo cual se hacer pero no usando los ángulos ya que es de 360º

Link to comment

También puedes usar la hipotenusa, calculas la posición del puntero en la pantalla y con respecto al centro de tu circulo, luego evalúas si la hipotenusa es menor al radio. Si es así, entonces el puntero está dentro del circulo.

¿Hipotenusa en la circunferencia?

Link to comment

También puedes usar la hipotenusa, calculas la posición del puntero en la pantalla y con respecto al centro de tu circulo, luego evalúas si la hipotenusa es menor al radio. Si es así, entonces el puntero está dentro del circulo.

¿Hipotenusa en la circunferencia?

Ah cierto, no me acordaba que todavía hay gente aqui de pre-escolar.

Pones un circulo y luego un triangulito que uno de sus vértices sea el punto central del circulo, el otro vértice toque algún punto de la circunferencia y último vértice esté sobre uno de los ejes.

ciclo3.gif

Nunca mencionaste tríangulos inscriptos, sólo rectángulos :)

Si no puedes responder sin insultos simplemente no lo hagas :roll:

Link to comment

Tengo esto pero no se me adapta bien.

function isCursorHoverRadius(x, y, r) 
    if not isCursorShowing() then return end 
    local cx, cy = getCursorPosition() 
    local fx, fy = cx*sx, cy*sy 
    if ( (x - fx) * (x - fx) + (y - fy) * (y - fy) <= r * r ) then 
        return true 
    end 
    return false 
end 

y la sintaxis seria

  
if isCursorHoverRadius( 85, 500, 120 ) then -- 120 es el diámetro del circulo que también es el ancho y altura de la imagen. 
    print("inside!") 
end 

EDIT: Me queda mas o menos asi de mal.

http://i.imgur.com/gDzE3S9.jpg

Edited by Guest
Link to comment
    function isCursorHoverInRadius(x, y, r) -- C(x, y) centro del circulo y r = radio 
        if isCursorShowing() then 
        local cx, cy = getCursorPosition() 
        local dist = (((x-cx)^(2))+((y-cy)^(2)))^(1/2) 
            if dist <= r then 
                return true 
            end 
            return false 
        end 
    end 

No me queda bien.

Link to comment
¿Que no te queda bien?, explica más.

El dato que vas a meter es el radio, no el diametro. Y si quieres obtener el radio, según el diametro, solo lo divides entre 2.

Al hacer esa división me va a quedar el primer punto en 0, osea en el centro del circulo, y el radio sería la distancia entre el punto 0 hasta el arco de la circunferencia, nose si estoy correcto.

Link to comment

Al hacer esa división me va a quedar el primer punto en 0, osea en el centro del circulo, y el radio sería la distancia entre el punto 0 hasta el arco de la circunferencia, nose si estoy correcto.

Si.

Y la única división el script que publiqué indica la raíz cuadrada.

Es que ni siquiera funciona el código, me dan un numero y solo cambia los decimales porque lo chequee con outputs.

Link to comment
  • 2 weeks later...
  • Discord Moderators

Una circunferencia es el lugar geométrico de todos los puntos que tienen una misma distancia a otro punto. Esa distancia se llama radio y ese último punto se llama centro.

Por tanto, para saber si el cursor está dentro de ella, solo necesitas considerar su centro y la distancia entre el centro y el cursor. Si esta distancia es menor o igual al radio, entonces está tocando la circunferencia o bien en su interior.

Hablando en coordenadas, supongamos que el centro está en (x, y), y el cursor en (x1, y1). Podemos definir un vector (x1 - x, y1 - y) cuyo extremo es (x1, y1) y cuyo origen es (x, y). Si hallas el módulo del vector definido por ese último par de coordenadas, resolviendo la raíz cuadrada de (x1 - x)2 + (y1 - y)2, tienes la distancia del cursor al centro.

Link to comment

Ya había solucionado este problema hace días, de todos modos les dejo el código que me funciono y lo dejaré por si alguien lo necesite.

function isMouseInPosition(x, y, w, h) 
    if isCursorShowing( ) then 
        local cx, cy = getCursorPosition( ) 
        local sx, sy = guiGetScreenSize() 
        cx, cy = cx*sx, cy*sy 
        return cx >= x and cx <= x+w and cy >= y and cy <= y+h 
    end 
    return false 
end 
  
function isPositionInCircle(x, y, r, cx, cy) -- creditos a  del subforo ingles. 
    local i = 0 
    for k=(-r), r do 
        local q = math.sqrt((r/2)*(r/2)-k*k) 
        if isMouseInPosition(x-q+(r/2), y+k+(r/2), 2*q, 1) then 
            i = i+1 
        end 
    end 
    return i ~= (-r)+r 
end 

Link to comment
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...