Pergunta

Eu tenho uma pergunta que conheço uma linha, apenas conheço sua inclinação (m) e um ponto nela a (x, y) como posso calcular os pontos (na verdade dois deles) nesta linha com uma distância (d) de ponto UMA ??? Estou pedindo isso para encontrar intensidade de pixels em uma linha que passa por um (x, y) com uma distância.

Foi útil?

Solução

Eu sugeriria converter a linha em um formato paramétrico em vez de inclinação de ponto. Ou seja, uma função paramétrica para a linha retorna pontos ao longo dessa linha para o valor de algum parâmetro t. Você pode representar a linha como um ponto de referência e um vetor representando a direção da linha que passa por esse ponto. Dessa forma, você apenas viaja as unidades D para frente e para trás do ponto A para obter seus outros pontos.

Como sua linha tem inclinação M, seu vetor de direção é <1, m>. Uma vez que move m pixels em y para cada 1 pixel em x. Você deseja normalizar esse vetor de direção para ser o comprimento da unidade para dividir pela magnitude do vetor.

    magnitude = (1^2 + m^2)^(1/2)

    N = <1, m> / magnitude = <1 / magnitude, m / magnitude>

O vetor de direção normalizada é N. Agora você está quase pronto. Você só precisa escrever a equação para sua linha em formato parametrizado:

    f(t) = A + t*N

Isso usa Matemática vetorial. Especificamente, Multiplicação do vetor escalar (do seu parâmetro t e o vetor n) e adição de vetor (de A e T*n). O resultado da função f é um ponto ao longo da linha. Os 2 pontos que você está procurando são f (d) e f (-d). Implementar isso no idioma de sua escolha.

A vantagem de usar esse método, em oposição a todas as outras respostas até agora, é que você pode estender facilmente esse método para suportar uma linha com inclinação "infinita". Ou seja, uma linha vertical como x = 3. Você realmente não precisa da inclinação, tudo o que você precisa é do vetor de direção normalizada. Para uma linha vertical, é <0, 1>. É por isso que as operações gráficas geralmente usam matemática vetorial, porque os cálculos são mais diretos e menos propensos a singularidades. Pode parecer um pouco complicado no começo, mas depois de obter o jeito das operações vetoriais, muitas tarefas gráficas de computador ficam muito mais fáceis.

Outras dicas

Deixe -me explicar a resposta de uma maneira simples.

Ponto de partida - (x0, y0)

Ponto final - (x1, y1)

Precisamos encontrar um ponto (xt, yt) a uma distância dt do ponto de partida em direção ao ponto final.

Point on a line at a distance

A distância entre o início e o ponto final é dada por d = sqrt((x1 - x0)^2 + (y1 - y0)^2)

Deixe a proporção de distâncias, t = dt / d

Então o ponto (xt, yt) = (((1 - t) * x0 + t * x1), ((1 - t) * y0 + t * y1))

Quando 0 < t < 1, o ponto está na linha.

Quando t < 0, o ponto está fora da linha perto de (x0, y0).

Quando t > 1, o ponto está fora da linha perto de (x1, y1).

Vamos chamar o ponto em que você está tentando encontrar P, com coordenadas PX, PY e seu ponto de partida A coordenadas do AX e AY. A inclinação m é apenas a razão da alteração em y sobre a mudança em x; portanto, se o seu ponto P estiver a distância s de a, suas coordenadas são px = ax + s e py = ay + m * s. Agora, usando pitágoras, a distância d de A a P será d = sqrt (s * s + (m * s) * (m * s)). Para fazer P ser uma unidade d específica longe de A, encontre s como s = d/sqrt (1 + m * m).

Eu pensei que essa era uma solução incrível e fácil de entender:

http://www.physicsforums.com/showpost.php?s=f04d131386fbd83b7b5df27f8da84fa1&p=2822353&postCount=4

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top