Círculos
Definição de círculo e da equação
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.