是否有一个很好的鲁棒算法来计算凸多边形的法向量(当然,在3D中)?对于三角形,很容易:一个取三角形的两个边并计算叉积:
vec3 u = point[0] - point[1], v = point[0] - point[2];
vec3 n = normalize(cross(u, v));
Run Code Online (Sandbox Code Playgroud)
但是这种方法并没有真正扩展到多边形.多边形的某些边缘可能几乎或"完全"共线(这通常发生在发生T形连接的网格中),因此有必要选择一对边,给出"强"法线(两条边都是"足够长"并且它们保持"几乎垂直"的角度).
但是,这种方法仍然不适用于所有多边形.想象一下圆盘形状的多边形.如果细分非常精细,则无论光盘的半径如何,所有边缘都将非常短并且所有连续边缘将几乎共线.与此同时,正常情况非常明确.
一种解决方案可能是找到最大的内切三角形并计算其正常值.然而,发现它将具有复杂性O(n^2),这似乎令人望而却步.
给定所有多边形点,而不仅仅是三个或四个,更好的解决方案是使用SVD或特征值分解来计算法线.
这有标准算法吗?任何人都有一个很好的方法吗?
我很惊讶类型衰减在SO或其他地方没有得到很好的解释,也许我没有使用正确的术语进行搜索,或者我可能没有正确理解整个事情.我的问题是:它是什么,它是如何(为什么)到达那里以及它的规则是什么?
如果你想知道我为什么问,下面是我的啜泣类型衰变故事(不是问题的主题):
我最近在努力学习一些简单的模板,我想做这样的事情:
template <class FunObj>
double DoStuff(FunObj fob) // note that this returns double, not FunObj, as e.g. std::for_each() does
{ /* ... */ }
struct MyFunObj {
mutable size_t num_invoked; // collect usage statistics
MyFunObj()
:num_invoked(0)
{}
bool operator ()(double some_arg) const
{
++ num_invoked;
return sin(some_arg) < .5;
}
};
Run Code Online (Sandbox Code Playgroud)
这很好,有一个期望函数对象的模板函数和一个函数对象.该函数被设计为不返回函数对象的状态(因为类似的函数经常这样做;它返回了一些复杂计算的结果),所以我认为我会把它专门用于对象的引用.但类型衰减阻碍了(或者至少是我对它的理解):
MyFunObj fob;
DoStuff(fob); // passed by value, usage statistics are lost (no surprise here)
MyFunObj &ref = fob;
DoStuff(ref); // MyFunObj& …Run Code Online (Sandbox Code Playgroud) 我知道如何对一对矢量进行排序,但是你如何对一对矢量进行排序?我可以考虑在一对向量上编写一个自定义的"虚拟"迭代器并对其进行排序,但这看起来非常复杂.有没有更简单的方法?C++ 03中有一个吗?我想用std::sort.
当处理在硬件中生成的一些数据时出现这个问题,其中一对数组比对数组更有意义(从那时起会出现各种步幅和对齐问题).我意识到,否则保持一对向量而不是对的向量将是一个设计缺陷(数组问题的结构).我正在寻找一个快速的解决方案,将数据复制到成对的向量然后返回(我将它返回到HW以进行更多处理)不是一个选项.
例:
keys = {5, 2, 3, 1, 4}
values = {a, b, d, e, c}
Run Code Online (Sandbox Code Playgroud)
排序后(通过第一个向量):
keys = {1, 2, 3, 4, 5}
values = {e, b, d, c, a}
Run Code Online (Sandbox Code Playgroud)
我将"一对矢量"称为一对keys和values(存储为例如std::pair<std::vector<size_t>, std::vector<double> >).矢量具有相同的长度.
我遇到了问题cv::imshow.对于我的图像尺寸,它通常消耗大约1-2毫秒的处理时间,但在我的处理管道中的某个时刻,对于相同类型的图像,它使用4-8毫秒.
我有一个方法
void Tool::displayImage()
{
startTimeMeasure();
cv::imshow("output",image);
evaluateTimeMeasure();
}
Run Code Online (Sandbox Code Playgroud)
image是一个成员变量,highgui窗口是在其他地方创建的.时间测量与boost::posix_time ptime和time_duration.
cvStartWindowThread();
Run Code Online (Sandbox Code Playgroud)
被称为.
关键是,如果displayImage()在复杂的处理链中调用(从视频文件加载图像,某些预处理等),则cv::imshow变得非常慢,而在"暂停"视频中调用以重绘更新的图像的速度非常快.
如果我cv::waitKey(10)在时间测量开始之前添加一个cv::imshow,也变得快速.所以可能会有一些(gui?)需要处理哪些块cv::imshow?cv::waitKey(40)在循环中的单独线程中调用,等待键盘输入来控制(例如暂停/恢复)视频.据我所知,cv::imshow是在某种cv::waitKey时间段处理的队列中执行的?!?在哪里可以找到有关在此期间执行的所有任务的信息?也许我可以重新安排我的代码的某些部分(现在真的很复杂),以便一直保持更快imshow.
那么在一个cv::imshow调用中会发生什么,以及在不同情况下同一个调用缓慢/快速执行的原因是什么?
编辑:在"暂停"模式下我在常规执行和处理之间识别的一个区别是,在暂停模式下,该方法是从绑定的鼠标回调函数(来自windowThread?中)启动的,而在常规模式下,它是从主处理线程启动的.
我有一个三个浮点值的数组,我想按升序对它们进行排序(尽管任何排序算法的顺序都可以很容易地反转).调用std :: sort似乎有点矫枉过正:
float values[3] = {...};
std::sort(values, values + 3);
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
float sorted[3] = {min(values), values[0] + values[1] + values[2] -
min(values) - max(values), max(values)};
Run Code Online (Sandbox Code Playgroud)
但这看起来很丑陋.添加和减去数字也可以改变中间排序元素的值.并且它不容易就地工作.也很有趣:
float sorted[3];
/*for(int i = 0; i < 3; ++ i) { // unroll
sorted[(values[i] > values[0]) + (values[i] > values[1]) +
(values[i] > values[2])] = values[i];
}*/ // this is broken, does not work if two or all values are equal
sorted[(values[0] > values[1]) + (values[0] > values[2])] = values[0];
sorted[(values[1] >= …Run Code Online (Sandbox Code Playgroud) 是否有一种有效的算法(在大O表示法方面有效)来找到交换数量以将置换P转换为身份置换I?交换不需要在相邻元素上,而是在任何元素上.
例如:
I = {0, 1, 2, 3, 4, 5}, number of swaps is 0
P = {0, 1, 5, 3, 4, 2}, number of swaps is 1 (2 and 5)
P = {4, 1, 3, 5, 0, 2}, number of swaps is 3 (2 with 5, 3 with 5, 4 with 0)
Run Code Online (Sandbox Code Playgroud)
一个想法是编写这样的算法:
int count = 0;
for(int i = 0; i < n; ++ i) {
for(; P[i] != i; ++ count) { // could be permuted multiple …Run Code Online (Sandbox Code Playgroud) 我有文件写的用户名,IP和密码必须是const char*,当我把变量输入const char,我收到此错误信息.
这是我的代码:
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <windows.h>
using namespace std;
typedef int (__cdecl *MYPROC)(LPWSTR);
int main()
{
HINSTANCE hinstDLL;
MYPROC ProcAdd;
hinstDLL = LoadLibrary("LmServerAPI.dll");
if(hinstDLL != NULL){
ProcAdd = (MYPROC) GetProcAddress(hinstDLL,"LmServer_Login");
if(ProcAdd != NULL){
const char* IP = "xxx.177.xxx.23";
const char* name = "username";
const char* pass = "password";
int port = 888;
ProcAdd(IP,port,name,pass);
system ("pause");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
const char*' to在参数传递中无法转换WCHAR*'
我必须使用哪种变量用于这些参数以及如何使用?
我的库有一个非常简单的Main.cpp文件示例,我有一个教程页面.该页面看起来像这样:
/**
* @page simpleexample Simple Example
*
* This example shows basic use. It is in \ref simple_example/Main.cpp.
*
* And this is the description of the example.
*/
Run Code Online (Sandbox Code Playgroud)
现在它做的是它simple_example/Main.cpp通过指向该文件文档的链接替换引用.我希望它直接转到带注释的源代码.
有没有办法在不完全禁用每个文件的情况下执行此操作?我想拥有它,但我不喜欢人们需要单击Main.cpp链接,然后再单击Go to the source code of this file.内部链接.我不太关心文件部分中的链接如何表现,尽管我宁愿让它们转到文件文档,就像默认情况下那样.
我不想在教程页面中使用\example任何一个包含源代码,因为它已经存在于单独解释的小部分中.
如何在am-charts中删除侧刻度轴.例如.在这个小提琴我想删除顶部鳞片和左鳞片.我需要操纵什么属性或方法.
演示图表. http://jsfiddle.net/JSTQW/
目前,我使用此代码绘制图表:
chart = new AmCharts.AmSerialChart();
chart.dataProvider = chartData1; //data provider for chart
chart.categoryField = "year"; //this is the side category year field
chart.startDuration = 1; //this is the chart plotting time
chart.plotAreaBorderColor = "#ffffff"; //side div rectangular border
chart.plotAreaBorderAlpha = 15;
// this single line makes the chart a bar chart
chart.rotate = true;
chart.columnWidth=0.2;
// AXES
// Category
var categoryAxis = chart.categoryAxis;
categoryAxis.gridPosition = "start";
categoryAxis.gridAlpha = 0.1;
categoryAxis.axisAlpha = 0;
// Value
var valueAxis = …Run Code Online (Sandbox Code Playgroud) 我正在使用spring 4和hibernate 4来上传数据库并从中检索图像.我已将多部分图像转换为字节数组并存储在数据库中.我的查询是如何从数据库中检索该图像并在jsp中显示字节数组而不将其存储在本地系统中.