Preciso de um ponto e um objeto Vector? Ou apenas usar um objeto Vector para representar um ponto está ok?

18

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.

JCM
fonte
11
Como position é apenas um vetor de (0,0 {, 0}), é bom usar um vetor.

Respostas:

8

É 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

Geometry.Line = function( Vector startingPoint, Vector endingPoint ) {
    //...
};

Pontos são o que esses parâmetros representam, mesmo se eles estiverem usando a classe Vector para fazer isso.

Steven Stadnicki
fonte
Eu daria um passo adiante e teria um typedef Vector Pointlugar em um cabeçalho que define pontos. Dessa forma, parece e se parece com um Point, ninguém fica coçando a cabeça ao usá-lo por que é chamado, Vectormas no lado interno é apenas uma base de código.
tpg2114
4

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).

MichaelHouse
fonte
As funções membro não são a única diferença entre pontos e vetores; assim como o wcomponente, que é crítico.
Kevintodisco
3

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.

Ken
fonte
2

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.

Eric B
fonte
2

Sim, não há problema em usar uma única Vectorclasse para definir pontos e vetores, desde que você garanta que o wcomponente 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 wcomponente de uma Vectorclasse bidimensional ou tridimensional é o que permite que o componente de conversão de uma matriz de transformação entre em vigor. Se wfor 1, a translação e a rotação serão aplicadas; se for 0, somente a rotação será aplicada.

Não ter o wcomponente de um conjunto de vetores 0pode voltar para morder você; isso leva a erros que são bastante difíceis de rastrear. Para ser seguro, você pode fazer uma Pointclasse que herda da Vectorclasse e explicitamente define wa 1, onde os Vectorpadrões de classe wa 0.

kevintodisco
fonte
2
Muitas classes de vetores não usam o componente w explicitamente; alguns a tratam como um elemento implícito ou têm o que equivale a uma classe 'ProjectiveVector' que a implementa, mas grande parte do código de um mecanismo (tudo fora da renderização, essencialmente) usa o vetor 3 'clássico' que carrega um componente aw é inteiramente supérfluo. Este é um detalhe de implementação, não uma parte essencial de vetores ou pontos.
Steven Stadnicki
@StevenStadnicki Isso é verdade, mas para que uma classe represente um ponto e um vetor, o wcomponente deve estar presente; caso contrário, não há como determinar como o objeto deve ser usado.
Kevintodisco
11
@ktodisco Acho que a maneira de determinar como deve ser usada é ver em que contexto está sendo usado.
JCM
11
Correu para fora de tempo para editar o comentário :( ia dizer que, se as partes do motor que utilizam a classe definir o contexto em que ele será usado, então ele funciona..
kevintodisco
2

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 Vector2classe em qualquer lugar em que você teria usado uma Pointclasse.

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:

   * Player (3,3)
  /
 /
. (0,0)

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:

             * (8, 2)
             |
     . (0,0) |
             |
             * (8, -2)

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 Vectorclasse em vez de uma Pointclasse. Essa é apenas uma maneira de pensar sobre essa situação que pode facilitar a decisão de como implementar essas idéias.

Kevin - Restabelecer Monica
fonte
O vetor como um deslocamento para outro ponto no espaço ainda deve ser pensado como um ponto em coordenadas relativas. Chamar isso de vetor é errado, no que diz respeito a um mecanismo de jogo.
Kevintodisco
0

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.

dreta
fonte
Os métodos estão sendo adicionados ao protótipo, portanto, isso não é um problema.
JCM