Se você possui um círculo com centro (center_x, center_y)
e raio radius
, como testar se um determinado ponto com coordenadas (x, y)
está dentro do círculo?
309
Se você possui um círculo com centro (center_x, center_y)
e raio radius
, como testar se um determinado ponto com coordenadas (x, y)
está dentro do círculo?
Respostas:
Em geral,
x
ey
deve satisfazer(x - center_x)^2 + (y - center_y)^2 < radius^2
.Por favor, note que os pontos que satisfazem a equação acima, com
<
substituído por==
são considerados os pontos sobre o círculo, e os pontos que satisfazem a equação acima, com<
substituído por>
são considerados o lado de fora do círculo.fonte
<=
encontrará pontos dentro do círculo ou em sua borda.Matematicamente, Pitágoras é provavelmente um método simples, como muitos já mencionaram.
Computacionalmente, existem maneiras mais rápidas. Definir:
Se é mais provável que um ponto esteja fora deste círculo , imagine um quadrado desenhado em torno dele, de modo que seus lados sejam tangentes a este círculo:
Agora imagine um diamante quadrado desenhado dentro deste círculo, de modo que seus vértices toquem neste círculo:
Agora, cobrimos a maior parte do nosso espaço e apenas uma pequena área desse círculo permanece entre o quadrado e o diamante a serem testados. Aqui voltamos a Pitágoras como acima.
Se é mais provável que um ponto esteja dentro deste círculo , inverta a ordem dos 3 primeiros passos:
Métodos alternativos imaginam um quadrado dentro deste círculo em vez de um diamante, mas isso requer um pouco mais de testes e cálculos sem vantagem computacional (o quadrado interno e os diamantes têm áreas idênticas):
Atualizar:
Para os interessados em desempenho, implementei esse método em ce compilei com -O3.
Eu obtive tempos de execução por
time ./a.out
Eu implementei esse método, um método normal e um método fictício para determinar a sobrecarga de tempo.
Normal: 21.3s This: 19.1s Overhead: 16.5s
Portanto, parece que esse método é mais eficiente nessa implementação.
fonte
inCircleN
você está usando ABS desnecessário. Provavelmente sem ABS diferença entreinCircle
einCircleN
seria menor.Você pode usar Pitágoras para medir a distância entre o ponto e o centro e ver se é menor que o raio:
EDIT (gorjeta de chapéu para Paul)
Na prática, o quadrado geralmente é muito mais barato do que pegar a raiz quadrada e, como estamos interessados apenas em uma ordem, é claro que podemos deixar de pegar a raiz quadrada:
Além disso, Jason observou que
<=
deve ser substituído<
e, dependendo do uso, isso pode realmente fazer sentidoembora eu acredite que isso não seja verdade no sentido matemático estrito. Eu estou corrigido.fonte
**
ou^
. A maneira mais rápida de fazê-lo quando você só precisa x ^ 2 ou x ^ 3 é fazê-lo "manualmente":x*x
.Isso é mais eficiente e legível. Evita a operação cara de raiz quadrada. Também adicionei uma verificação para determinar se o ponto está dentro do retângulo delimitador do círculo.
A verificação do retângulo é desnecessária, exceto com muitos pontos ou muitos círculos. Se a maioria dos pontos estiver dentro de círculos, a verificação do retângulo delimitador tornará as coisas mais lentas!
Como sempre, considere seu caso de uso.
fonte
Calcular a distância
que está em C # ... converte para uso em python ...
fonte
Você deve verificar se a distância do centro do círculo ao ponto é menor que o raio, ou seja,
fonte
Como dito acima - use a distância euclidiana.
fonte
Encontre a distância entre o centro do círculo e os pontos dados. Se a distância entre eles for menor que o raio, o ponto estará dentro do círculo. se a distância entre eles é igual ao raio do círculo, então o ponto está na circunferência do círculo. se a distância for maior que o raio, o ponto estará fora do círculo.
fonte
A equação seguinte é uma expressão que testa se um ponto está dentro de um círculo dado onde xP & yP são as coordenadas do ponto, xC & yC são as coordenadas do centro do círculo e R é o raio do círculo que dada.
Se a expressão acima for verdadeira, o ponto estará dentro do círculo.
Abaixo está uma implementação de exemplo em C #:
fonte
Essa é a mesma solução mencionada por Jason Punyon , mas contém um exemplo de pseudo-código e mais alguns detalhes. Vi sua resposta depois de escrever isso, mas não queria remover a minha.
Eu acho que a maneira mais fácil de entender é primeiro calcular a distância entre o centro do círculo e o ponto. Eu usaria esta fórmula:
Em seguida, basta comparar o resultado dessa fórmula, a distância (
d
), com oradius
. Se a distância (d
) for menor ou igual ao raio (r
), o ponto estará dentro do círculo (na borda do círculo, sed
er
for igual).Aqui está um exemplo de pseudo-código que pode ser facilmente convertido em qualquer linguagem de programação:
Onde
circle_x
ecircle_y
são as coordenadas centrais do círculo,r
é o raio do círculo ex
ey
são as coordenadas do ponto.fonte
Minha resposta em C # como uma solução completa de cortar e colar (não otimizada):
Uso:
fonte
Como afirmado anteriormente, para mostrar se o ponto está no círculo, podemos usar o seguinte
Para representá-lo graficamente, podemos usar:
fonte
Eu usei o código abaixo para iniciantes como eu :).
classe pública incirkel {
fonte
Movendo-se para o mundo do 3D, se você deseja verificar se um ponto 3D está em uma esfera de unidade, você acaba fazendo algo semelhante. Tudo o que é necessário para trabalhar em 2D é usar operações de vetor 2D.
fonte
Eu sei que há alguns anos a partir da resposta mais votada, mas consegui reduzir o tempo de cálculo em 4.
Você só precisa calcular os pixels de 1/4 do círculo e multiplicar por 4.
Esta é a solução que cheguei:
fonte
Aqui está o código java simples para resolver esse problema:
e a matemática por trás disso: /math/198764/how-to-know-if-a-point-is-inside-a-circle
fonte
PHP
fonte