Pergunta

De outro modo conhecida como uma borda dura, isto é uma linha sobre a qual o rato não consegue atravessar. Útil em jogos e similares.

Atualmente, eu tenho uma função que retorna se o meu cursor do mouse está em um polígono desenhado na tela. Se não for, eu mover meu cursor para o último ponto armazenado que estava no polígono.

    if (!PointInPolygon(local, polyGon))
    {
        Cursor.Position = safePoint;
    }
    else
    {
        safePoint = Cursor.Position;
    }

Eu não gosto deste por dois motivos:

  • Devido aos tempos de atualização lenta ou por qualquer motivo, às vezes sou capaz de sair da caixa. Isso, então, lojas que posição como o ponto seguro, fora do polígono. Meu rato é então preso nesta posição.

  • bordas inclinadas deve pust o mouse na direção de inclinação. Empurrando as Againts direito do rato um "/" parede em forma deve acabar com o cursor no canto superior direito. Mas devido à natureza desta abordagem, passando por cima da linha irá repor o cursor para onde era anteriormente. Continuando a empurrar direito só irá manter zerando o cursor, e não empurrá-lo "até a encosta."

Existem outras abordagens para resolver este problema? Estou preocupado principalmente sobre a última questão: este comportamento inclinação transversal é o principal objetivo do meu programa e eu preciso fazê-lo funcionar. Mesmo se eu usar esse método básico, todas as idéias para uma otimização de que o comportamento específico?


EDIT:

Tem sido sugerido por Reed que eu em vez retornar ao ponto que está mais próximo ao ponto fora dos limites atuais. Dadas as 4 pontos de canto de um quadrilátero, como eu iria encontrar o ponto mais próximo em / sobre a forma?

Foi útil?

Solução 3

  1. Encontre a equação da linha de borda usando os dois pontos finais.
  2. -. (1 / inclinação) dá a inclinação da linha perpendicular
  3. Resolver para equação de linha de linha perpendicular através do ponto conhecido em toda a borda (localização do verdadeiro rato)
  4. Resolver para intersecção da linha de borda e a linha perpendicular.
  5. Coloque o cursor falso naquele local.

Outras dicas

Em vez de seguir um "ponto seguro", eu faria o seguinte:

Se você encontrar o seu fora de seu polígono, em vez de reverter para um último ponto seguro conhecido, coloque o mouse para o ponto mais próximo do / no polígono para o local atual do mouse. Isso vai ajudar a sensação, assim, uma vez que o cursor tenderá a (lentamente) seguem pistas sobre a borda de polígonos, etc.

Ele também elimina a necessidade de salvar o estado entre as chamadas (ponto seguro).

Como ponto confine P dentro de uma convexa polígono (não-convexa é um pouco mais difícil) em 2-D (assumir sentido horário enrolamento):

Para cada aresta (Pi, Pj) do polígono ...

Localizar o vetor normal N da borda (apontador vector de unidade de Pi a Pj , rodado de 90 graus)

Procurar o deslocamento D a partir da borda de ponto P juntamente N ( D = (P - Pi) dot N )

Se D é positivo (ou negativo para o fim do enrolamento para a esquerda), em seguida, P = P - N * D

Loop End:)

ponto mais próximo:

if(mouse.x > maxX) 
    mouse.x = maxX;
else if(mouse.x < minX)
    mouse.x = minX;

// same for Y.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top