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.

Cómo calcular en qué sector de un círculo se encuentra un punto determinado con sectores personalizados?

Estoy haciendo un juego TD en el que puedo colocar una ametralladora y, dependiendo del sector de un círculo circundante en el que esté el mouse, el sprite y el camino de la bala cambiarán.

Mi dificultad es crear un algoritmo que me diga en qué sector está mi mouse.

Mi círculo tiene 16 sectores, y un radio de 300. Cada arco tiene una longitud de 117.81. A partir de (300,300), tengo una lista exacta de todas las coordenadas de las líneas, por lo que actualmente puedo dibujar el sector así:

Circle

Estoy usando un oyente del mouse para detectar las coordenadas del mouse cada vez que se mueve, por lo que tengo un “currentPoint” para verificar en qué sector se encuentra.

Basándose en esta información, ¿alguien puede pensar en una manera fácil y eficiente de devolver simplemente un número entero en qué sector se encuentra el mouse actualmente?

Preferiblemente de manera eficiente.

Esto es lo que estoy considerando sobre cómo se vería:

Dos_Ideas

Y miré esta publicación en StackOverflow que parecía un problema similar: https://stackoverflow.com/questions/13652518/efficiently-find-points-inside-a-circle-sector
Y lo implementé con Java, pero parece que no se traduce sin tener vectores y estoy un poco confundido acerca de las matemáticas para hacer que funcione.

He estado tratando de resolver esto durante un tiempo, agradecería cualquier ayuda con cualquier tipo de implementación (no importa agregar cálculos trigonométricos), junto con cualquier ayuda para entender el problema.

¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    Para determinar en qué sector se encuentra actualmente el ratón, podemos usar trigonometría para calcular el ángulo entre el punto actual y el centro del círculo. Luego podemos dividir el ángulo por el tamaño de cada sector para determinar en qué sector cae.

    Aquí está el algoritmo para implementar esto:

    1. Obtener las coordenadas del punto actual y el centro del círculo.
    2. Calcular la distancia entre el punto actual y el centro mediante la fórmula de distancia: distancia = sqrt((x2 - x1)^2 + (y2 - y1)^2).
    3. Verificar si el punto actual está dentro del círculo comparando la distancia con el radio del círculo. Si es mayor que el radio, el punto está fuera del círculo y podemos detenernos.
    4. Calcular el ángulo entre el punto actual y el centro utilizando esta fórmula: ángulo = atan2(y - centerY, x - centerX).
    5. Si el ángulo es negativo, agregar 2π para que sea positivo.
    6. Dividir el ángulo por el tamaño de cada sector para determinar en qué sector cae. Redondear hacia abajo para obtener el índice del sector.
    7. Devolver el índice del sector.

    Aquí está el código Java para implementar este algoritmo:

    public int getSector(double x, double y, double centerX, double centerY, int radius, int numSectors) {
        double distancia = Math.sqrt(Math.pow(x - centerX, 2) + Math.pow(y - centerY, 2));
        if (distancia > radius) {
            return -1; // el punto está fuera del círculo
        }
        double ángulo = Math.atan2(y - centerY, x - centerX);
        if (ángulo < 0) {
            ángulo += 2 * Math.PI;
        }
        double tamañoSector = 2 * Math.PI / numSectors;
        int índiceSector = (int) Math.floor(ángulo / tamañoSector);
        return índiceSector;
    }
    

    Para utilizar este método, puedes llamarlo desde tu oyente de ratón cada vez que se mueve el ratón y pasar las coordenadas del ratón, el centro del círculo, el radio del círculo y el número de sectores. Devolverá el índice del sector en el que se encuentra actualmente el ratón, o -1 si está fuera del círculo.

Comments are closed.