Círculos

Definição de círculo e da equação

https://www.khanacademy.org/math/algebra2/conics_precalc/circles-tutorial-precalc/v/radius-and-center-for-a-circle-equation-in-standard-form

Verificar se um ponto está dentro do círculo ou exatamente na borda:

Sabendo que a equação do círculo vista no vídeo acima é:

(x - centerX)^2 + (y-centerY)^2 = radius^2

Se o ponto x,y estiver dentro do círculo, o valor do lado esquerdo da equação será menor que o radius^2.

Se estiver na borda, será igual.

E se estiver fora do círculo, será maior.

Essas observações são decorrentes da forma como se chega na fórmula do círculo, usando pitágoras. Substitua você mesmo para pegar a intuição.

int insideCircle(point p, point center, double radius)
{
    double dx = p.x - center.x;
    double dy = p.y - center.y;
    double left = dx*dx + dy*dy;
    double right = radius * radius;
    if (D_EQUAL(left, right)) {
        return 1; // na borda;       
    } else if ( left < right ) {
        return 0; // dentro do círculo
    } else {
        return 2; // fora
    }
}

Arco de um círculo:

/*
Comprimento do circunferência
*/
double circleLength(double radius)
{
    return 2.0*M_PI*radius;
}
/*
Retorna o comprimento do arco do circulo com o centro dado e angulo informado.
O ângulo é dado em radianos.
O maior ângulo possível é 360 (2PI). Se sabemos a circunferência do círculo e sabemos
que ele é obtida considerando o circulo inteiro, então basta fazer uma regra de 3:
2PI = c
theta = ?
*/
double arcLength(double circleLength, double theta)
{
    return (circleLength* theta) / 2*M_PI;
}

Encontrar o comprimento de um segmento de reta onde os pontos estão no círculo

A ideia aqui é encontrar o tamanho da linha vermelha da figura abaixo.

Para isso, utilizaremos a lei dos cossenos, que nos dá uma relação entre lados do triângulo independentemente de serem retângulos ou não (ao contrário de pitágoras). Veja aqui a demonstração dessa lei: https://pt.wikipedia.org/wiki/Lei_dos_cossenos

Para simplificar, vamos chamar chord de 'c':

c² = r² + r² - 2*r * r * cos(theta)

c² = 2r² - 2r²cos(theta)

colocando 2r² em evidência:

c² = 2r² ( 1 - cos(theta) )

c = raiz_quadrada ( 2r² ( 1 - cos(theta) ) )

E o código:

double chordLength(double radius, double theta)
{
    return sqrt(2*radius*radius * (1-cos(theta)));
}

Setor e segmento

Veja a figura abaixo para entender o código.