Comprobando si dos curvas cúbicas de Bézier se cruzan

Para un proyecto personal, necesitaría averiguar si se cruzan dos curvas cúbicas de Bézier. No necesito saber dónde: solo necesito saber si lo hacen. Sin embargo, necesitaría hacerlo rápido.

He estado limpiando el lugar y encontré varios recursos. Sobre todo, hayesta pregunta aquí eso tuvo una respuesta prometedora.

Entonces, después de imaginar qué es unMatriz de Sylvester, que es undeterminante, que es unresultante ypor qué es útil, Pensé que me imaginaba cómo funciona la solución. Sin embargo, la realidad es diferente, y no funciona tan bien.

Jugando

$14Para un proyecto personal, necesitaría averiguar si se cruzan dos curvas cúbicas de Bézier. No necesito saber dónde: solo necesito saber si lo hacen. Sin embargo, necesitaría hacerlo rápido.15He estado limpiando el lugar y encontré varios recursos. Sobre todo, hay16Para un proyecto personal, necesitaría averiguar si se cruzan dos curvas cúbicas de Bézier. No necesito saber dónde: solo necesito saber si lo hacen. Sin embargo, necesitaría hacerlo rápido.17He estado limpiando el lugar y encontré varios recursos. Sobre todo, hay18esta pregunta aquí19 eso tuvo una respuesta prometedora.20$

(1, 1) (2, 4) (3, 4) (4, 3)
(3, 5) (3, 6) (0, 1) (3, 1)

$21Para un proyecto personal, necesitaría averiguar si se cruzan dos curvas cúbicas de Bézier. No necesito saber dónde: solo necesito saber si lo hacen. Sin embargo, necesitaría hacerlo rápido.22He estado limpiando el lugar y encontré varios recursos. Sobre todo, hay23$

$24Para un proyecto personal, necesitaría averiguar si se cruzan dos curvas cúbicas de Bézier. No necesito saber dónde: solo necesito saber si lo hacen. Sin embargo, necesitaría hacerlo rápido.25He estado limpiando el lugar y encontré varios recursos. Sobre todo, hay26$

x = 9t^3 - 9t^2 - 3t + 2
y = 9t^3 - 9t^2 - 6t + 4
La matriz de Sylvester

Y a partir de eso he construido la siguiente matriz Sylvester:

9  -9  -3   2   0   0
0   9  -9  -3   2   0
0   0   9  -9  -3   2
9  -9  -6   4   0   0
0   9  -9  -6   4   0
0   0   9  -9  -6   4

Después de eso, hice una función C ++ para calcular determinantes de matrices usandoExpansión de Laplace:

template<int size>
float determinant(float* matrix)
{
    float total = 0;
    float sign = 1;
    float temporaryMatrix[(size - 1) * (size - 1)];
    for (int i = 0; i < size; i++)
    {
        if (matrix[i] != 0)
        {
            for (int j = 1; j < size; j++)
            {
                float* targetOffset = temporaryMatrix + (j - 1) * (size - 1);
                float* sourceOffset = matrix + j * size;
                int firstCopySize = i * sizeof *matrix;
                int secondCopySize = (size - i - 1) * sizeof *matrix;
                memcpy(targetOffset, sourceOffset, firstCopySize);
                memcpy(targetOffset + i, sourceOffset + i + 1, secondCopySize);
            }
            float subdeterminant = determinant<size - 1>(temporaryMatrix);
            total += matrix[i] * subdeterminant * sign;
        }
        sign *= -1;
    }
    return total;
}

template<>
float determinant<1>(float* matrix)
{
    return matrix[0];
}

Parece funcionar bastante bien en matrices relativamente pequeñas (2x2, 3x3 y 4x4), por lo que espero que también funcione en matrices 6x6. Sin embargo, no realicé pruebas exhaustivas y existe la posibilidad de que esté roto.

El problema

Si entendí correctamente la respuesta de la otra pregunta, el determinante debería ser 0 ya que las curvas se cruzan. Sin embargo, alimentando a mi programa la matriz Sylvester que hice arriba, es -2916.

¿Es un error de mi parte o de su parte? ¿Cuál es la forma correcta de averiguar si dos curvas cúbicas de Bézier se cruzan?

Respuestas a la pregunta(8)

Su respuesta a la pregunta