A implementação de uma aresta de delimitação de rato
-
19-09-2019 - |
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?
Solução 3
- Encontre a equação da linha de borda usando os dois pontos finais.
- -. (1 / inclinação) dá a inclinação da linha perpendicular
- Resolver para equação de linha de linha perpendicular através do ponto conhecido em toda a borda (localização do verdadeiro rato)
- Resolver para intersecção da linha de borda e a linha perpendicular.
- 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
Para cada aresta (Pi, Pj) do polígono ...
Localizar o vetor normal
Procurar o deslocamento
Se
Loop End:)
ponto mais próximo:
if(mouse.x > maxX)
mouse.x = maxX;
else if(mouse.x < minX)
mouse.x = minX;
// same for Y.