computational-geometry
全部标签 本帖引用:[1]http://www.mathworks.com/matlabcentral/newsreader/view_thread/278243“使C++对象在mex调用之间持久化,并且健壮。”[2]MATLABparforandC++classmexwrappers(copyconstructorrequired?)“MATLABparfor和C++类mex包装器(需要复制构造函数?)”我成功地实现了一个Matlab/C++接口(interface),基于[1]上提出的方法。无论如何,我在尝试将系统与Matlab并行计算一起使用时遇到了麻烦。在MEX接口(interface)
最近对的标准扫描线算法是众所周知的,如所述here,它使用扫描线水平扫描点集,仅保留当前点当前最佳距离内的点。通常,点最初必须按x坐标排序,边界框(在c++实现的情况下为std::set)必须按y坐标排序,如thisc++implementation中所示。.但是,在尝试实现时,我不小心忘记了按x坐标对点进行排序,而是按y坐标对它们进行了排序。令人惊讶的是,这似乎仍然有效。你可以看到我的实现here,它基本上遵循标准线扫描最近对算法的稍微修改版本:#include#include#include#include#includeusingnamespacestd;#definexseco
structRect{doubleleft,right,top,bottom;};std::vectorvec;现在我们有N(N>1000)个矩形,判断其中任意两个是否重叠的有效算法是什么?更新:所有这些矩形都平行于坐标系。 最佳答案 您可以用两个线段表示一个矩形:开线段(x1,y1)到(x1,y2)和闭线段(x2,y1)到(x2,y2),其中x1首先,我们可以在O(nlogn)时间内根据其x坐标对所有这些段进行排序。其次,我们逐个处理每个段,如果我们遇到一个开放段,我们将该段的interval(y1,y2)添加到intervalt
给定一个凸多面体,其顶点(x,y,z)指定多面体的面。如何计算多面体每个面的表面法线?我需要表面法线来计算顶点法线以执行Gouraudshading.关于如何做到这一点,我能找到的唯一线索是Newell的方法,但我如何确保法线是向外法线而不是向内法线?感谢您的帮助。 最佳答案 计算人脸法线您必须计算跨越包含给定面的平面的两个vector的叉积。它为您提供该面的(非单位)法vector。您必须对其进行规范化,然后就完成了。如果x0、x1、x2是三角形面的顶点,那么法线可以计算为vector3get_normal(vector3x0,v
我需要用C++绘制一个多边形。我在vector中设置随机点,然后通过线连接它们。但有时这些线相交,我会得到这样的结果。是否有任何公式或类似的东西,使线条不会交叉?部分代码如下:voiddraw_picture(Canvas&canvas){PairXYa,b,c,d,e;intk;vectorvertex;vertex.push_back(PairXY(drandom(k),drandom(k)));vertex.push_back(PairXY(drandom(k),drandom(k)));vertex.push_back(PairXY(drandom(k),drandom(k))
我有:-一组已知大小的点(在我的例子中,只有6个点)-以x=s+t*r为特征的线,其中x、s和r是3Dvector我需要找到最接近给定线的点。实际距离对我来说并不重要。我查看了几个看似相关的不同问题(包括this一个),并知道如何在我的高中数学课上解决这个问题。但是我无法在不计算每个距离的情况下找到解决方案,而且我确信必须有更好/更快的方法。性能在我的应用程序中绝对至关重要。还有一件事:所有数字都是整数(点的坐标以及s和rvector的元素)。同样,出于性能原因,我希望将float学运算保持在最低限度。 最佳答案 您必须至少处理每个
我正在尝试确定特定点是否位于多面体内部。在我当前的实现中,我正在研究的方法是寻找多面体的面数组(在本例中为三角形,但稍后可能是其他多边形)。我一直在尝试根据此处找到的信息进行工作:http://softsurfer.com/Archive/algorithm_0111/algorithm_0111.htm下面,您将看到我的“内部”方法。我知道nrml/normal有点奇怪……这是旧代码的结果。当我运行它时,无论我给它什么输入,它似乎总是返回true。(这已解决,请在下面查看我的回答——这段代码现在可以使用了)。boolContainer::inside(Point*point,floa
我正在尝试实现线平面相交算法。根据Wikipedia为此,我需要平面上的三个非共线点。因此我尝试实现thisalgorithm然而,在C++中。肯定有问题,因为我可以选择任何x和y坐标并且它们将适合平面是没有意义的。如果平面是垂直的并且沿x轴怎么办?y=1的点不会在平面上。我意识到这个问题已经在StackOverflow上发布了很多,而且我看到了很多解决方案,其中平面由3个点定义。但是我只有一个普通的和一个位置。在我整理出我的非共线点查找器之前,我无法测试我的线面相交算法。现在的问题是,我正在除以normal.z,当normal.z为0时,这显然不起作用。我正在测试这个平面:Plane
我正在尝试实现GrahamScan在C++中,但它不起作用,我找不到原因。任何线索将不胜感激。经过一些尝试后,似乎我总是有m_M=2并且这2个点是最高的y点,如果有帮助的话。通过叉积判断是右转还是左转。qrealInterpolation::ccw(QPointFpt1,QPointFpt2,QPointFpt3){return(pt2.x()-pt1.x())*(pt3.y()-pt1.y())-(pt2.y()-pt1.y())*(pt3.x()-pt1.x());}点积除以范数得到cos,因为对角度排序与对[0,Pi]中的cos排序相同。qrealInterpolation::d
为什么我在“BIO_flush(b64);”行收到警告消息“警告:未使用计算值”我怎样才能摆脱它?unsignedchar*my_base64(unsignedchar*input,intlength){BIO*bmem,*b64;BUF_MEM*bptr;b64=BIO_new(BIO_f_base64());bmem=BIO_new(BIO_s_mem());b64=BIO_push(b64,bmem);BIO_write(b64,input,length);BIO_flush(b64);BIO_get_mem_ptr(b64,&bptr);unsignedchar*buff=(u