I have a vector 3 (x,y,z) 1D dynamic array full of vertex positions.
我有一个向量3(x,y,z)1D动态阵列充满顶点位置。
How would I return the y value at a given x and z coordinate?
如何在给定的x和z坐标处返回y值?
Edit:: Sorry about the lack of detail.
编辑::抱歉缺乏细节。
I am using c++, compiling in Visual Studio 2008. The vector is a vector class storing 3 float values defining an x, y and z variable, it is used for position.
我正在使用c ++,在Visual Studio 2008中进行编译。向量是一个向量类,存储3个定义x,y和z变量的浮点值,它用于位置。
It's like Vector3 *array;
它就像Vector3 *数组;
array = new Vector3[100];
array = new Vector3 [100];
Lots of positional values are added to the array.
大量的位置值被添加到数组中。
When you access a member of the array for a specific value it's like
当您访问数组的成员以获取特定值时,它就像
array[0].y
But I want to find a the y value that corresponds to a specific x and z
但我想找到一个对应于特定x和z的y值
like
GetY(float x, float z)
GetY(float x,float z)
...
return y;
5 个解决方案
#1
4
I suppose you have something like
我想你有类似的东西
struct Vec3D{
float x, y, z;
};
Vec3D vec3d_arr[20];
Then, to get what you want, you'll need to iterate over the array.
然后,为了获得你想要的东西,你需要迭代数组。
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);
}
Edit: On your comment:
编辑:在你的评论:
#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];
}
Though a problem that I forgot is the inaccuracy of float
s, so maybe you get problems with the map. Comment back if you do. :)
虽然我忘记的一个问题是花车的不准确性,所以也许你会遇到地图问题。如果你这样做,请回复。 :)
Edit: Added a more safe version, employing a float_wrapper
.
编辑:使用float_wrapper添加了更安全的版本。
#2
1
You just have to search your array for the vector element with the given x and z coordinates and the get this element's corresponding y value.
您只需要在数组中搜索具有给定x和z坐标的向量元素,并获取此元素的相应y值。
#3
0
If you mean, that your vector is something like float vector[3];
then vector[1]
references the second value in the array, said your Y coordinate of the vector.
如果你的意思是,你的向量就像浮动向量[3];然后vector [1]引用数组中的第二个值,表示向量的Y坐标。
#4
0
How do you like this code:
你喜欢这段代码:
#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;
}
}
#5
-1
Please, NEVER EVER perform a search on an unsorted array/vector. Even if it has only 100 elements today, it might become 100000 tomorrow. Take a look at Wiki Sorting Algorithm, some of them are easy to understand and implement. Then look at Wiki Binary search. I would start with quick sort, which also gives you a good idea how binary search works. Believe me, you will thank me later.
请永远不要在未排序的数组/向量上执行搜索。即使它今天只有100个元素,它明天可能会变成100000个。看看Wiki排序算法,其中一些很容易理解和实现。然后看看Wiki Binary搜索。我将从快速排序开始,这也让您了解二进制搜索的工作原理。相信我,你以后会感谢我。
#1
4
I suppose you have something like
我想你有类似的东西
struct Vec3D{
float x, y, z;
};
Vec3D vec3d_arr[20];
Then, to get what you want, you'll need to iterate over the array.
然后,为了获得你想要的东西,你需要迭代数组。
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);
}
Edit: On your comment:
编辑:在你的评论:
#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];
}
Though a problem that I forgot is the inaccuracy of float
s, so maybe you get problems with the map. Comment back if you do. :)
虽然我忘记的一个问题是花车的不准确性,所以也许你会遇到地图问题。如果你这样做,请回复。 :)
Edit: Added a more safe version, employing a float_wrapper
.
编辑:使用float_wrapper添加了更安全的版本。
#2
1
You just have to search your array for the vector element with the given x and z coordinates and the get this element's corresponding y value.
您只需要在数组中搜索具有给定x和z坐标的向量元素,并获取此元素的相应y值。
#3
0
If you mean, that your vector is something like float vector[3];
then vector[1]
references the second value in the array, said your Y coordinate of the vector.
如果你的意思是,你的向量就像浮动向量[3];然后vector [1]引用数组中的第二个值,表示向量的Y坐标。
#4
0
How do you like this code:
你喜欢这段代码:
#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;
}
}
#5
-1
Please, NEVER EVER perform a search on an unsorted array/vector. Even if it has only 100 elements today, it might become 100000 tomorrow. Take a look at Wiki Sorting Algorithm, some of them are easy to understand and implement. Then look at Wiki Binary search. I would start with quick sort, which also gives you a good idea how binary search works. Believe me, you will thank me later.
请永远不要在未排序的数组/向量上执行搜索。即使它今天只有100个元素,它明天可能会变成100000个。看看Wiki排序算法,其中一些很容易理解和实现。然后看看Wiki Binary搜索。我将从快速排序开始,这也让您了解二进制搜索的工作原理。相信我,你以后会感谢我。