Estruturando os componentes de um mecanismo que estou desenvolvendo junto com um amigo (propósitos de aprendizado), cheguei a essa dúvida.
Inicialmente, tínhamos um construtor Point, como o seguinte:
var Point = function( x, y ) {
this.x = x;
this.y = y;
};
Mas nós começamos a adicionar um pouco de matemática vetorial e decidimos renomeá-la para Vector2d.
Mas agora, alguns métodos são um pouco confusos (pelo menos na minha opinião), como o seguinte, que é usado para criar uma linha:
//before the renaming of Point to Vector2, the parameters were startingPoint and endingPoint
Geometry.Line = function( startingVector, endingVector ) {
//...
};
Eu devo criar um construtor específico para o objeto Point, ou não há problemas em definir um ponto como um vetor?
Eu sei que um vetor tem magnitude e direção, mas vejo tantas pessoas usando um vetor para representar apenas a posição de um objeto.
Respostas:
É improvável que haja problemas com a fusão das definições e com o tratamento de pontos como vetores - mas tenha um pouco de cuidado, porque algumas APIs têm uma classe 'Point' que você pode precisar usar (para representar, por exemplo, vértices de polígonos) e se Se você definir sua própria classe, poderá portá-la de um lado para o outro.
O que eu faria , no entanto, é tratá-los de forma equivalente no seu código; se você usa vetor e ponto de forma intercambiável, não há razão para que sua declaração para a função Line () esteja falando sobre 'StartingVector' e 'endingVector'. Eu recomendaria fortemente voltar a
Pontos são o que esses parâmetros representam, mesmo se eles estiverem usando a classe Vector para fazer isso.
fonte
typedef Vector Point
lugar em um cabeçalho que define pontos. Dessa forma, parece e se parece com umPoint
, ninguém fica coçando a cabeça ao usá-lo por que é chamado,Vector
mas no lado interno é apenas uma base de código.Basta usar o objeto Vector. Mesmo que você sinta que isso foi / foi usado incorretamente no passado, é o que as pessoas esperam. Além disso, não é necessariamente incorreto usar um vetor como ponto. E seria difícil fazer isso fora da discussão, pois as duas estruturas de dados requerem os mesmos tipos primitivos. As únicas diferenças serão as funções de membro, e é fácil colocá-las na mesma classe, pois não há muito no caminho de métodos conflitantes entre as duas.
Como você está aprendendo, é bom aprender que fazer o que as pessoas esperam costuma ser a melhor maneira de fazer as coisas (para escolhas triviais como a que está sendo apresentada).
fonte
w
componente, que é crítico.Pontos são locais no espaço. Depois de ter um sistema de coordenadas, você pode descrever esses pontos como uma distância e uma direção da origem (um vetor). Portanto, é perfeitamente razoável usar vetores para descrever os pontos inicial e final de uma linha.
Esteja ciente de que todos os pontos podem ser representados como um vetor, mas vetores não são pontos. A maioria dos vetores, por exemplo, velocidade, normal, etc, não tem nenhum senso de localização.
Pense no vento, você pode falar sobre sua direção e sua força, mas não pode falar sobre sua posição ou localização. É assim que você deve pensar em vetores quando NÃO estão sendo usados para descrever pontos no espaço.
fonte
Para definir um ponto, você precisa de apenas um vetor. Para definir uma linha, você precisa de duas. Normalmente, você tem dois pontos na linha ou um vetor representando um ponto na linha e o outro vetor representando a direção da linha.
Não há problemas para definir um ponto como vetor, porque um ponto é um vetor com direção igual a suas coordenadas e magnitude igual à sua distância de 0,0.
Portanto, você não precisa de duas classes separadas para representar um Point e "Vector2d", embora um Point possa presumivelmente ser uma subclasse do Vector2d com diferentes funções-membro diretamente relacionadas ao seu desenho ou processamento, enquanto o Vector2d pode apenas executar funções matemáticas de vetor estritas, como produtos de ponto.
fonte
Sim, não há problema em usar uma única
Vector
classe para definir pontos e vetores, desde que você garanta que ow
componente do vetor seja0
.A principal diferença entre um ponto e um vetor é que um ponto representa uma localização física no espaço, deslocada da origem, enquanto um vetor representa uma direção . Um ponto pode ser traduzido, um vetor não . O
w
componente de umaVector
classe bidimensional ou tridimensional é o que permite que o componente de conversão de uma matriz de transformação entre em vigor. Sew
for1
, a translação e a rotação serão aplicadas; se for0
, somente a rotação será aplicada.Não ter o
w
componente de um conjunto de vetores0
pode voltar para morder você; isso leva a erros que são bastante difíceis de rastrear. Para ser seguro, você pode fazer umaPoint
classe que herda daVector
classe e explicitamente definew
a1
, onde osVector
padrões de classew
a0
.fonte
w
componente deve estar presente; caso contrário, não há como determinar como o objeto deve ser usado.Pontos e vetores podem ser pensados como a mesma coisa. Se isso faz sentido para você, você pode pensar em vetores que representam a posição dessa maneira e, em seguida, é lógico usar uma
Vector2
classe em qualquer lugar em que você teria usado umaPoint
classe.Em matemática, os vetores às vezes são usados para representar a posição. Quando usado nesse sentido, o vetor representa onde uma entidade está localizada em relação a um ponto de origem. Por exemplo, suponha que você esteja fazendo um sh'mup e queira acompanhar onde o navio do jogador está na área de jogo. Se você tratar o canto inferior esquerdo da área de jogo como (0, 0), poderá representar a localização do jogador com
Vector
:O que o vetor significa nesse caso é que o navio está 3 unidades à direita e 3 unidades acima da origem. (Observe que você também pode usar um vetor para a velocidade do jogador. Nesse caso, o jogador moveria 3 unidades para a direita e 3 unidades para cima a cada segundo ou quadro. Tanto a posição quanto a velocidade seriam representadas pela mesma classe de vetor, mas seus vetores seriam processados de maneira diferente no script do jogador.)
Para usar seu exemplo de linha, o vetor position representa onde o "ponto inicial" e o "ponto final" estão localizados em relação à origem. Se sua origem é o centro da área de jogo, você pode determinar uma linha como esta:
Portanto, um extremo da linha tem 8 unidades à direita e 2 unidades acima do centro do campo de jogo, e o outro tem 8 unidades à direita e 2 unidades abaixo.
Só para ficar claro, isso não quer dizer que você precise usar uma
Vector
classe em vez de umaPoint
classe. Essa é apenas uma maneira de pensar sobre essa situação que pode facilitar a decisão de como implementar essas idéias.fonte
Depende da implementação. Se você precisa ter métodos no Vector2d em vez de seu protótipo, há um custo para isso, considerando a quantidade de pontos que você precisa em um jogo, um dos principais. É assim que o JavaScript funciona. Nessa situação, é melhor criar uma classe Point2d que não possui todas as funções desnecessárias.
fonte