小编teo*_*ron的帖子

C#复制将图像区域粘贴到另一个图像中

我正在尝试编写一个实用程序类,允许自动调整tiletale图像的大小.假设有一个srcBitmap,我从中复制一个由Rectangle srcRegion给出的区域.然后我想在目标区域Rectangle destRegion中将该区域粘贴(明智的像素)到另一个名为Bitmap destBitmap的图像中.我知道如何从源中获取区域并将其放入Bitmap对象中,但我还没有找到如何将Bitmap对象实际粘贴到另一个更大的Bitmap对象中的某个区域中.

有快速的方法吗?(没有GDI而没有深入研究位图的字节数组).这是应该澄清我的目标的片段

    private static void CopyRegionIntoImage(Bitmap srcBitmap, Rectangle srcRegion, Bitmap destBitmap, Rectangle destRegion)
    {
        // get the required region from the destination
        Bitmap region = Copy(srcBitmap, srcRegion);
    }
Run Code Online (Sandbox Code Playgroud)

c# image image-processing bitmapimage

16
推荐指数
1
解决办法
3万
查看次数

C++模板和静态成员 - 标题中的定义

考虑以下构造:

//! Templated singleton.
/*!
    Template wrapper enforcing the singleton behavior.
*/
template <class T>
class TSingleton
{
private:    
    //! Singleton instance pointer.
    static T* instance;
    //! private constructor.
    TSingleton() { }
    //! private empty copy constructor.
    TSingleton(const TSingleton<T>& sourceObject) {}

public:
    //! Static singleton instance getter.
    static T* GetInstance()
    {
        if (instance == 0)
            instance = new T();
        return instance;
    }

};

template <class T> T* TSingleton<T>::instance = 0;
Run Code Online (Sandbox Code Playgroud)

此模板类和静态实例的定义写在同一个头文件中.对于非模板类,由于为实例静态成员定义了多个符号,因此会导致链接时错误.对于模板来说,这似乎是直观的,因此必须将定义分开并将其放在.cpp文件中.但模板通常在类似头文件中声明和定义.是什么允许此语法对模板类有效且有效?

有关于此的维基百科链接,但它没有提供关于模板类的情况的明确解释.

c++ templates static-members

9
推荐指数
1
解决办法
1933
查看次数

包含指向对象的指针的STL堆

我有一个std::list<MyObject*> objectList容器,我需要在以下场景中进行排序和维护:

  • 每个对象都有一个提供成本的字段(例如浮点值).该成本值用于比较两个对象,就好像它们是浮点数一样
  • 必须订购(升序)集合,并且必须快速找到新插入元素的正确位置.
  • 可以删除最低元素(就成本而言),并且还可以更新几个任意定位元素的成本.然后必须尽快重新排序该列表,利用其已经排序的性质.

我可以使用任何其他stl容器/机制来允许三种行为属性吗?它几乎像一堆,我认为使用它make_heap可能是一个很好的方式来排序列表.我需要一个指针容器,因为有几个其他数据结构依赖于这些指针.

那么我怎么能选择一个更好的容器,它也是指针友好的,并允许通过查看指向类型的比较运算符进行排序?

澄清:我需要一个最适合该场景的stl容器,并且可以成功地包装指针或引用.(例如,我简要地读到std::set容器可能是一个很好的候选者,但我没有经验).

目前的实施,基于以下答案:

struct SHafleEdgeComparatorFunctor
    {
        bool operator()(SHEEdge* lhs, SHEEdge* rhs)
        {
            return (*lhs) < rhs;
        }
    };

std::multiset<SHEEdge*, SHafleEdgeComparatorFunctor>    m_edges;
Run Code Online (Sandbox Code Playgroud)

当然,SHEEdge数据结构有一个重载的运算符:

bool operator<(SHEEdge* rhs) 
    {
        return this->GetCollapseError() < rhs->GetCollapseError();
    }
Run Code Online (Sandbox Code Playgroud)

c++ stl data-structures

5
推荐指数
1
解决办法
821
查看次数

C++非多态接口

简单地说,如何在C++中为单级继承创建接口(出于简单和教学原因)?我看到一些代码没有使用多态,但基类包含一个虚拟抽象方法(virtual void TheMethod() = 0).

现在,一个类是使用纯虚方法从这个抽象类派生的,但是在后续代码中,派生类的实例在没有动态分配的情况下被使用.

这是正确的方法吗?使用多态设计推断出的开销是多少?

