试图从Cinder中找出Vec2类

时间:2012-11-09 20:45:04

标签: c++ casting cinder

所以我有一个Node类,它包含一个成员变量“center”,它是一个Vec2float *。这是因为我想使用drawSolidCircle函数,我需要一个Vec2float变量来表示中心。我的一个问题是Vec2float是一个向量,还是一个空间中的点?许多成员函数使它听起来像某种向量类,但是set()函数只接受两个参数,这使得它看起来像是空间中的一个点,并且为了画一个圆,你需要一个点和半径,而不是矢量。另外我遇到的另一个问题是,如果有人给我2个双打,我怎么能正确地将它们转换为Vec2float并设置中心的x和y(如果它甚至有x和y)。因此,例如在下面的函数中,我得到一个条目数组及其长度'n'。一个条目有两个成员变量'x'和& 'y'都是双打。我想创建一个节点数组并复制该数据以使用它来绘制圆圈。

cinder::Vec2<float>* center;//in my Node class

void function::build(Entry* c, int n) {
Node* nd = new Node[n];
for(int i = 0;i<n;i++) {
    nd[i].center = //what goes here if c[i].x and c[i].y are doubles?
}

的引用: Vec2课程:http://libcinder.org/docs/v0.8.4/classcinder_1_1_vec2.html 绘制形状的函数列表,我使用drawSolidCircle:http://libcinder.org/docs/v0.8.4/namespacecinder_1_1gl.html

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

为了让您的生活更轻松,您可以使用cinder命名空间。在文件顶部的包含后添加以下行。

using namespace ci;

然后您可以简单地编写,例如:

Vec2f center(1.5f, 1.5f);
std::cout << center << std::endl;

事实上,Vec2<float>在Cinder中的typedef被称为Vec2f

另外,你不应该将双打投射到花车中,因为它们是隐式投射的,只是将它们传递进来!

最后,你必须小心指针。大多数情况下,如果我想要一个对象数组,我会使用std::vector,并使用shared_ptr。在这里,我学习了如何做到这一点:https://forum.libcinder.org/topic/efficiency-vector-of-pointers

我不会涵盖矢量背后的整个理论。这里有一个很好的参考(使用处理语言):http://natureofcode.com/book/chapter-1-vectors/简而言之,是的,您应该使用它们来存储位置,但在数学上它们仍然是向量(您可以将位置向量视为来自的箭头原点(0,0)到你当前的位置。

我还建议您查看随图书馆提供的大量样本。

答案 1 :(得分:0)

好吧,我想出了一些东西,它现在编译,它是否适用于我的程序在未来是有争议的。但这就是我所做的:

float f1 = (float)(c[i].x);
float f2 = (float)(c[i].y);
cinder::Vec2<float>* p = new cinder::Vec2<float>(f1,f2);
nd[i].center = p;

我将双打单独转换为浮点数,然后使用Vec2构造函数创建变量p,然后将center设置为等于该值。就像我说它编译,我们将看看它是否有效:D