所以我有一个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
有什么建议吗?
答案 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