我认为这是不可能的..这看起来更像隐藏/重影基本方法,即使该方法是纯虚方法.

后来编辑:感谢所有设法提供一些好答案的人,我想强调一下由于使用"动态分配"而产生的一个严重错误,强调这个对象创建的可能性是唯一一个兼容多态的.很明显,使用这种运行时调用行为并不是唯一的方法(但也许是最常见的?),但为了进一步澄清我原来的问题:

有没有办法强制程序员在不使用纯虚方法的情况下实现方法?我可能没有道理的关注是,打开多态设计的大门是否在性能方面也有点沉重(每秒钟对讨论中的方法进行数千次这样的调用).

甚至稍后编辑:使基础具有受保护的构造函数意味着它不能直接实例化(除了使用工厂或其他友好方法),这可以解决补偿纯虚方法引起的影响之一.但是如何确保任何派生类仍然提供自己的方法实现?如果对相关vtable的夸大担忧实际上并不是那么重要,那么我将坚持使用纯虚方法(因为SFINAE,奇怪的重复模板模式更难以阅读和理解至少中级C++程序员 - 像我一样:)).

c++ polymorphism virtual inheritance

4
推荐指数
3
解决办法
2351
查看次数

使用整数的C++模板化数组运算符[]

我正在尝试操纵一个特殊的结构,我需要某种混合运算符.为此,有一个重载的数组[]运算符是有意义的,但我不想有任何分支,因为结构的特定规范允许理论上的解决方法.

目前,结构看起来像这样:

struct f32x4
{
    float fLow[2];
    float fHigh[2];

    f32x4(float a, float b, float c, float d)
    {
        fLow[0] = a; 
        fLow[1] = b;
        fHigh[0] = c;
        fHigh[1] = d;
    }

    // template with an int here?
    inline float& operator[] (int x) {
        if (x < 2)
            return fLow[x];
        else
            return fHigh[x - 2];
    }
};
Run Code Online (Sandbox Code Playgroud)

我可以/应该做些什么来避免分支?我的想法是使用带有整数参数的模板并定义特化,但目前尚不清楚它是否有意义以及该怪物的语法是什么样的.

在任何情况下,我都没有明确地使用float[4]数组来合并这两个(也没有联合技巧).如果你需要一个很好的理由,那是因为它float[2]实际上类似于平台特定的PowerPC配对单曲.普通的Windows编译器不适用于配对的单个,这就是我用float[2]s 替换代码的原因.

使用GreenHills编译器我得到这个程序集输出(这表明分支确实发生):

.LDW31:
00000050 80040000           89      lwz r0, 0(r4)
00000054 2c000000           90      cmpwi   r0, …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading swizzling

3
推荐指数
1
解决办法
207
查看次数

C++ safe alternative to dynamic_cast

In what scenarios can be reinterpret_cast used to cast from a base pointer that's actually a derived instance pointer? (via polymorphism).

Static casts do not work if the inheritance is polymorphic.

I considered this trivial scenario:

class A
{
public:
    virtual void Hello()
    {
        cout<<" A ";
    }
    virtual int GetType() { return 1; }
};

