Как вернуть значение y из 1-го массива вектора 3 - PullRequest
1 голос
/ 15 мая 2011

У меня есть вектор 3 (x, y, z) 1D динамический массив, полный позиций вершин.

Как бы я возвратил значение y по заданной координате x и z?

Edit :: Извините за недостаток деталей.

Я использую c ++, компилирую в Visual Studio 2008. Вектор - это векторный класс, хранящий 3 значения с плавающей точкой, определяющие переменные x, y и z, он используется дляposition.

Это как массив Vector3 *;

array = new Vector3 [100];

В массив добавляется множество позиционных значений.

Когда вы обращаетесь к члену массива для определенного значения, это похоже на

array [0] .y

Но я хочу найти значение y, которое соответствует определенным x и z

как

GetY (с плавающей запятой x, с плавающей запятой z)

...

return y;

Ответы [ 5 ]

4 голосов
/ 15 мая 2011

Полагаю, у вас есть что-то вроде

struct Vec3D{
  float x, y, z;
};

Vec3D vec3d_arr[20];

Затем, чтобы получить то, что вы хотите, вам нужно будет перебрать массив.

float GetYforXZ(Vec3D* arr, unsigned int length, float x_val, float z_val){
  for(unsigned i=0; i < length; ++i){
    if(arr[i].x == x_val && arr[i].z == z_val)
      return arr[i].y;
  }
}

int main(){
  Vec3D arr[20];

  // init arr

  float y = GetYforXZ(arr,20,15.4f,23.3f);
}

Редактировать : На ваш комментарий:

#include <map>
#include <math>
using namespace std;

struct Vec3D{
  float x, y, z;
};

const float float_eps = 1e-5;

struct float_wrapper{
    float _value;

    float_wrapper()
        : _value(0.0f) {}

    float_wrapper& operator=(float f){
        _value = f;
        return *this;
    }

    operator float() const{
        return _value;
    }
};

bool operator==(float_wrapper const& lhs, float_wrapper const& rhs){
    float tmp = fabs(lhs._value - rhs._value);
    return tmp < float_eps && tmp >= 0;
}

bool operator<(float_wrapper const& lhs, float_wrapper const& rhs){
    return lhs._value < rhs._value;
}

typedef map< float_wrapper,float_wrapper > zy_map;
typedef map< float_wrapper,zy_map > xzy_map;

void init_vertex_mapping(xzy_map& a_map, Vec3D* arr, size_t length){
  for(size_t i=0; i < length; ++i){
    Vec3D& vertex = arr[i];
    zy_map& zy = a_map[vertex.x];
    zy[vertex.z] = vertex.y;
  }
}

int main(){
  xzy_map vertex_map;
  Vec3D vertex_array[100] = { {0,0,0},{0,0,0},{0,0,0},{-3.14f,42.0f,-13.37f},{0,0,0} };

  init_vertex_mapping(vertex_map, vertex_array, 100);

  float y = vertex_map[-3.14f][-13.37f];
}

Хотя проблема, которую я забыл, заключается в неточности float s, поэтому, возможно, у вас возникнут проблемы с картой. Прокомментируйте, если вы делаете. :)


Редактировать : Добавлена ​​более безопасная версия, использующая float_wrapper.

1 голос
/ 15 мая 2011

Вам просто нужно найти в вашем массиве элемент вектора с заданными координатами x и z и получить соответствующее значение y этого элемента.

0 голосов
/ 15 мая 2011

Как вам этот код:

#include <iostream>
#include <algorithm>

using namespace std;

class Vector3
{
public:
    int x;
    int y;
    int z;

    enum SearchType
    {
        XY, YZ, XZ
    };

    static SearchType searchType;

    Vector3(int x = 0, int y = 0, int z = 0)
        : x(x), y(y), z(z)
    {
    }

    bool operator == (const Vector3 & vec)
    {
        switch(searchType)
        {
            case XY: return (x == vec.x) && (y == vec.y);
            case YZ: return (y == vec.y) && (z == vec.z);
            case XZ: return (x == vec.x) && (z == vec.z);
        }
        return false;
    }
};

Vector3::SearchType Vector3::searchType = XY;

int main()
{
    Vector3 * array = new Vector3 [100];

    array[57].x = 5;
    array[57].y = 100;
    array[57].z = 6;

    Vector3::searchType = Vector3::XZ; // Specify find type as "XZ"
    Vector3 * vec = std::find(array, array+100, Vector3(5,0,6));

    if (vec != array+100)
    {
        cout << "Value for X == 5 and Z == 6 is in "
             << (vec-array) << " item and it eq " << (*vec).y;
    }
}
0 голосов
/ 15 мая 2011

Пожалуйста, НИКОГДА НИКОГДА не выполняйте поиск по несортированному массиву / вектору.Даже если сегодня в нем всего 100 элементов, завтра оно может стать 100000.Взгляните на Алгоритм сортировки вики , некоторые из них легко понять и реализовать.Затем посмотрите на Wiki Binary search .Я бы начал с быстрой сортировки, которая также дает вам хорошее представление о том, как работает бинарный поиск.Поверьте, вы поблагодарите меня позже.

0 голосов
/ 15 мая 2011

Если вы имеете в виду, что ваш вектор что-то вроде float vector[3];, тогда vector[1] ссылается на второе значение в массиве, которое называется вашей координатой Y вектора.

...