2.11. Expressões Lógicas

Problema 1: Escreva um programa que pergunte ao usuário o valor de um ano qualquer e que o informe se o ano é ou não bissexto.

Dica

Anos bissextos ocorrem a cada quatro anos, exceto anos múltiplos de 100 que não são múltiplos de 400.

Solução:
# a função input permite ao usuário inserir um valor durante a execução
ano = int(input("Ano: "))

# a expressão lógica a seguir verifica se um número é bissexto
bissexto = ano % 4 == 0 and (ano % 100 != 0 or ano % 400 == 0)

print("O ano", ano, "é bissexto?", bissexto)

Nota

Saber se um ano é bissexto é importante no contexto de Sensoriamento Remoto, pois isso impacta nas datas de aquisição das imagens pelos satélites.


Problema 2: Considerando os elementos geométricos e os casos numerados de 1 a 6 na Figura 2.11, construa expressões lógicas que ajudem a responder às seguintes perguntas:

  1. Os elementos geométricos dos casos 4 e 5 satisfazem o relacionamento espacial Touches?

  2. Todos os casos apresentados envolvendo elementos geométricos lineares (casos 1, 2 e 3) representam de fato exemplos de relacionamento espacial Touches?

A geometria A toca a geometria B?

Figura 2.11 - A geometria A toca a geometria B?

Dica

Para solução desse problema, será utiliza o pacote Python denominado Shapely. Esse pacote não faz parte da biblioteca padrão do Python, sendo uma contribuição de terceiros. Mais detalhes sobre os tipos geométricos e a Shapely serão vistos mais adiante no curso, nas Seções 5.2 e 5.3.

Abaixo é apresentado como instalar a Shapely de acordo com os instaladores de pacotes Python conhecicos como pip e conda.

O pip é um dos principais instaladores de pacotes do Python. A comunidade de software livre costuma hospedar os pacotes em um repositório central denominado PyPI (Python Package Index). O pip por padrão, consegue instalar pacotes disponíveis nesse repositório.

Supondo que você esteja usando a distribuição padrão do Python, disponível em https://www.python.org (Python Software Foundation), vamos criar um ambiente virtual para isolar as bibliotecas que serão utilizadas ao longo do curso. O módulo venv, da biblioteca padrão do Python, permite criar esse tipo de ambiente virtual para isolar os pacotes (ou bibliotecs) que serão instalados. Para criar um ambiente virtual denominado venv, faça:

python3 -m venv venv

Após a criação do ambiente, é necessário ativá-lo:

source venv/bin/activate

Aproveite para atualizar alguns pacotes básicos desse ambiente:

pip install --upgrade pip setuptools wheel

Por último, instale a biblioteca Shapely:

pip install shapely

Assegure-se que esse pacote tenha sido instalado e verifique sua versão:

python -c 'import shapely; print(shapely.__version__)'

Uma saída como a mostrada abaixo deve ser apresentada:

2.0.3
Solução:

Nota

Também iremos utilizar uma representação textual para os elementos geométricos conhecida por WKT ou Well-known text (Seção 5.3).

Vamos considerar a seguinte representação WKT para as geometrias:

  • Caso 4:

    POLYGON( ( 9 6, 9 8, 12 8, 12 6, 9 6 ) )
    POLYGON( ( 12 7, 15 9, 15 5, 12 7 ) )
    
  • Caso 5:

    POLYGON( ( 1 1, 1 3, 4 3, 4 1, 1 1 ) )
    POLYGON( ( 4 2, 4 4, 6 4, 6 2, 4 2 ) )
    

Para responder à primeira pergunta, podemos construir o seguinte trecho de código:

from shapely import from_wkt

pol1 = from_wkt('POLYGON( ( 9 6, 9 8, 12 8, 12 6, 9 6 ) )')

pol2 = from_wkt('POLYGON( ( 12 7, 15 9, 15 5, 12 7 ) )')

pol3 = from_wkt('POLYGON( ( 1 1, 1 3, 4 3, 4 1, 1 1 ) )')

pol4 = from_wkt('POLYGON( ( 4 2, 4 4, 6 4, 6 2, 4 2 ) )')

caso4 = pol1.touches(pol2)

caso5 = pol3.touches(pol4)

resultado = caso4 and caso5

print(resultado)

Para responder a segunda pergunta, considere a seguinte representação WKT para as geometrias:

  • Caso 1:

    LINESTRING( 1 7, 1 9, 3 9 )
    LINESTRING( 1 9, 3 7 )
    
  • Caso 2:

    LINESTRING( 1 4, 2 6 )
    LINESTRING( 2 6, 3 4 )
    
  • Caso 3:

    LINESTRING( 5 6, 5 8, 7 8 )
    LINESTRING( 6 6, 6 9 )
    

O trecho de código abaixo mostra como construir as geometrias lineares e realizar os testes topológicos:

from shapely import from_wkt

l1 = from_wkt('LINESTRING( 1 7, 1 9, 3 9 )')
l2 = from_wkt('LINESTRING( 1 9, 3 7 )')

caso1 = l1.touches(l2)

l3 = from_wkt('LINESTRING( 1 4, 2 6 )')
l4 = from_wkt('LINESTRING( 2 6, 3 4 )')

caso2 = l3.touches(l4)

l5 = from_wkt('LINESTRING( 5 6, 5 8, 7 8 )')
l6 = from_wkt('LINESTRING( 6 6, 6 9 )')

caso3 = l5.touches(l6)

print(caso1 and caso2 and caso3)

Nota

Suponha que o exercício anterior solicitasse a escrita de uma mensagem diferente na tela dependendo do resultado verdadeiro ou falso dos testes. Exemplo:

  • Os casos 1, 2 e 3 são exemplos do relacionamento espacial Touches

  • Pelo menos um dos casos (1 ou 2 ou 3) não representa o relacionamento espacial Touches

Nesse caso, precisamos estruturar o programa dependendo de uma condição lógica. A próxima seção irá discutir o uso das estruturas condicionais para possibilitar controlar o fluxo de execução de programas.