class B: public A
{
public:
    void Hello()
    {
        cout<< " B ";
    }
    void Do()
    {
        cout << " Another method of B"; …
Run Code Online (Sandbox Code Playgroud)

c++ casting

2
推荐指数
2
解决办法
2207
查看次数

C++ Windows CreateChildProcess - 隐藏/不显示子进程的控制台窗口

我需要创建一个子进程作为我的主进程的套接字侦听器/服务器,我使用此调用来实现目标:

bSuccess = CreateProcessA(NULL, 
            cmdLineArgs,   // command line 
            NULL,          // process security attributes 
            NULL,          // primary thread security attributes 
            TRUE,          // handles are inherited 
            HIGH_PRIORITY_CLASS,             // creation flags 
            NULL,          // use parent's environment 
            NULL,          // use parent's current directory 
            &siStartInfo,  // STARTUPINFO pointer 
            &piProcInfo);  // receives PROCESS_INFORMATION 
Run Code Online (Sandbox Code Playgroud)

任何人都可以说明需要做什么才能让子进程的窗口不显示?每次主要的中央进程创建子进程时,都不希望有一个可见的进程窗口.

编辑的后期编辑:

HWND hWnd = GetConsoleWindow();
if (hWnd != 0) 
{       
    ShowWindow( hWnd, SW_HIDE);
}
Run Code Online (Sandbox Code Playgroud)

在子进程主函数中,但这并不是最好的解决方案,因为窗口仍然会显示几分之一秒.如果有一个子进程,每个进程都有自己的窗口冒泡到屏幕上,它仍然不优雅.是否有任何标志要为编译器设置以产生"无控制台"输出?

我正在使用Visual Studio 2010.

c++ windows console process

2
推荐指数
1
解决办法
1921
查看次数

WPF拦截模态窗口外的点击

是否可以检查用户何时在模态窗口外单击?我想以某种方式绕过模态逻辑,因为如果窗口没有显示为模态,它将不会显示在活动窗口的顶部,而且,目前,这是正确显示它的唯一方法.我还没有找到合适的方法(因为"停用"事件将不再被触发..)

c# wpf c++-cli

1
推荐指数
1
解决办法
4509
查看次数

C++指向非静态方法的有用性

正如我理解非静态方法的指针,它们对于为某种方法提供别名机制没有用处.例如,拥有一个具有三种方法的对象

 class Provider
 {
 public:
 int A(int in);
 int B(int in);
 int C(int in);
 }
Run Code Online (Sandbox Code Playgroud)

和需要指向提供者方法指针的消费者(无论是A,B还是C).有一个控制器向所谓的消费者提供指向3种方法之一的指针,我们可以在使用Provider实例的消费者代码中编写一些东西,并指向A,B或C,这取决于控制器发送的内容.

如果这是C++中非静态方法的指针所能做到的,是否还有一种方法可以为对象的方法提供更"智能"的指针,而无需将对象与该方法指针一起发送给消费者?在肯定的情况下,所谓的成语/机制是什么(甚至一种模拟这种方式的资格作为我感兴趣的答案).

c++ design-patterns idioms

1
推荐指数
1
解决办法
374
查看次数

C++ 特征矩阵运算与内存分配性能

我有一个算法,需要在函数内构建 NxN 矩阵,该函数将返回该矩阵与同样动态构建的 Nx1 向量的乘积。(N 通常为 8 或 9,但对于大于该值的值必须进行概括)。

我正在使用 Eigen 库来执行更复杂的代数运算(最小二乘和其他几个约束问题),因此不能选择切换它。

我对这些函数进行了基准测试,由于密集的内存分配,存在巨大的瓶颈。我的目标是构建一个线程安全的应用程序,因此,在某些情况下,我将这些矩阵和向量替换为对全局向量中元素的引用,该全局向量充当无法存储在堆栈上的对象的提供者。这避免了调用特征矩阵和向量的构造函数/析构函数,但这不是一个优雅的解决方案,如果不小心的话,可能会导致巨大的问题。

因此,Eigen 是否提供了一种解决方法,因为我没有看到将分配器作为这些对象的模板参数传递的选项,或者是否有更明显的事情要做?

c++ performance memory-management matrix eigen

1
推荐指数
1
解决办法
4361
查看次数

GLSL和glBegin(GL_TRIANGLES)不起作用

此代码仅呈现十二面体并完全忽略该glBegin(GL_TRIANGLES)块:

glutSolidDodecahedron();
glBegin(GL_TRIANGLES);
glNormal3f(1, 0, 0);
glVertex3f(11, 0, 0);
glNormal3f(0, 1, 1);
glVertex3f(-11, 0, 0);
glNormal3f(0, 0, 1);
glVertex3f(0, 0, 11);
glEnd();
Run Code Online (Sandbox Code Playgroud)

这两个着色器非常简单:

顶点着色器:

varying vec3 normal;
void main()
{   
gl_Position = ftransform();
gl_FrontColor = gl_Color;
gl_BackColor = gl_Color;
normal =  gl_Normal;
normal = gl_NormalMatrix  * normal;
}
Run Code Online (Sandbox Code Playgroud)

和碎片:

uniform vec3 lightDir;
varying vec3 normal;
void main()
{
    float intensity = dot(lightDir, normal);
    gl_FragColor =  0.5 * (1.5 + intensity) * gl_Color;
}
Run Code Online (Sandbox Code Playgroud)

虽然glutSolidX函数类型适用于此示例(基于Lightouse3D教程),但如何快速绘制三角形,从一帧到另一帧更改坐标(我尝试了数组和GL_DYNAMIC_DRAW,但与旧的"固定管道"相比,这工作太多了"方法".我看到其他人仍然 …

c++ opengl glsl

0
推荐指数
1
解决办法
2505
查看次数